diff --git a/Assets/Resources/Prefabs/UI/List/TreeList.prefab b/Assets/Resources/Prefabs/UI/List/TreeList.prefab index ba1a3ab1..5755ce5f 100644 --- a/Assets/Resources/Prefabs/UI/List/TreeList.prefab +++ b/Assets/Resources/Prefabs/UI/List/TreeList.prefab @@ -1,6 +1,6 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: ---- !u!1 &155533778929081386 +--- !u!1 &1462360020605571893 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8,545 +8,52 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 8994610988129793201} - - component: {fileID: 1056715493304856023} - - component: {fileID: 1268756376114614541} - - component: {fileID: 8002563551903510981} + - component: {fileID: 1022765863909309765} + - component: {fileID: 2951520196524031467} + - component: {fileID: 2289736159566368719} + - component: {fileID: 6025781672912143612} m_Layer: 5 - m_Name: removeTextButton + m_Name: Scrollbar Horizontal m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &8994610988129793201 +--- !u!224 &1022765863909309765 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 155533778929081386} + m_GameObject: {fileID: 1462360020605571893} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1661139593473125497} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 24, y: 16} - m_Pivot: {x: 1, y: 0.5} ---- !u!222 &1056715493304856023 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 155533778929081386} - m_CullTransparentMesh: 1 ---- !u!114 &1268756376114614541 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 155533778929081386} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.8, g: 0.8, b: 0.8, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 17863240a1386604e8c74d85d4a95818, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!114 &8002563551903510981 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 155533778929081386} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 0.8, g: 0.8, b: 0.8, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 1, g: 1, b: 1, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.8, g: 0.8, b: 0.8, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1268756376114614541} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 0} - m_TargetAssemblyTypeName: UVC.UI.List.ComponentList.ComponentList, Assembly-CSharp - m_MethodName: OnClickClearText - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 ---- !u!1 &261240731796464661 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4799855768651686507} - - component: {fileID: 926843166612239537} - - component: {fileID: 3047408605536893539} - - component: {fileID: 8088258813693569027} - m_Layer: 5 - m_Name: Placeholder - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &4799855768651686507 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 261240731796464661} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 6430955701886727832} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -10, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &926843166612239537 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 261240731796464661} - m_CullTransparentMesh: 1 ---- !u!114 &3047408605536893539 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 261240731796464661} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: "\uAC80\uC0C9" - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 2c77cc500db5adc499bfa50030f7e8c2, type: 2} - m_sharedMaterial: {fileID: -2285177295282439072, guid: 2c77cc500db5adc499bfa50030f7e8c2, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4288716960 - m_fontColor: {r: 0.627451, g: 0.627451, b: 0.627451, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 13 - m_fontSizeBase: 13 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 2 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_TextWrappingMode: 0 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 0 - m_ActiveFontFeatures: 6e72656b - m_enableExtraPadding: 1 - checkPaddingRequired: 0 - m_isRichText: 1 - m_EmojiFallbackSupport: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!114 &8088258813693569027 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 261240731796464661} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 1 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: -1 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 ---- !u!1 &590764720580716476 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5613474474329381979} - - component: {fileID: 6955663649739003543} - - component: {fileID: 7985561521833800352} - m_Layer: 5 - m_Name: Handle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &5613474474329381979 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 590764720580716476} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 161416004204927197} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &6955663649739003543 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 590764720580716476} - m_CullTransparentMesh: 0 ---- !u!114 &7985561521833800352 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 590764720580716476} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.2, g: 0.2, b: 0.2, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!1 &1092229779674337045 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1697446796394887609} - - component: {fileID: 6940096492033927365} - - component: {fileID: 2424698233555359630} - m_Layer: 5 - m_Name: Handle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1697446796394887609 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1092229779674337045} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1072136122685428223} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &6940096492033927365 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1092229779674337045} - m_CullTransparentMesh: 0 ---- !u!114 &2424698233555359630 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1092229779674337045} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.2, g: 0.2, b: 0.2, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!1 &2651864206743669424 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6567388883908861155} - - component: {fileID: 4160214132252070715} - m_Layer: 5 - m_Name: TreeList - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &6567388883908861155 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2651864206743669424} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 1661139593473125497} - - {fileID: 9209122612970100190} - m_Father: {fileID: 0} + - {fileID: 3097322909638401089} + m_Father: {fileID: 8894486403032071402} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -40} - m_SizeDelta: {x: 0, y: -40} - m_Pivot: {x: 0, y: 1} ---- !u!114 &4160214132252070715 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2651864206743669424} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7be08eb56899e2042811c8d1da0924a6, type: 3} - m_Name: - m_EditorClassIdentifier: - itemPrefab: {fileID: 4190301731963491743, guid: 3b667b13f22b81b4896e14bd416de1f7, type: 3} - root: {fileID: 6986221832819843173} - allowMultipleSelection: 1 - enableDragDrop: 1 ---- !u!1 &4144761513685641481 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7793457982563150253} - - component: {fileID: 5637219084019760396} - - component: {fileID: 1413492220820647664} - - component: {fileID: 505480948637281615} - m_Layer: 5 - m_Name: Scrollbar Vertical - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &7793457982563150253 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4144761513685641481} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 161416004204927197} - m_Father: {fileID: 9209122612970100190} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 0} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 5, y: 0} - m_Pivot: {x: 1, y: 1} ---- !u!222 &5637219084019760396 + m_SizeDelta: {x: 0, y: 5} + m_Pivot: {x: 0, y: 0} +--- !u!222 &2951520196524031467 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4144761513685641481} - m_CullTransparentMesh: 0 ---- !u!114 &1413492220820647664 + m_GameObject: {fileID: 1462360020605571893} + m_CullTransparentMesh: 1 +--- !u!114 &2289736159566368719 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4144761513685641481} + m_GameObject: {fileID: 1462360020605571893} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -570,13 +77,175 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!114 &505480948637281615 +--- !u!114 &6025781672912143612 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4144761513685641481} + m_GameObject: {fileID: 1462360020605571893} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2680734087760533677} + m_HandleRect: {fileID: 6081086258189437538} + m_Direction: 0 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &1572880287690542826 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3301928374361144381} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3301928374361144381 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1572880287690542826} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6234462523872176539} + m_Father: {fileID: 5780838202259870402} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1848783212353540151 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5780838202259870402} + - component: {fileID: 2689031090661273458} + - component: {fileID: 4121319568877025449} + - component: {fileID: 4856300785373777908} + m_Layer: 5 + m_Name: Scrollbar Vertical + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5780838202259870402 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1848783212353540151} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3301928374361144381} + m_Father: {fileID: 8894486403032071402} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 5, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!222 &2689031090661273458 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1848783212353540151} + m_CullTransparentMesh: 0 +--- !u!114 &4121319568877025449 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1848783212353540151} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.09411765, g: 0.09411765, b: 0.09411765, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4856300785373777908 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1848783212353540151} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} @@ -610,8 +279,8 @@ MonoBehaviour: m_SelectedTrigger: Highlighted m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 7985561521833800352} - m_HandleRect: {fileID: 5613474474329381979} + m_TargetGraphic: {fileID: 7428146289359687929} + m_HandleRect: {fileID: 6234462523872176539} m_Direction: 2 m_Value: 0 m_Size: 1 @@ -619,7 +288,7 @@ MonoBehaviour: m_OnValueChanged: m_PersistentCalls: m_Calls: [] ---- !u!1 &5230957332517017859 +--- !u!1 &3011982018749398316 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -627,216 +296,71 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1072136122685428223} + - component: {fileID: 8894486403032071402} + - component: {fileID: 9000987459549261387} + - component: {fileID: 4415661564241239138} + - component: {fileID: 2006518343008415563} + - component: {fileID: 5742779717166474465} m_Layer: 5 - m_Name: Sliding Area + m_Name: TreeList m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1072136122685428223 +--- !u!224 &8894486403032071402 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5230957332517017859} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 3011982018749398316} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 1697446796394887609} - m_Father: {fileID: 9168450267583407812} + - {fileID: 3974886479277341081} + - {fileID: 5780838202259870402} + - {fileID: 1022765863909309765} + m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -20, y: -20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &5434636498674400270 -GameObject: + m_AnchoredPosition: {x: 0, y: -76} + m_SizeDelta: {x: 0, y: -76} + m_Pivot: {x: 0, y: 1} +--- !u!114 &9000987459549261387 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 9168450267583407812} - - component: {fileID: 752456552382603827} - - component: {fileID: 8146304326716143292} - - component: {fileID: 5353790932593107132} - m_Layer: 5 - m_Name: Scrollbar Horizontal - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &9168450267583407812 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5434636498674400270} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1072136122685428223} - m_Father: {fileID: 9209122612970100190} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 5} - m_Pivot: {x: 0, y: 0} ---- !u!222 &752456552382603827 + m_GameObject: {fileID: 3011982018749398316} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7be08eb56899e2042811c8d1da0924a6, type: 3} + m_Name: + m_EditorClassIdentifier: + itemPrefab: {fileID: 4190301731963491743, guid: 3b667b13f22b81b4896e14bd416de1f7, type: 3} + root: {fileID: 908297234377844233} + allowMultipleSelection: 1 + enableDragDrop: 1 +--- !u!222 &4415661564241239138 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5434636498674400270} + m_GameObject: {fileID: 3011982018749398316} m_CullTransparentMesh: 1 ---- !u!114 &8146304326716143292 +--- !u!114 &2006518343008415563 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5434636498674400270} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.09411765, g: 0.09411765, b: 0.09411765, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!114 &5353790932593107132 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5434636498674400270} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 2424698233555359630} - m_HandleRect: {fileID: 1697446796394887609} - m_Direction: 0 - m_Value: 0 - m_Size: 1 - m_NumberOfSteps: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!1 &6088661380421375832 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 9209122612970100190} - - component: {fileID: 6476927354465729135} - - component: {fileID: 4767275849322073822} - - component: {fileID: 3842398061781452714} - m_Layer: 5 - m_Name: Scroll View - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &9209122612970100190 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6088661380421375832} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1824308313848313193} - - {fileID: 7793457982563150253} - - {fileID: 9168450267583407812} - m_Father: {fileID: 6567388883908861155} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -11} - m_SizeDelta: {x: 0, y: -42} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &6476927354465729135 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6088661380421375832} - m_CullTransparentMesh: 1 ---- !u!114 &4767275849322073822 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6088661380421375832} + m_GameObject: {fileID: 3011982018749398316} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -860,19 +384,19 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!114 &3842398061781452714 +--- !u!114 &5742779717166474465 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6088661380421375832} + m_GameObject: {fileID: 3011982018749398316} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} m_Name: m_EditorClassIdentifier: - m_Content: {fileID: 2240268413977263779} + m_Content: {fileID: 2261173428971837695} m_Horizontal: 1 m_Vertical: 1 m_MovementType: 2 @@ -880,9 +404,9 @@ MonoBehaviour: m_Inertia: 1 m_DecelerationRate: 0.135 m_ScrollSensitivity: 10 - m_Viewport: {fileID: 1824308313848313193} - m_HorizontalScrollbar: {fileID: 5353790932593107132} - m_VerticalScrollbar: {fileID: 505480948637281615} + m_Viewport: {fileID: 3974886479277341081} + m_HorizontalScrollbar: {fileID: 6025781672912143612} + m_VerticalScrollbar: {fileID: 4856300785373777908} m_HorizontalScrollbarVisibility: 1 m_VerticalScrollbarVisibility: 1 m_HorizontalScrollbarSpacing: -3 @@ -890,7 +414,7 @@ MonoBehaviour: m_OnValueChanged: m_PersistentCalls: m_Calls: [] ---- !u!1 &6690344807426313734 +--- !u!1 &3904395414431480648 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -898,454 +422,10 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 6986221832819843173} - - component: {fileID: 1154093525567517578} - - component: {fileID: 2733383086465723583} - - component: {fileID: 1132190849957045457} - m_Layer: 5 - m_Name: Root - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &6986221832819843173 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6690344807426313734} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 2240268413977263779} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 1} ---- !u!114 &1154093525567517578 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6690344807426313734} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 20 - m_Right: 0 - m_Top: 2 - m_Bottom: 0 - m_ChildAlignment: 0 - m_Spacing: 0 - m_ChildForceExpandWidth: 0 - m_ChildForceExpandHeight: 0 - m_ChildControlWidth: 0 - m_ChildControlHeight: 0 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 ---- !u!114 &2733383086465723583 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6690344807426313734} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 2 - m_VerticalFit: 2 ---- !u!114 &1132190849957045457 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6690344807426313734} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: de4afb3a0d93f05448f2fc60683275c0, type: 3} - m_Name: - m_EditorClassIdentifier: - margin: {x: 0, y: 0} - target: - - {fileID: 2240268413977263779} ---- !u!1 &6757006638454796643 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1661139593473125497} - - component: {fileID: 5752581588549509129} - - component: {fileID: 1578952239640414418} - - component: {fileID: 2598691367951394532} - m_Layer: 5 - m_Name: InputField (TMP) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1661139593473125497 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6757006638454796643} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 8994610988129793201} - - {fileID: 6430955701886727832} - m_Father: {fileID: 6567388883908861155} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 20, y: 0} - m_SizeDelta: {x: 268, y: 24} - m_Pivot: {x: 0, y: 1} ---- !u!222 &5752581588549509129 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6757006638454796643} - m_CullTransparentMesh: 1 ---- !u!114 &1578952239640414418 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6757006638454796643} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.23529412, g: 0.23529412, b: 0.23529412, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!114 &2598691367951394532 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6757006638454796643} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1578952239640414418} - m_TextViewport: {fileID: 6430955701886727832} - m_TextComponent: {fileID: 1912505645382100536} - m_Placeholder: {fileID: 3047408605536893539} - m_VerticalScrollbar: {fileID: 0} - m_VerticalScrollbarEventHandler: {fileID: 0} - m_LayoutGroup: {fileID: 0} - m_ScrollSensitivity: 1 - m_ContentType: 0 - m_InputType: 0 - m_AsteriskChar: 42 - m_KeyboardType: 0 - m_LineType: 0 - m_HideMobileInput: 0 - m_HideSoftKeyboard: 0 - m_CharacterValidation: 0 - m_RegexValue: - m_GlobalPointSize: 12 - m_CharacterLimit: 0 - m_OnEndEdit: - m_PersistentCalls: - m_Calls: [] - m_OnSubmit: - m_PersistentCalls: - m_Calls: [] - m_OnSelect: - m_PersistentCalls: - m_Calls: [] - m_OnDeselect: - m_PersistentCalls: - m_Calls: [] - m_OnTextSelection: - m_PersistentCalls: - m_Calls: [] - m_OnEndTextSelection: - m_PersistentCalls: - m_Calls: [] - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_OnTouchScreenKeyboardStatusChanged: - m_PersistentCalls: - m_Calls: [] - m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_CustomCaretColor: 0 - m_SelectionColor: {r: 0, g: 0, b: 0, a: 1} - m_Text: - m_CaretBlinkRate: 0.85 - m_CaretWidth: 1 - m_ReadOnly: 0 - m_RichText: 1 - m_GlobalFontAsset: {fileID: 11400000, guid: 2c77cc500db5adc499bfa50030f7e8c2, type: 2} - m_OnFocusSelectAll: 1 - m_ResetOnDeActivation: 1 - m_KeepTextSelectionVisible: 0 - m_RestoreOriginalTextOnEscape: 1 - m_isRichTextEditingAllowed: 0 - m_LineLimit: 0 - isAlert: 0 - m_InputValidator: {fileID: 0} - m_ShouldActivateOnSelect: 1 ---- !u!1 &6844972442617045610 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 161416004204927197} - m_Layer: 5 - m_Name: Sliding Area - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &161416004204927197 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6844972442617045610} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 5613474474329381979} - m_Father: {fileID: 7793457982563150253} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -20, y: -20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &6889153405749114039 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4235693900264403651} - - component: {fileID: 1735423591749555638} - - component: {fileID: 1912505645382100536} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &4235693900264403651 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6889153405749114039} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 6430955701886727832} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -10, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &1735423591749555638 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6889153405749114039} - m_CullTransparentMesh: 1 ---- !u!114 &1912505645382100536 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6889153405749114039} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: "\u200B" - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: d1fa8a1da59a4de4485cae7c4f9c196b, type: 2} - m_sharedMaterial: {fileID: -6974119170906569483, guid: d1fa8a1da59a4de4485cae7c4f9c196b, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4291611852 - m_fontColor: {r: 0.8, g: 0.8, b: 0.8, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 13 - m_fontSizeBase: 13 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_TextWrappingMode: 3 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 0 - m_ActiveFontFeatures: 6e72656b - m_enableExtraPadding: 1 - checkPaddingRequired: 0 - m_isRichText: 1 - m_EmojiFallbackSupport: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!1 &7111138225835767551 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1824308313848313193} - - component: {fileID: 8340655046281950868} - - component: {fileID: 8899114591733096630} - - component: {fileID: 6602378990812955008} + - component: {fileID: 3974886479277341081} + - component: {fileID: 2640013902256625935} + - component: {fileID: 7267482512719985956} + - component: {fileID: 1414930982064568929} m_Layer: 5 m_Name: Viewport m_TagString: Untagged @@ -1353,54 +433,54 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1824308313848313193 +--- !u!224 &3974886479277341081 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7111138225835767551} + m_GameObject: {fileID: 3904395414431480648} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 2240268413977263779} - m_Father: {fileID: 9209122612970100190} + - {fileID: 2261173428971837695} + m_Father: {fileID: 8894486403032071402} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 1} ---- !u!114 &8340655046281950868 +--- !u!114 &2640013902256625935 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7111138225835767551} + m_GameObject: {fileID: 3904395414431480648} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} m_Name: m_EditorClassIdentifier: m_ShowMaskGraphic: 0 ---- !u!222 &8899114591733096630 +--- !u!222 &7267482512719985956 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7111138225835767551} + m_GameObject: {fileID: 3904395414431480648} m_CullTransparentMesh: 0 ---- !u!114 &6602378990812955008 +--- !u!114 &1414930982064568929 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7111138225835767551} + m_GameObject: {fileID: 3904395414431480648} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -1424,7 +504,7 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!1 &7412319839729039088 +--- !u!1 &4125224351293165923 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1432,51 +512,74 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 6430955701886727832} - - component: {fileID: 7611657322321786739} + - component: {fileID: 6234462523872176539} + - component: {fileID: 68695882802577982} + - component: {fileID: 7428146289359687929} m_Layer: 5 - m_Name: Text Area + m_Name: Handle m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &6430955701886727832 +--- !u!224 &6234462523872176539 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7412319839729039088} + m_GameObject: {fileID: 4125224351293165923} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 4799855768651686507} - - {fileID: 4235693900264403651} - m_Father: {fileID: 1661139593473125497} + m_Children: [] + m_Father: {fileID: 3301928374361144381} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -0.5} - m_SizeDelta: {x: -20, y: -13} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &7611657322321786739 +--- !u!222 &68695882802577982 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4125224351293165923} + m_CullTransparentMesh: 0 +--- !u!114 &7428146289359687929 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7412319839729039088} + m_GameObject: {fileID: 4125224351293165923} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: - m_Padding: {x: -8, y: -5, z: -8, w: -5} - m_Softness: {x: 0, y: 0} ---- !u!1 &7502890321304074715 + m_Material: {fileID: 0} + m_Color: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &4235972654286552744 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1484,7 +587,213 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2240268413977263779} + - component: {fileID: 908297234377844233} + - component: {fileID: 5053221704473354703} + - component: {fileID: 2409632255040810509} + - component: {fileID: 3050818479446949986} + m_Layer: 5 + m_Name: Root + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &908297234377844233 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4235972654286552744} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2261173428971837695} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &5053221704473354703 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4235972654286552744} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 20 + m_Right: 0 + m_Top: 2 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &2409632255040810509 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4235972654286552744} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 2 +--- !u!114 &3050818479446949986 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4235972654286552744} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: de4afb3a0d93f05448f2fc60683275c0, type: 3} + m_Name: + m_EditorClassIdentifier: + EnableWidth: 0 + EnableHeight: 1 + margin: {x: 0, y: 0} + target: + - {fileID: 2261173428971837695} +--- !u!1 &4766152670497772902 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3097322909638401089} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3097322909638401089 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4766152670497772902} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6081086258189437538} + m_Father: {fileID: 1022765863909309765} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &4888954506875524224 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6081086258189437538} + - component: {fileID: 1173046865919000884} + - component: {fileID: 2680734087760533677} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6081086258189437538 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4888954506875524224} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3097322909638401089} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1173046865919000884 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4888954506875524224} + m_CullTransparentMesh: 0 +--- !u!114 &2680734087760533677 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4888954506875524224} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &8720199997050006827 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2261173428971837695} m_Layer: 5 m_Name: Content m_TagString: Untagged @@ -1492,23 +801,23 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &2240268413977263779 +--- !u!224 &2261173428971837695 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7502890321304074715} + m_GameObject: {fileID: 8720199997050006827} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 6986221832819843173} - m_Father: {fileID: 1824308313848313193} + - {fileID: 908297234377844233} + m_Father: {fileID: 3974886479277341081} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 2} m_Pivot: {x: 0, y: 1} diff --git a/Assets/Resources/Prefabs/UI/List/ComponentListWindow.prefab b/Assets/Resources/Prefabs/UI/Window/ComponentListWindow.prefab similarity index 100% rename from Assets/Resources/Prefabs/UI/List/ComponentListWindow.prefab rename to Assets/Resources/Prefabs/UI/Window/ComponentListWindow.prefab diff --git a/Assets/Resources/Prefabs/UI/List/ComponentListWindow.prefab.meta b/Assets/Resources/Prefabs/UI/Window/ComponentListWindow.prefab.meta similarity index 100% rename from Assets/Resources/Prefabs/UI/List/ComponentListWindow.prefab.meta rename to Assets/Resources/Prefabs/UI/Window/ComponentListWindow.prefab.meta diff --git a/Assets/Resources/Prefabs/UI/Window/HierarchyWindow.prefab b/Assets/Resources/Prefabs/UI/Window/HierarchyWindow.prefab new file mode 100644 index 00000000..123c8cf1 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Window/HierarchyWindow.prefab @@ -0,0 +1,1487 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &19856086295022883 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7188490178547780683} + - component: {fileID: 2275185046005143034} + - component: {fileID: 5184576730040321648} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7188490178547780683 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 19856086295022883} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6704318869740062506} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2275185046005143034 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 19856086295022883} + m_CullTransparentMesh: 1 +--- !u!114 &5184576730040321648 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 19856086295022883} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "\u200B" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: d1fa8a1da59a4de4485cae7c4f9c196b, type: 2} + m_sharedMaterial: {fileID: -6974119170906569483, guid: d1fa8a1da59a4de4485cae7c4f9c196b, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4291611852 + m_fontColor: {r: 0.8, g: 0.8, b: 0.8, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 13 + m_fontSizeBase: 13 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 3 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 1 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &214406981717356526 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6704318869740062506} + - component: {fileID: 8946571027995579782} + m_Layer: 5 + m_Name: Text Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6704318869740062506 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 214406981717356526} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 232306301178016477} + - {fileID: 7188490178547780683} + m_Father: {fileID: 40713400823356351} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &8946571027995579782 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 214406981717356526} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: {x: -8, y: -5, z: -8, w: -5} + m_Softness: {x: 0, y: 0} +--- !u!1 &1240453198998271138 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6901611604910596127} + m_Layer: 5 + m_Name: Top + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6901611604910596127 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240453198998271138} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 798050974035107396} + - {fileID: 7241186331197533024} + m_Father: {fileID: 1574318677252675885} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 300, y: 32} + m_Pivot: {x: 0, y: 1} +--- !u!1 &1861631876082842492 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4162604190990658749} + - component: {fileID: 2822835300248902653} + - component: {fileID: 9209424671866392754} + - component: {fileID: 5364685758092017862} + m_Layer: 5 + m_Name: removeTextButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4162604190990658749 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1861631876082842492} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 40713400823356351} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 24, y: 16} + m_Pivot: {x: 1, y: 0.5} +--- !u!222 &2822835300248902653 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1861631876082842492} + m_CullTransparentMesh: 1 +--- !u!114 &9209424671866392754 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1861631876082842492} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8, g: 0.8, b: 0.8, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 17863240a1386604e8c74d85d4a95818, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &5364685758092017862 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1861631876082842492} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 0.8, g: 0.8, b: 0.8, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 1, g: 1, b: 1, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.8, g: 0.8, b: 0.8, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 9209424671866392754} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: UVC.UI.List.ComponentList.ComponentList, Assembly-CSharp + m_MethodName: OnClickClearText + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &1866422618894112705 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 40713400823356351} + - component: {fileID: 9119395570097571835} + - component: {fileID: 6115366051205754178} + - component: {fileID: 7769071907284884258} + m_Layer: 5 + m_Name: InputField (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &40713400823356351 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1866422618894112705} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3512955993103789164} + - {fileID: 4162604190990658749} + - {fileID: 6704318869740062506} + m_Father: {fileID: 1574318677252675885} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 20, y: -40} + m_SizeDelta: {x: -32, y: 24} + m_Pivot: {x: 0, y: 1} +--- !u!222 &9119395570097571835 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1866422618894112705} + m_CullTransparentMesh: 1 +--- !u!114 &6115366051205754178 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1866422618894112705} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.23529412, g: 0.23529412, b: 0.23529412, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &7769071907284884258 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1866422618894112705} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 6115366051205754178} + m_TextViewport: {fileID: 6704318869740062506} + m_TextComponent: {fileID: 5184576730040321648} + m_Placeholder: {fileID: 1089595314010215438} + m_VerticalScrollbar: {fileID: 0} + m_VerticalScrollbarEventHandler: {fileID: 0} + m_LayoutGroup: {fileID: 0} + m_ScrollSensitivity: 1 + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_HideSoftKeyboard: 0 + m_CharacterValidation: 0 + m_RegexValue: + m_GlobalPointSize: 12 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnSelect: + m_PersistentCalls: + m_Calls: [] + m_OnDeselect: + m_PersistentCalls: + m_Calls: [] + m_OnTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnEndTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_OnTouchScreenKeyboardStatusChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0, g: 0, b: 0, a: 1} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_RichText: 1 + m_GlobalFontAsset: {fileID: 11400000, guid: 2c77cc500db5adc499bfa50030f7e8c2, type: 2} + m_OnFocusSelectAll: 1 + m_ResetOnDeActivation: 1 + m_KeepTextSelectionVisible: 0 + m_RestoreOriginalTextOnEscape: 1 + m_isRichTextEditingAllowed: 0 + m_LineLimit: 0 + isAlert: 0 + m_InputValidator: {fileID: 0} + m_ShouldActivateOnSelect: 1 +--- !u!1 &1913501843011813999 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1574318677252675885} + - component: {fileID: 1941791058898214053} + - component: {fileID: 5260132368171820871} + - component: {fileID: 8327823890420627479} + m_Layer: 5 + m_Name: HierarchyWindow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1574318677252675885 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1913501843011813999} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6901611604910596127} + - {fileID: 40713400823356351} + - {fileID: 7914877393362965188} + - {fileID: 5371740527650607395} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: -64} + m_SizeDelta: {x: 300, y: -64} + m_Pivot: {x: 0, y: 1} +--- !u!222 &1941791058898214053 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1913501843011813999} + m_CullTransparentMesh: 1 +--- !u!114 &5260132368171820871 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1913501843011813999} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.14509805, g: 0.14509805, b: 0.14901961, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &8327823890420627479 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1913501843011813999} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 73be4d2e3822cba4a85e1cfb52f6b737, type: 3} + m_Name: + m_EditorClassIdentifier: + treeList: {fileID: 5551319486076175234} + treeListSearch: {fileID: 7660962889100034149} + inputField: {fileID: 7769071907284884258} + clearTextButton: {fileID: 5364685758092017862} + loadingImage: {fileID: 196444072060293216} + loadingRotateSpeed: 360 + loadingFillCycle: 0.5 +--- !u!1 &2176369568386752279 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 798050974035107396} + - component: {fileID: 5344344422984745882} + - component: {fileID: 8908194448240858345} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &798050974035107396 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2176369568386752279} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6901611604910596127} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 20, y: 0} + m_SizeDelta: {x: 184, y: 24} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &5344344422984745882 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2176369568386752279} + m_CullTransparentMesh: 1 +--- !u!114 &8908194448240858345 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2176369568386752279} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: HIERARCHY + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: d1fa8a1da59a4de4485cae7c4f9c196b, type: 2} + m_sharedMaterial: {fileID: -6974119170906569483, guid: d1fa8a1da59a4de4485cae7c4f9c196b, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4291611852 + m_fontColor: {r: 0.8, g: 0.8, b: 0.8, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 11 + m_fontSizeBase: 11 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &2333009082774902369 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1765160980165362397} + - component: {fileID: 1079965938617629996} + - component: {fileID: 8946630860592845295} + - component: {fileID: 2792550393869914720} + m_Layer: 5 + m_Name: CloseButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1765160980165362397 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2333009082774902369} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7241186331197533024} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 22, y: 22} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1079965938617629996 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2333009082774902369} + m_CullTransparentMesh: 1 +--- !u!114 &8946630860592845295 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2333009082774902369} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8, g: 0.8, b: 0.8, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 7bbcdeb4ed6408443852787a94f5c21b, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &2792550393869914720 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2333009082774902369} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 0.8, g: 0.8, b: 0.8, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 1, g: 1, b: 1, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.8, g: 0.8, b: 0.8, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 8946630860592845295} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: UVC.UI.Window.PropertyWindow.PropertyWindow, Assembly-CSharp + m_MethodName: Hide + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &3481291456717064673 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7241186331197533024} + - component: {fileID: 9173950862504170430} + m_Layer: 5 + m_Name: buttons + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7241186331197533024 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3481291456717064673} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1765160980165362397} + m_Father: {fileID: 6901611604910596127} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -12, y: 0} + m_SizeDelta: {x: 80, y: 22} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &9173950862504170430 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3481291456717064673} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 5 + m_Spacing: 4 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &7060932487311895023 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3512955993103789164} + - component: {fileID: 771756914789545659} + - component: {fileID: 196444072060293216} + m_Layer: 5 + m_Name: loadingImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3512955993103789164 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7060932487311895023} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 40713400823356351} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 105, y: 0} + m_SizeDelta: {x: 10, y: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &771756914789545659 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7060932487311895023} + m_CullTransparentMesh: 1 +--- !u!114 &196444072060293216 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7060932487311895023} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8, g: 0.8, b: 0.8, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 2de0f68dbe4876e47804e01029bd07e8, type: 3} + m_Type: 3 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &8703800818190431198 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 232306301178016477} + - component: {fileID: 633606437974914870} + - component: {fileID: 1089595314010215438} + - component: {fileID: 1780098577063208606} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &232306301178016477 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8703800818190431198} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6704318869740062506} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &633606437974914870 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8703800818190431198} + m_CullTransparentMesh: 1 +--- !u!114 &1089595314010215438 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8703800818190431198} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "\uAC80\uC0C9" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 2c77cc500db5adc499bfa50030f7e8c2, type: 2} + m_sharedMaterial: {fileID: -2285177295282439072, guid: 2c77cc500db5adc499bfa50030f7e8c2, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4288716960 + m_fontColor: {r: 0.627451, g: 0.627451, b: 0.627451, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 13 + m_fontSizeBase: 13 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 2 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 1 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &1780098577063208606 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8703800818190431198} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 1 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1001 &1637299600126635566 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1574318677252675885} + m_Modifications: + - target: {fileID: 908297234377844233, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 908297234377844233, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2261173428971837695, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_SizeDelta.y + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 3011982018749398316, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_Name + value: TreeListSearch + objectReference: {fileID: 0} + - target: {fileID: 6081086258189437538, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6081086258189437538, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6234462523872176539, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6234462523872176539, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_Pivot.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_SizeDelta.y + value: -76 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchoredPosition.y + value: -76 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9000987459549261387, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: allowMultipleSelection + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} +--- !u!114 &7660962889100034149 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 9000987459549261387, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + m_PrefabInstance: {fileID: 1637299600126635566} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7be08eb56899e2042811c8d1da0924a6, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!224 &7914877393362965188 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + m_PrefabInstance: {fileID: 1637299600126635566} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &3594947613090885065 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1574318677252675885} + m_Modifications: + - target: {fileID: 908297234377844233, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 908297234377844233, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2261173428971837695, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_SizeDelta.y + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 3011982018749398316, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_Name + value: TreeList + objectReference: {fileID: 0} + - target: {fileID: 6081086258189437538, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6081086258189437538, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6234462523872176539, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6234462523872176539, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_Pivot.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_SizeDelta.y + value: -76 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_AnchoredPosition.y + value: -76 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} +--- !u!224 &5371740527650607395 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 8894486403032071402, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + m_PrefabInstance: {fileID: 3594947613090885065} + m_PrefabAsset: {fileID: 0} +--- !u!114 &5551319486076175234 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 9000987459549261387, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} + m_PrefabInstance: {fileID: 3594947613090885065} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7be08eb56899e2042811c8d1da0924a6, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/Assets/Resources/Prefabs/UI/Window/HierarchyWindow.prefab.meta b/Assets/Resources/Prefabs/UI/Window/HierarchyWindow.prefab.meta new file mode 100644 index 00000000..3df77daf --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Window/HierarchyWindow.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 55334174237ec37438ae05ee0b89079a +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/images/icon_ellipse_16.png b/Assets/Resources/Prefabs/UI/images/icon_ellipse_16.png new file mode 100644 index 00000000..543a1acc Binary files /dev/null and b/Assets/Resources/Prefabs/UI/images/icon_ellipse_16.png differ diff --git a/Assets/Resources/Prefabs/UI/images/icon_ellipse_16.png.meta b/Assets/Resources/Prefabs/UI/images/icon_ellipse_16.png.meta new file mode 100644 index 00000000..2c6d3337 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/images/icon_ellipse_16.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 2de0f68dbe4876e47804e01029bd07e8 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/Sample/HierarchySample.unity b/Assets/Scenes/Sample/HierarchySample.unity index 4ed82ae5..884b0ea4 100644 --- a/Assets/Scenes/Sample/HierarchySample.unity +++ b/Assets/Scenes/Sample/HierarchySample.unity @@ -119,197 +119,22 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} ---- !u!1 &651880471 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 651880472} - - component: {fileID: 651880474} - - component: {fileID: 651880473} - - component: {fileID: 651880475} - m_Layer: 5 - m_Name: HierarchyWindow - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &651880472 +--- !u!224 &651880472 stripped RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + m_PrefabInstance: {fileID: 2860332021081550125} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 651880471} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 797351289} - - {fileID: 2079701273} - m_Father: {fileID: 1218340765} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: -64} - m_SizeDelta: {x: 300, y: -64} - m_Pivot: {x: 0, y: 1} ---- !u!114 &651880473 +--- !u!114 &651880475 stripped MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 8327823890420627479, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + m_PrefabInstance: {fileID: 2860332021081550125} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 651880471} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.14509805, g: 0.14509805, b: 0.14901961, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &651880474 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 651880471} - m_CullTransparentMesh: 1 ---- !u!114 &651880475 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 651880471} + m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 73be4d2e3822cba4a85e1cfb52f6b737, type: 3} m_Name: m_EditorClassIdentifier: - treeList: {fileID: 2079701274} ---- !u!1 &797351288 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 797351289} - m_Layer: 5 - m_Name: Top - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &797351289 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 797351288} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 2045629989} - - {fileID: 886096681} - m_Father: {fileID: 651880472} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 300, y: 32} - m_Pivot: {x: 0, y: 1} ---- !u!1 &886096680 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 886096681} - - component: {fileID: 886096682} - m_Layer: 5 - m_Name: buttons - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &886096681 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 886096680} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1786541371} - m_Father: {fileID: 797351289} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: -12, y: 0} - m_SizeDelta: {x: 80, y: 22} - m_Pivot: {x: 1, y: 0.5} ---- !u!114 &886096682 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 886096680} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 0 - m_Right: 0 - m_Top: 0 - m_Bottom: 0 - m_ChildAlignment: 5 - m_Spacing: 4 - m_ChildForceExpandWidth: 0 - m_ChildForceExpandHeight: 0 - m_ChildControlWidth: 0 - m_ChildControlHeight: 0 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 --- !u!1 &1097328750 GameObject: m_ObjectHideFlags: 0 @@ -657,427 +482,6 @@ MonoBehaviour: m_LightCookieSize: {x: 1, y: 1} m_LightCookieOffset: {x: 0, y: 0} m_SoftShadowQuality: 0 ---- !u!1 &1786541370 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1786541371} - - component: {fileID: 1786541374} - - component: {fileID: 1786541373} - - component: {fileID: 1786541372} - m_Layer: 5 - m_Name: CloseButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1786541371 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1786541370} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 886096681} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 22, y: 22} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1786541372 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1786541370} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 0.8, g: 0.8, b: 0.8, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 1, g: 1, b: 1, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.8, g: 0.8, b: 0.8, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1786541373} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 0} - m_TargetAssemblyTypeName: UVC.UI.Window.PropertyWindow.PropertyWindow, Assembly-CSharp - m_MethodName: Hide - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 ---- !u!114 &1786541373 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1786541370} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.8, g: 0.8, b: 0.8, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 7bbcdeb4ed6408443852787a94f5c21b, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1786541374 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1786541370} - m_CullTransparentMesh: 1 ---- !u!1 &2045629988 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2045629989} - - component: {fileID: 2045629991} - - component: {fileID: 2045629990} - m_Layer: 5 - m_Name: Text (TMP) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2045629989 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2045629988} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 797351289} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0, y: 0.5} - m_AnchoredPosition: {x: 20, y: 0} - m_SizeDelta: {x: 184, y: 24} - m_Pivot: {x: 0, y: 0.5} ---- !u!114 &2045629990 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2045629988} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: HIERARCHY - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: d1fa8a1da59a4de4485cae7c4f9c196b, type: 2} - m_sharedMaterial: {fileID: -6974119170906569483, guid: d1fa8a1da59a4de4485cae7c4f9c196b, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4291611852 - m_fontColor: {r: 0.8, g: 0.8, b: 0.8, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 11 - m_fontSizeBase: 11 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_TextWrappingMode: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 0 - m_ActiveFontFeatures: 6e72656b - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_EmojiFallbackSupport: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &2045629991 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2045629988} - m_CullTransparentMesh: 1 ---- !u!1001 &2079701272 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 651880472} - m_Modifications: - - target: {fileID: 1132190849957045457, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: EnableWidth - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1697446796394887609, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1697446796394887609, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2240268413977263779, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2240268413977263779, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_SizeDelta.y - value: 2 - objectReference: {fileID: 0} - - target: {fileID: 2651864206743669424, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_Name - value: TreeList - objectReference: {fileID: 0} - - target: {fileID: 5353790932593107132, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_Size - value: 0.9375 - objectReference: {fileID: 0} - - target: {fileID: 5613474474329381979, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 5613474474329381979, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_Pivot.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_Pivot.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_AnchorMax.x - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_AnchorMax.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_SizeDelta.y - value: -40 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_AnchoredPosition.y - value: -40 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6986221832819843173, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6986221832819843173, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} ---- !u!224 &2079701273 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 6567388883908861155, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - m_PrefabInstance: {fileID: 2079701272} - m_PrefabAsset: {fileID: 0} ---- !u!114 &2079701274 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 4160214132252070715, guid: a030935af8c62d748b6fe3d01bd4851f, type: 3} - m_PrefabInstance: {fileID: 2079701272} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7be08eb56899e2042811c8d1da0924a6, type: 3} - m_Name: - m_EditorClassIdentifier: --- !u!1 &2136621999 GameObject: m_ObjectHideFlags: 0 @@ -1170,6 +574,167 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &2860332021081550125 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1218340765} + m_Modifications: + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_Pivot.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_SizeDelta.x + value: 300 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_SizeDelta.y + value: -64 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_AnchoredPosition.y + value: -64 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1574318677252675885, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1765160980165362397, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1765160980165362397, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1765160980165362397, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1765160980165362397, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1883121240313448487, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1883121240313448487, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1913501843011813999, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_Name + value: HierarchyWindow + objectReference: {fileID: 0} + - target: {fileID: 4429635802794036160, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4429635802794036160, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4629025237416871861, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4629025237416871861, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4817867488375858252, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4817867488375858252, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7315968355667519403, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7315968355667519403, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7450804729565234258, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7450804729565234258, guid: 55334174237ec37438ae05ee0b89079a, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 55334174237ec37438ae05ee0b89079a, type: 3} --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/NHN/ContentSizeSetter.cs b/Assets/Scripts/NHN/ContentSizeSetter.cs index 38eccc08..13173de0 100644 --- a/Assets/Scripts/NHN/ContentSizeSetter.cs +++ b/Assets/Scripts/NHN/ContentSizeSetter.cs @@ -1,26 +1,27 @@ +using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; namespace Gpm.Ui { - /// - /// 이 컴포넌트가 부착된 RectTransform의 크기가 변경될 때, 지정된 'target' RectTransform들의 크기를 동일하게 맞추는 역할을 합니다. - /// 주로 ContentSizeFitter와 함께 사용되어 동적으로 변하는 콘텐츠의 크기에 맞춰 배경 이미지 등의 크기를 조절할 때 유용합니다. - /// - /// - /// UI 계층 구조 예시: - /// - /// - Background (RectTransform) - /// - Content (RectTransform, VerticalLayoutGroup, ContentSizeFitter, ContentSizeSetter) - /// - Item1 (Image) - /// - Item2 (Image) - /// - ... - /// - /// 위와 같은 구조에서 'Content' GameObject에 이 스크립트를 추가하고, - /// 'target' 배열에 'Background'의 RectTransform을 할당하면, - /// 'Content'의 크기가 내부 아이템(Item1, Item2)에 의해 변경될 때마다 'Background'의 크기도 함께 조절됩니다. - /// + /// + /// 이 컴포넌트가 부착된 RectTransform의 크기가 변경될 때, 지정된 'target' RectTransform들의 크기를 동일하게 맞추는 역할을 합니다. + /// 주로 ContentSizeFitter와 함께 사용되어 동적으로 변하는 콘텐츠의 크기에 맞춰 배경 이미지 등의 크기를 조절할 때 유용합니다. + /// + /// + /// UI 계층 구조 예시: + /// + /// - Background (RectTransform) + /// - Content (RectTransform, VerticalLayoutGroup, ContentSizeFitter, ContentSizeSetter) + /// - Item1 (Image) + /// - Item2 (Image) + /// - ... + /// + /// 위와 같은 구조에서 'Content' GameObject에 이 스크립트를 추가하고, + /// 'target' 배열에 'Background'의 RectTransform을 할당하면, + /// 'Content'의 크기가 내부 아이템(Item1, Item2)에 의해 변경될 때마다 'Background'의 크기도 함께 조절됩니다. + /// [ExecuteAlways] // 에디터 모드에서도 스크립트가 실행되도록 하여, UI 변경을 실시간으로 확인할 수 있게 합니다. [RequireComponent(typeof(RectTransform))] // 이 컴포넌트는 RectTransform이 필수적으로 필요함을 명시합니다. public class ContentSizeSetter : UIBehaviour @@ -69,13 +70,26 @@ namespace Gpm.Ui [SerializeField] public RectTransform[] target; + // 중복 마킹을 방지하기 위한 정적 캐시 + private static HashSet s_MarkedTargets = new HashSet(); + private static int s_LastFrameMarked = -1; + private static Dictionary s_LastMarkedTime = new Dictionary(); + + // 예약 플래그 + private bool m_PendingUpdate = false; + + [SerializeField] + [Tooltip("같은 target에 대해 재마킹하기 전 최소 대기 시간(초).0이면 제한 없음.")] + private float minMarkInterval = 0f; + /// /// 컴포넌트가 활성화될 때 호출되는 Unity 생명주기 함수입니다. /// 레이아웃을 다시 계산하도록 시스템에 요청합니다. /// protected override void OnEnable() { - SetDirty(); + // 활성화 시 즉시 반영이 필요할 수 있으므로 예약 대신 즉시 마킹 + ScheduleUpdate(); } /// @@ -86,20 +100,94 @@ namespace Gpm.Ui { base.OnRectTransformDimensionsChange(); - // 현재 RectTransform의 크기에 margin 값을 더하여 최종 크기를 계산합니다. - Vector2 sizeDelta = new Vector2(rectTransform.sizeDelta.x + margin.x, rectTransform.sizeDelta.y + margin.y); - if (target != null) + // 변경이 발생하면 즉시 적용하지 않고 다음 프레임에 일괄 처리하도록 예약합니다. + ScheduleUpdate(); + } + + /// + /// 예약 처리: 다음 LateUpdate에서 적용 + /// + private void ScheduleUpdate() + { + if (!IsActive()) + return; + + m_PendingUpdate = true; + } + + /// + /// LateUpdate에서 예약된 변경을 한 번에 처리합니다. + /// 동일 프레임/짧은 시간 내 중복 레이아웃 마킹을 방지합니다. + /// + private void LateUpdate() + { + if (!m_PendingUpdate) + return; + + // 프레임이 바뀌면 정적 캐시를 리셋 + if (s_LastFrameMarked != Time.frameCount) { - // target 배열의 모든 RectTransform에 대해 계산된 크기를 적용합니다. - for (int i = 0; i < target.Length; i++) + s_LastFrameMarked = Time.frameCount; + s_MarkedTargets.Clear(); + } + + if (rectTransform == null || target == null || target.Length == 0) + { + m_PendingUpdate = false; + return; + } + + // 원본 크기 계산(여기서 sizeDelta는 변경하지 않음) + Vector2 desired = new Vector2(rectTransform.sizeDelta.x + margin.x, rectTransform.sizeDelta.y + margin.y); + + for (int i = 0; i < target.Length; i++) + { + var t = target[i]; + if (t == null) + continue; + + // 계산된 최종 크기 + float w = EnableWidth ? desired.x : t.sizeDelta.x; + float h = EnableHeight ? desired.y : t.sizeDelta.y; + + // 필요할 경우에만 할당하여 변경 횟수 감소 + if (t.sizeDelta.x != w || t.sizeDelta.y != h) { - if (!EnableWidth) sizeDelta.x = target[i].sizeDelta.x; - if (!EnableHeight) sizeDelta.y = target[i].sizeDelta.y; - target[i].sizeDelta = sizeDelta; - // target의 레이아웃을 갱신하도록 표시하여 UI가 올바르게 다시 그려지도록 합니다. - LayoutRebuilder.MarkLayoutForRebuild(target[i]); + t.sizeDelta = new Vector2(w, h); + } + + TryMarkTarget(t); + } + + m_PendingUpdate = false; + } + + /// + /// 주어진 target을 마킹(및 시간 제한 검사)합니다. + /// + /// 마킹 대상 + private void TryMarkTarget(RectTransform t) + { + if (t == null) + return; + + // 이미 같은 프레임에 마킹했다면 중복 방지 + if (s_MarkedTargets.Contains(t)) + return; + + // 최소 재마킹 간격 검사 + if (minMarkInterval > 0f) + { + if (s_LastMarkedTime.TryGetValue(t, out float lastTime)) + { + if (Time.unscaledTime - lastTime < minMarkInterval) + return; } } + + s_MarkedTargets.Add(t); + s_LastMarkedTime[t] = Time.unscaledTime; + LayoutRebuilder.MarkLayoutForRebuild(t); } /// diff --git a/Assets/Scripts/NHN/LayoutUpdater.cs b/Assets/Scripts/NHN/LayoutUpdater.cs index 5d8c7cb7..5fb6ecb1 100644 --- a/Assets/Scripts/NHN/LayoutUpdater.cs +++ b/Assets/Scripts/NHN/LayoutUpdater.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; @@ -29,6 +30,28 @@ namespace Gpm.Ui // 성능 최적화를 위해 부모 RectTransform 컴포넌트를 캐싱하는 변수입니다. private RectTransform m_Parent; + // 프레임 단위로 동일 부모에 대한 중복 마킹을 방지하기 위한 정적 캐시 + private static HashSet s_MarkedParents = new HashSet(); + private static int s_LastFrameMarked = -1; + + // 부모별 마지막 마킹 시간을 기록하여 너무 잦은 마킹을 제한할 수 있습니다. + private static Dictionary s_LastMarkedTime = new Dictionary(); + + // 이 인스턴스가 재빌드를 예약했는지 표시하는 플래그 + private bool m_PendingRebuild = false; + + [SerializeField] + [Tooltip("부모 체인 상위도 함께 마킹할지 여부. true이면 마크 체인을 따라 위로 올라가며 마킹합니다.")] + private bool markParentChain = false; + + [SerializeField] + [Tooltip("마킹할 부모 체인의 깊이. 0 이하이면 제한 없음(최대16으로 내부 제한).")] + private int markChainDepth = 1; + + [SerializeField] + [Tooltip("같은 부모에 대해 마킹을 다시 수행하기 전에 최소 대기 시간(초). 0이면 제한 없음.")] + private float minMarkInterval = 0f; + /// /// 이 컴포넌트가 부착된 GameObject의 부모 RectTransform에 대한 참조입니다. /// @@ -36,9 +59,9 @@ namespace Gpm.Ui { get { - if(m_Parent == null) + if (m_Parent == null) { - if(transform.parent != null) + if (transform.parent != null) { m_Parent = transform.parent.GetComponentInParent(); } @@ -56,7 +79,9 @@ namespace Gpm.Ui { base.OnRectTransformDimensionsChange(); - SetDirty(true); + // 즉시 강제 재빌드를 하지 않고, 동일 프레임 내 중복 호출을 방지하며 + // 다음 프레임에 일괄 처리하도록 예약합니다. + ScheduleRebuild(); } /// @@ -82,9 +107,101 @@ namespace Gpm.Ui } } + /// + /// 이 인스턴스에서 부모 레이아웃 재빌드를 예약합니다. + /// 동일 프레임 내 중복 예약을 방지합니다. + /// 실제 마킹은 LateUpdate에서 수행됩니다(프레임 단위 배치). + /// + private void ScheduleRebuild() + { + m_PendingRebuild = true; + } + + /// + /// LateUpdate에서 예약된 재빌드를 일괄 처리합니다. + /// 동일 프레임 내 동일 부모에 대해 중복 호출을 방지하기 위해 정적 캐시를 사용합니다. + /// 추가 옵션: 부모 체인 마킹, 부모별 최소 재마킹 간격. + /// + private void LateUpdate() + { + if (!m_PendingRebuild) + return; + + // 프레임이 바뀌면 정적 캐시를 리셋 + if (s_LastFrameMarked != Time.frameCount) + { + s_LastFrameMarked = Time.frameCount; + s_MarkedParents.Clear(); + } + + RectTransform parent = rectParent; + if (parent == null) + { + m_PendingRebuild = false; + return; + } + + // 내부적으로 체인 깊이에 음수나 0이 들어오면 무제한으로 처리하지만 안전을 위해 상한을 둡니다. + int maxDepth = markChainDepth <= 0 ? 16 : Mathf.Clamp(markChainDepth, 1, 16); + + if (markParentChain) + { + // 부모 체인 따라 올라가며 마킹 + RectTransform current = parent; + int depth = 0; + while (current != null && depth < maxDepth) + { + TryMarkParent(current); + + // 다음 상위 부모 검색 + Transform next = current.parent; + current = next != null ? next.GetComponent() : null; + depth++; + } + } + else + { + TryMarkParent(parent); + } + + m_PendingRebuild = false; + } + + /// + /// 주어진 부모 RectTransform을 마킹(및 시간 제한 검사)합니다. + /// + /// 마킹 대상 부모 + private void TryMarkParent(RectTransform parent) + { + if (parent == null) + return; + + // 이미 같은 프레임에 같은 부모를 마킹했다면 중복 방지 + if (s_MarkedParents.Contains(parent)) + return; + + // 최소 재마킹 간격 검사 + if (minMarkInterval > 0f) + { + if (s_LastMarkedTime.TryGetValue(parent, out float lastTime)) + { + if (Time.unscaledTime - lastTime < minMarkInterval) + return; // 아직 대기 시간 미만 + } + } + + s_MarkedParents.Add(parent); + s_LastMarkedTime[parent] = Time.unscaledTime; + LayoutRebuilder.MarkLayoutForRebuild(parent); + } + protected override void OnTransformParentChanged() { - m_Parent = transform.parent.GetComponentInParent(); + // 부모가 없을 수 있으므로 null 확인 + if (transform.parent != null) + m_Parent = transform.parent.GetComponentInParent(); + else + m_Parent = null; } #if UNITY_EDITOR @@ -94,6 +211,7 @@ namespace Gpm.Ui /// protected override void OnValidate() { + // 에디터에서는 즉시 반영이 필요할 수 있으므로 기존 동작 유지 SetDirty(false); } #endif diff --git a/Assets/Scripts/UVC/UI/List/Tree/TreeList.cs b/Assets/Scripts/UVC/UI/List/Tree/TreeList.cs index 8817ed66..478ba0b6 100644 --- a/Assets/Scripts/UVC/UI/List/Tree/TreeList.cs +++ b/Assets/Scripts/UVC/UI/List/Tree/TreeList.cs @@ -75,12 +75,12 @@ namespace UVC.UI.List.Tree /// /// 모든 아이템을 1차원으로 평탄화한 리스트 (범위 선택용) /// - protected List allItemDatasFlattened = new List(); + protected List allItemDataFlattened = new List(); /// /// 평탄화된 아이템 데이터 리스트 (읽기 전용) /// - public List AllItemsFlattened => allItemDatasFlattened; + public List AllItemDataFlattened => allItemDataFlattened; /// /// 루트 레벨 아이템 리스트 @@ -148,6 +148,12 @@ namespace UVC.UI.List.Tree private void Update() { + // Escape 키 입력 감지 - 선택 해제 + if (Input.GetKeyDown(KeyCode.Escape)) + { + HandleEscapeKeyPressed(); + } + // Delete 키 입력 감지 if (Input.GetKeyDown(KeyCode.Delete)) { @@ -177,6 +183,34 @@ namespace UVC.UI.List.Tree } } + /// + /// Escape 키 입력 시 모든 선택 해제 + /// + /// 동작: + /// 1. 선택된 아이템이 있는지 확인 + /// 2. ClearSelection() 호출하여 모든 선택 해제 + /// 3. lastSelectedItem 초기화 + /// + /// 용도: 사용자가 선택을 취소하고 싶을 때 빠른 해제 + /// + private void HandleEscapeKeyPressed() + { + // 선택된 아이템이 없으면 아무것도 하지 않음 + if (selectedItems.Count == 0) + { + return; + } + + // 디버그 로그 + Debug.Log($"Escape key pressed. Clearing {selectedItems.Count} selected item(s)."); + + // 모든 선택 해제 + ClearSelection(); + + // 마지막 선택 아이템 초기화 + lastSelectedItem = null; + } + /// /// Delete 키 입력 시 선택된 모든 아이템 삭제 /// @@ -519,7 +553,11 @@ namespace UVC.UI.List.Tree /// 복제할 원본 아이템 데이터 public void AddCloneItem(TreeListItemData data) { - TreeListItemData clone = data.Clone(); + TreeListItemData clone = data.CloneWithChild(); + + //호출 순서 중요 + //data에 해당하는 TreeListItem 찾기 + TreeListItem? item = allItemFlattened.FirstOrDefault(x => x.Data == data); //changedData 부모에게 알림 if (data.Parent != null) @@ -531,10 +569,9 @@ namespace UVC.UI.List.Tree RemoveItem(data); } - //data에 해당하는 TreeListItem 찾기 - TreeListItem? item = allItemFlattened.FirstOrDefault(x => x.Data == data); if (item != null) item.Delete(true); + AddItem(clone); } @@ -546,7 +583,11 @@ namespace UVC.UI.List.Tree /// 삽입 위치 public void AddCloneItemAt(TreeListItemData data, int index) { - TreeListItemData clone = data.Clone(); + TreeListItemData clone = data.CloneWithChild(); + + //호출 순서 중요 + //data에 해당하는 TreeListItem 찾기 + TreeListItem? item = allItemFlattened.FirstOrDefault(x => x.Data == data); //changedData 부모에게 알림 if (data.Parent != null) @@ -558,8 +599,6 @@ namespace UVC.UI.List.Tree RemoveItem(data); } - //data에 해당하는 TreeListItem 찾기 - TreeListItem? item = allItemFlattened.FirstOrDefault(x => x.Data == data); if (item != null) item.Delete(true); AddItemAt(clone, index); @@ -618,6 +657,25 @@ namespace UVC.UI.List.Tree } } + /// + /// 컬렉션에서 모든 항목을 지우고 관련 리소스를 해제합니다. + /// + /// 이 메서드는 컬렉션에서 모든 항목을 제거하고, 내부 데이터 구조를 지우고, + /// 메서드를 매개변수로 호출하여 각 항목을 삭제합니다. + public void ClearItems() + { + foreach (var item in allItemFlattened) + { + item.Delete(true); + } + + allItemFlattened.Clear(); + allItemDataFlattened.Clear(); + items.Clear(); + selectedItems.Clear(); + } + /// /// 모든 아이템을 1차원 리스트로 평탄화 /// @@ -631,7 +689,7 @@ namespace UVC.UI.List.Tree internal void UpdateFlattenedItemDataList() { // 기존 평탄화 리스트 비우기 - allItemDatasFlattened.Clear(); + allItemDataFlattened.Clear(); // root의 모든 직접 자식을 순회 // (손자, 증손자는 재귀로 처리됨) @@ -642,9 +700,9 @@ namespace UVC.UI.List.Tree } allItemFlattened.Clear(); - foreach (var data in allItemDatasFlattened) + foreach (var data in allItemDataFlattened) { - var item = root.GetComponentsInChildren().FirstOrDefault(x => x.Data == data); + var item = root.GetComponentsInChildren(true).FirstOrDefault(x => x.Data == data); if (item != null) { allItemFlattened.Add(item); @@ -666,7 +724,7 @@ namespace UVC.UI.List.Tree private void AddItemDataToFlattened(TreeListItemData data) { // 현재 아이템을 평탄화 리스트에 추가 - allItemDatasFlattened.Add(data); + allItemDataFlattened.Add(data); // 현재 아이템의 모든 자식을 순회 foreach (var child in data.Children) @@ -768,10 +826,10 @@ namespace UVC.UI.List.Tree private void SelectRange(TreeListItemData startItem, TreeListItemData endItem) { // 평탄화 리스트에서 시작 아이템의 위치(인덱스) 찾기 - int startIndex = allItemDatasFlattened.IndexOf(startItem); + int startIndex = allItemDataFlattened.IndexOf(startItem); // 평탄화 리스트에서 끝 아이템의 위치(인덱스) 찾기 - int endIndex = allItemDatasFlattened.IndexOf(endItem); + int endIndex = allItemDataFlattened.IndexOf(endItem); // 두 아이템 모두 리스트에 없으면 종료 if (startIndex == -1 || endIndex == -1) @@ -789,7 +847,7 @@ namespace UVC.UI.List.Tree // i = minIndex부터 i = maxIndex까지 (포함) for (int i = minIndex; i <= maxIndex; i++) { - SelectItem(allItemDatasFlattened[i]); + SelectItem(allItemDataFlattened[i]); } } @@ -944,5 +1002,33 @@ namespace UVC.UI.List.Tree Debug.Log($"Item '{draggedItem.Name}' dropped on '{(targetItem?.Name ?? "Root")}'"); } + /// + /// 지정한 데이터 항목을 트리에서 찾아 부모 체인을 펼치고 선택합니다. + /// 기존 선택이 있으면 해제합니다. + /// + /// 선택 및 표시할 데이터 (트리의 실제 데이터 참조) + /// true면 기존 선택을 모두 해제 + public void RevealAndSelectItem(TreeListItemData? data, bool clearExisting = true) + { + if (data == null) return; + + if (clearExisting) + { + ClearSelection(); + } + + // 부모 체인 펼치기 + var parent = data.Parent; + while (parent != null) + { + parent.IsExpanded = true; + parent = parent.Parent; + } + + // 평탄화 리스트 갱신 및 대상 선택 + UpdateFlattenedItemDataList(); + SelectItem(data); + } + } } diff --git a/Assets/Scripts/UVC/UI/List/Tree/TreeListDragDropManager.cs b/Assets/Scripts/UVC/UI/List/Tree/TreeListDragDropManager.cs index 923bd419..c8cc2944 100644 --- a/Assets/Scripts/UVC/UI/List/Tree/TreeListDragDropManager.cs +++ b/Assets/Scripts/UVC/UI/List/Tree/TreeListDragDropManager.cs @@ -5,6 +5,16 @@ using UnityEngine; namespace UVC.UI.List.Tree { + /// + /// 드래그 위치 표현. 위/안쪽/아래. + /// + public enum TreeDropPosition + { + Above, + InsideAsChild, + Below + } + /// /// 트리 리스트의 드래그 & 드롭 상호작용을 상태와 이벤트로 중재하는 관리자입니다. /// @@ -19,9 +29,9 @@ namespace UVC.UI.List.Tree /// /// 이벤트 흐름: /// - StartDrag → OnDragStarted(once) - /// - OnDragOver → OnDragEntered(repeat, hover 대상에 따라 여러 번) - /// - TryDrop 유효 시 → OnDropped → EndDrag → OnDragEnded - /// - TryDrop 무효/취소 시 → EndDrag → OnDragEnded + /// - OnDragOver/OnDragHovered → OnDragEntered(repeat) + /// - TryDrop 유효 시 → OnDropped → (caller) EndDrag → OnDragEnded + /// - TryDrop 무효/취소 시 → (caller) EndDrag → OnDragEnded /// public class TreeListDragDropManager { @@ -36,39 +46,35 @@ namespace UVC.UI.List.Tree public bool IsDragging { get; private set; } /// - /// 드래그 시작 시 1회 발생하는 이벤트입니다. - /// - /// + /// 드래그 시작 시1회 발생하는 이벤트입니다. /// 핸들러 시그니처: (TreeListItemData dragged) - /// + /// public Action? OnDragStarted; /// /// 드래그 진행 중 마우스가 특정 아이템 위에 있을 때 반복적으로 발생하는 이벤트입니다. - /// 빈 공간 위라면 targetItem은 null이 될 수 있습니다. - /// - /// + /// 빈 공간 위라면 targetItem은 null이 될 수 있습니다. /// 핸들러 시그니처: (TreeListItemData dragged, TreeListItemData? targetItem) - /// 이벤트 발생 빈도가 높으므로, 처리 로직은 가볍게 유지하세요. - /// + /// public Action? OnDragEntered; /// - /// 드래그가 종료될 때 발생하는 이벤트입니다(드롭 성공/실패/취소 포함). + /// 드래그 진행 중 hover 대상과 의도된 드롭 위치를 함께 통지합니다. + /// 핸들러 시그니처: (TreeListItemData dragged, TreeListItemData? targetItem, TreeDropPosition pos) + /// + public Action? OnDragHovered; + + /// + /// 드래그가 종료될 때 발생하는 이벤트입니다(드롭 성공/실패/취소 포함). + /// 핸들러 시그니처: (TreeListItemData dragged) /// - /// - /// 핸들러 시그니처: (TreeListItemData dragged)
- /// 드롭 성공 시에는 OnDropped 이후에 호출됩니다. - ///
public Action? OnDragEnded; /// /// 유효성 검사를 통과한 드롭이 확정될 때 발생하는 이벤트입니다. - /// - /// - /// 핸들러 시그니처: (TreeListItemData dragged, TreeListItemData? target)
+ /// 핸들러 시그니처: (TreeListItemData dragged, TreeListItemData? target) /// 이 이벤트에서 실제 데이터 구조 변경(이동/부모 변경/정렬)을 수행하세요. - ///
+ ///
public Action? OnDropped; /// @@ -103,6 +109,23 @@ namespace UVC.UI.List.Tree OnDragEntered?.Invoke(DraggedItem, targetItem); } + /// + /// 드래그 중 hover 대상과 드롭 위치를 함께 통지합니다. + /// + /// 현재 마우스 아래의 아이템(null 가능) + /// 의도된 드롭 위치 + public void OnDragOver(TreeListItemData? targetItem, TreeDropPosition position) + { + if (!IsDragging || DraggedItem == null) + { + return; + } + + // 하위 호환 이벤트도 호출 + OnDragEntered?.Invoke(DraggedItem, targetItem); + OnDragHovered?.Invoke(DraggedItem, targetItem, position); + } + /// /// 드래그를 종료합니다. 드래그 중이 아니면 아무 동작도 하지 않습니다. /// @@ -122,17 +145,11 @@ namespace UVC.UI.List.Tree /// /// 드래그된 아이템을 대상 아이템에 드롭 시도합니다. /// 유효성 검사(자기 자신/조상에게 드롭 금지)를 통과한 경우에만 OnDropped를 발생시킵니다. + /// EndDrag는 호출 측(뷰/핸들러)에서 호출해야 합니다. /// /// 드롭 대상 아이템. 루트 레벨로 드롭하려면 null. - /// - /// 대상 부모 내 삽입 위치. -1이면 끝에 추가 의도. - /// 현재 구현에서는 이 값이 내부에서 사용되지 않으며, 필요 시 이벤트 모델 확장이 필요합니다. - /// - /// 드롭을 성공적으로 수락하여 이벤트를 발생시켰으면 true, 그 외는 false. - /// - /// 성공 시 순서: OnDropped(once) → EndDrag → OnDragEnded.
- /// 실패/무효 시: EndDrag → OnDragEnded. - ///
+ /// 미사용 예약 필드. -1이면 끝에 추가 의도. + /// OnDropped가 발생하면 true, 아니면 false. public bool TryDrop(TreeListItemData? targetItem, int insertIndex = -1) { if (!IsDragging || DraggedItem == null) @@ -143,33 +160,22 @@ namespace UVC.UI.List.Tree // 자기 자신에게 드롭하는 경우 무시 if (targetItem != null && targetItem == DraggedItem) { - EndDrag(); return false; } // 순환 참조 검사 (드래그 아이템이 드롭 대상의 부모인 경우) if (targetItem != null && IsAncestorOf(DraggedItem, targetItem)) { - EndDrag(); return false; } - // 주의: insertIndex는 현재 이벤트로 전달되지 않습니다(모델 확장 필요). OnDropped?.Invoke(DraggedItem, targetItem); - - EndDrag(); return true; } /// /// 첫 번째 아이템이 두 번째 아이템의 조상인지 확인합니다. /// - /// 조상일 가능성이 있는 아이템. - /// 후손일 가능성이 있는 아이템. - /// 조상-후손 관계이면 true, 아니면 false. - /// - /// 상향 탐색으로 O(h) 시간 복잡도입니다(h: 트리 높이). - /// public static bool IsAncestorOf(TreeListItemData potentialAncestor, TreeListItemData potentialDescendant) { var current = potentialDescendant.Parent; @@ -187,7 +193,6 @@ namespace UVC.UI.List.Tree return false; } - /// /// 드래그 & 드롭 상태를 초기화합니다. /// diff --git a/Assets/Scripts/UVC/UI/List/Tree/TreeListItem.cs b/Assets/Scripts/UVC/UI/List/Tree/TreeListItem.cs index aabe3745..dea3cf0a 100644 --- a/Assets/Scripts/UVC/UI/List/Tree/TreeListItem.cs +++ b/Assets/Scripts/UVC/UI/List/Tree/TreeListItem.cs @@ -247,7 +247,11 @@ namespace UVC.UI.List.Tree else if (changedType == ChangedType.AddCloneChild) { //데이터 복사 - TreeListItemData clone = changedData.Clone(); + TreeListItemData clone = changedData.CloneWithChild(); + + //호출 순서 중요 + // TreeListItem 제거 + TreeListItem? item = treeList.AllItemFlattened.FirstOrDefault(x => x.Data == changedData); //changedData 부모에게 알림 - UI 갱신 용 if (changedData.Parent != null) @@ -259,8 +263,6 @@ namespace UVC.UI.List.Tree treeList.RemoveItem(changedData); } - // TreeListItem 제거 - TreeListItem? item = treeList.AllItemFlattened.FirstOrDefault(x => x.Data == changedData); if (item != null) item.Delete(true); data.AddChild(clone); @@ -268,7 +270,11 @@ namespace UVC.UI.List.Tree else if (changedType == ChangedType.AddCloneAtChild) { //데이터 복사 - TreeListItemData clone = changedData.Clone(); + TreeListItemData clone = changedData.CloneWithChild(); + + //호출 순서 중요 + // TreeListItem 제거 + TreeListItem? item = treeList.AllItemFlattened.FirstOrDefault(x => x.Data == changedData); //changedData 부모에게 알림 if (changedData.Parent != null) @@ -280,8 +286,6 @@ namespace UVC.UI.List.Tree treeList.RemoveItem(changedData); } - // TreeListItem 제거 - TreeListItem? item = treeList.AllItemFlattened.FirstOrDefault(x => x.Data == changedData); if (item != null) item.Delete(true); data.AddChildAt(clone, index); diff --git a/Assets/Scripts/UVC/UI/List/Tree/TreeListItemData.cs b/Assets/Scripts/UVC/UI/List/Tree/TreeListItemData.cs index 48a9b300..569e54b7 100644 --- a/Assets/Scripts/UVC/UI/List/Tree/TreeListItemData.cs +++ b/Assets/Scripts/UVC/UI/List/Tree/TreeListItemData.cs @@ -29,7 +29,7 @@ namespace UVC.UI.List.Tree /// 리스트를 비웁니다(연결만 끊는 수준을 넘어 자식도 정리됨). /// - AddClone계열은 전달된 원본 child를 Dispose한 뒤 복제본을 추가합니다(파괴적). ///
- public class TreeListItemData: IDisposable + public class TreeListItemData : IDisposable { #region 이벤트 (Events) @@ -150,7 +150,7 @@ namespace UVC.UI.List.Tree } } - + /// 부모 데이터(내부 전용). internal TreeListItemData? Parent @@ -236,7 +236,7 @@ namespace UVC.UI.List.Tree ///
/// 복제 및 대체할 원본 자식. public void AddCloneChild(TreeListItemData child) - { + { NotifyDataChanged(ChangedType.AddCloneChild, child); // UI에 트리 구조 변경 알림 } @@ -247,7 +247,7 @@ namespace UVC.UI.List.Tree /// 복제 및 대체할 원본 자식. /// 삽입 인덱스(0 기반). public void AddCloneAtChild(TreeListItemData child, int index) - { + { NotifyDataChanged(ChangedType.AddCloneAtChild, child, index); // UI에 트리 구조 변경 알림 } @@ -378,9 +378,9 @@ namespace UVC.UI.List.Tree if (_parent != null && _parent.Children.Contains(this)) _parent.Children.Remove(this); _parent = null; if (OnDataChanged != null) OnDataChanged = null; - if(OnSelectionChanged != null) OnSelectionChanged = null; - if(OnClickAction != null) OnClickAction = null; - if(Children != null) + if (OnSelectionChanged != null) OnSelectionChanged = null; + if (OnClickAction != null) OnClickAction = null; + if (Children != null) { Children.Clear(); } @@ -390,7 +390,7 @@ namespace UVC.UI.List.Tree /// 깊은 복제본을 생성합니다(자식까지 재귀 복제). ///
/// 복제된 새 인스턴스. - public TreeListItemData Clone() + public TreeListItemData CloneWithChild() { TreeListItemData clone = new TreeListItemData(); clone.Name = this.Name; @@ -399,11 +399,25 @@ namespace UVC.UI.List.Tree clone.IsSelected = this.IsSelected; foreach (var child in this.Children) { - clone.AddChild(child.Clone()); + clone.AddChild(child.CloneWithChild()); } return clone; } + /// + /// 현재 인스턴스의 복사본인 의 새 인스턴스를 생성합니다. + /// + /// 현재 인스턴스와 동일한 속성 값을 가진 새 객체를 생성합니다. + public TreeListItemData Clone() + { + TreeListItemData clone = new TreeListItemData(); + clone.Name = this.Name; + clone.Option = this.Option; + clone.IsExpanded = this.IsExpanded; + clone.IsSelected = this.IsSelected; + return clone; + } + #endregion } diff --git a/Assets/Scripts/UVC/UI/Window/HierarchyWindow.cs b/Assets/Scripts/UVC/UI/Window/HierarchyWindow.cs index 100c3b7a..23e08aff 100644 --- a/Assets/Scripts/UVC/UI/Window/HierarchyWindow.cs +++ b/Assets/Scripts/UVC/UI/Window/HierarchyWindow.cs @@ -1,18 +1,299 @@ -using System; -using System.Collections.Generic; +#nullable enable +using Cysharp.Threading.Tasks; +using DG.Tweening; using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Threading; +using TMPro; using UnityEngine; +using UnityEngine.UI; using UVC.UI.List.Tree; namespace UVC.UI.Window { - public class HierarchyWindow: MonoBehaviour + public class HierarchyWindow : MonoBehaviour { [SerializeField] protected TreeList treeList; + /// + /// 검색 결과 용 목록 + /// + [SerializeField] + protected TreeList treeListSearch; + + [SerializeField] + protected TMP_InputField inputField; + + [SerializeField] + protected Button clearTextButton; + + [SerializeField] + protected Image loadingImage; + + // 검색 목록에서 선택된 항목(클론된 데이터) + private TreeListItemData? selectedSearchItem; + + // 검색 작업 상태 + private CancellationTokenSource? searchCts; + private bool isSearching = false; + private float searchProgress = 0f; //unused for visual progress now but kept for future + + [SerializeField] + [Tooltip("로딩 아이콘 회전 속도(도/초)")] + private float loadingRotateSpeed = 360f; + + [SerializeField] + [Tooltip("로딩 이미지의 채우기 애니메이션 속도(사이클/초)")] + private float loadingFillCycle = 0.5f; // cycles per second (full0->1->0 cycle per second) + //loadingRotateSpeed 360 일때, loadingFillCycle를 0.5 보다 높게 설정하면 이상해 보임 + + // DOTween tweens + private Tween? loadingRotationTween; + private Tween? loadingFillTween; + + private void Awake() + { + loadingImage.gameObject.SetActive(false); + + treeListSearch.gameObject.SetActive(false); + inputField.onSubmit.AddListener(OnInputFieldSubmit); + + // 검색 리스트의 선택 변경을 감지 + if (treeListSearch != null) + { + treeListSearch.OnItemSelectionChanged += OnSearchSelectionChanged; + } + + clearTextButton.onClick.AddListener(() => + { + inputField.text = string.Empty; + // 취소 + CancelSearch(); + + treeListSearch.gameObject.SetActive(false); + treeList.gameObject.SetActive(true); + + // 검색에서 선택한 항목이 있으면 원본 트리에서 동일 항목을 선택하고 펼침 + if (selectedSearchItem != null && treeList != null) + { + // 원본 데이터 찾기 (이 프로젝트의 Equals는 Name 기반이므로 Name으로 검색) + var target = treeList.AllItemDataFlattened.FirstOrDefault(i => i.Name == selectedSearchItem.Name); + if (target != null) + { + // TreeList에 새로 추가된 유틸리티를 이용해 부모 체인을 펼치고 선택 처리 + treeList.RevealAndSelectItem(target, true); + } + + selectedSearchItem = null; + } + }); + } + + private void Update() + { + // DOTween handles the animations; no per-frame logic needed here + } + + private void StartLoadingAnimation() + { + if (loadingImage == null) return; + + // Ensure any previous tweens are killed + StopLoadingAnimation(); + + loadingImage.fillAmount = 0f; + loadingImage.transform.localRotation = Quaternion.identity; + loadingImage.gameObject.SetActive(true); + + // Rotation: rotate360 degrees repeatedly. Duration for one360 rotation (seconds) + float rotDuration = (loadingRotateSpeed != 0f) ? (360f / Mathf.Abs(loadingRotateSpeed)) : 1f; + // Use LocalAxisAdd to rotate continuously + loadingRotationTween = loadingImage.transform.DOLocalRotate(new Vector3(0f, 0f, -360f), rotDuration, RotateMode.LocalAxisAdd) + .SetEase(Ease.Linear) + .SetLoops(-1, LoopType.Restart); + + // Fill animation:0 ->1 ->0 in one cycle. Forward duration = half cycle + // For a0->1 then jump-to-0 repeat, use Restart loop and full cycle duration + float fullDuration = (loadingFillCycle > 0f) ? (1f / loadingFillCycle) :1f; + loadingFillTween = DOTween.To(() => loadingImage.fillAmount, x => loadingImage.fillAmount = x, 1f, fullDuration) + .SetEase(Ease.InOutSine) + .SetLoops(-1, LoopType.Yoyo); + } + + private void StopLoadingAnimation() + { + if (loadingRotationTween != null) + { + loadingRotationTween.Kill(); + loadingRotationTween = null; + } + + if (loadingFillTween != null) + { + loadingFillTween.Kill(); + loadingFillTween = null; + } + + if (loadingImage != null) + { + loadingImage.gameObject.SetActive(false); + // reset transform / fill + loadingImage.transform.localRotation = Quaternion.identity; + loadingImage.fillAmount = 0f; + } + } + + private void CancelSearch() + { + if (searchCts != null) + { + try { searchCts.Cancel(); } catch { } + searchCts.Dispose(); + searchCts = null; + } + isSearching = false; + searchProgress = 0f; + + // stop DOTween animations + StopLoadingAnimation(); + } + + private async void OnSearchSelectionChanged(TreeListItemData data, bool isSelected) + { + if (isSelected) + { + selectedSearchItem = data; + } + else if (selectedSearchItem == data) + { + selectedSearchItem = null; + } + } + + private void OnInputFieldSubmit(string text) + { + // 기존 검색 취소 + CancelSearch(); + + // 검색어가 있으면 검색 결과 목록 표시 + if (!string.IsNullOrEmpty(text)) + { + treeListSearch.gameObject.SetActive(true); + treeList.gameObject.SetActive(false); + + // 시작 애니메이션 + StartLoadingAnimation(); + + searchCts = new CancellationTokenSource(); + // 비동기 검색 실행(UITask 스타일: 메인스레드에서 작업을 분할하여 UI가 멈추지 않게 함) + _ = PerformSearchAsync(text, searchCts.Token); + } + else + { + treeListSearch.gameObject.SetActive(false); + treeList.gameObject.SetActive(true); + } + + } + + /// + /// 검색을 메인 스레드에서 분할 처리하여 UI 업데이트(로딩 애니메이션)가 가능하도록 구현합니다. + /// + private async UniTaskVoid PerformSearchAsync(string text, CancellationToken token) + { + isSearching = true; + searchProgress = 0f; + + var results = new System.Collections.Generic.List(); + + var sourceList = treeList?.AllItemDataFlattened; + if (sourceList == null) + { + isSearching = false; + StopLoadingAnimation(); + return; + } + + int total = sourceList.Count; + if (total == 0) + { + isSearching = false; + StopLoadingAnimation(); + return; + } + + // 소문자 비교 준비 + string lower = text.ToLowerInvariant(); + + // 분할 처리: 일정 갯수마다 await으로 제어권을 반환 + const int chunk = 100; // 한 번에 처리할 항목 수 (조절 가능) + for (int i = 0; i < total; i++) + { + token.ThrowIfCancellationRequested(); + + var item = sourceList[i]; + if (!string.IsNullOrEmpty(item.Name) && item.Name.ToLowerInvariant().Contains(lower)) + { + results.Add(item); + } + + // 진행도 업데이트 (내부 사용) + if ((i % chunk) == 0) + { + searchProgress = (float)i / (float)total; + await UniTask.Yield(PlayerLoopTiming.Update); + } + } + + // 최종 진행도 + searchProgress = 1f; + + // UI 반영은 메인 스레드에서 + await UniTask.SwitchToMainThread(); + + try + { + if (token.IsCancellationRequested) return; + + treeListSearch.ClearItems(); + foreach (var r in results) + { + treeListSearch.AddItem(r.Clone()); + } + + // 로딩 종료 + isSearching = false; + searchProgress = 0f; + StopLoadingAnimation(); + } + catch (System.Exception ex) + { + Debug.LogError($"PerformSearchAsync error: {ex}"); + } + finally + { + if (searchCts != null) + { + searchCts.Dispose(); + searchCts = null; + } + } + } + + + private void OnDestroy() + { + inputField.onSubmit.RemoveListener(OnInputFieldSubmit); + clearTextButton.onClick.RemoveAllListeners(); + + if (treeListSearch != null) + { + treeListSearch.OnItemSelectionChanged -= OnSearchSelectionChanged; + } + + CancelSearch(); + } + public void AddItem(TreeListItemData data) { treeList.AddItem(data); diff --git a/instruction.md b/instruction.md new file mode 100644 index 00000000..a7eb9d59 --- /dev/null +++ b/instruction.md @@ -0,0 +1,633 @@ +# Unity 개발 지침(MVVM/MVC · 성능 · 주석 · 직렬화 · Nullable) + +본 지침은 Unity에서 디자인(View)과 로직(Model/Service/ViewModel)을 분리하고, 성능과 주석 품질을 일관되게 유지하기 위한 실전 규칙과 샘플 코드를 제공합니다. 현 프로젝트 스타일(#nullable enable, UniTask, DOTween, 한국어 주석)에 맞춰 작성되었습니다. + +## 1) 권장 아키텍처(요약) +- View(UI): 데이터 바인딩/이벤트 라우팅만 담당. 연산/상태 보유 금지. +- Model/Service/ViewModel: 상태, 연산, 데이터 흐름을 담당. MonoBehaviour 비의존(테스트 용이). +- 느슨한 결합: 인터페이스/이벤트/메시지로 연결해 교체·테스트 쉬움. +- Prefab 경로 직렬화: GameObject 직접 참조 대신 문자열 경로 보관, 런타임 로드. +- C# Nullable: 파일 선두에 `#nullable enable`, 모든 참조형에 `?`를 명시하고 널 처리. +- 비동기: 전역적으로 `Cysharp.Threading.Tasks.UniTask` 사용. `Task`/코루틴 대신 UniTask 우선, `CancellationToken` 전달. +- 패턴 선택: + - MVVM: UI 상태/양방향 동기화가 많을 때 권장. + - MVC: 입력 → 도메인 액션 → UI 반영 흐름이 단순할 때 권장. + +## 2) 폴더 구조(예시) +- `Assets/Scripts/Architecture` + - `Model`, `View`, `ViewModel(or Controller)`, `Services(Loader/Repository)`, `Serialization` +- `Assets/Prefabs`, `Assets/Resources`(또는 Addressables) +- Scene 수와 무관하게 ViewModel은 Scene에 종속되지 않게 유지. + +## 3) 주석·문서화 원칙(C# XML 스타일) +- 클래스 주석: 역할/책임/사용 예를 자세히. +- 메서드 주석: 요약 + 파라미터/반환/예외. 복잡 로직만 상세, 단순 로직은 한 줄. +- 속성 주석: 한 줄 요약. +- 코드와 불일치한 주석은 즉시 수정(“왜 변경했는지”를 남김). +- 인텔리센스 문서 출력: + - 프로젝트 속성 > Build > __XML documentation file__ + - 솔루션 전체 분석: __Tools > Options > Text Editor > C# > Advanced > Enable full solution analysis__ + - 정적 분석: __Analyze > Run Code Analysis__ + - 경고 엄격: 프로젝트 속성 > Build > __Treat warnings as errors__ + +## 4) 성능 체크리스트(UI/게임 루프) +- Update에서 GC 할당 금지: LINQ/문자열 연결/클로저 생성 지양, 캐시·풀 사용. +- DOTween: 트윈 핸들 보관, 수명 종료 시 `Kill()`, `SetUpdate(true)` 사용 여부 명확화. +- RectTransform 픽셀 정렬: 비정수 스케일/서브픽셀로 인한 블러 방지. +- 텍스처 Import: + - 과도 축소/회전 시 `MipMaps` + `Trilinear`, 압축 품질 조정. + - 초소형 아이콘은 전용 해상도 제작(예: 10/16/24px). +- 비동기 처리: UniTask + `CancellationToken` 지원. +- 대량 목록: 가상화(Recycler), 청크 처리(예: 100개 처리마다 `await UniTask.Yield()`). +- Canvas Rebuild 최소화: 대량 활성/비활성 시 부모를 잠시 비활성 후 일괄 적용, 마지막에 활성. +- Layout 강제 재빌드 사용 절제: `LayoutRebuilder.ForceRebuildLayoutImmediate`는 배치/프레임 단위 최소 호출. +- TextMeshPro: 기본은 오토 사이즈 비활성, 필요한 화면만 전용 폰트/사이즈 프리셋 사용. + +## 5) 직렬화 가이드(Prefab 경로 기반) +- ScriptableObject/MonoBehaviour에는 GameObject 참조 대신 “경로 문자열”을 직렬화. +- 로더 레이어는 Addressables(권장) 또는 `Resources.Load`로 추상화. +- 경로 변환/검증 유틸은 한 곳에서 관리하고, 런타임 Null을 안전하게 처리. + +## 6) MVVM/MVC 선택 가이드 +- MVVM: + - ViewModel은 순수 C#(MonoBehaviour 비의존). + - 다수의 UI 상태/양방향 바인딩, 테스트·모킹 용이. +- MVC: + - 입력 흐름 단순, 컨트롤러가 명령을 조정하고 View는 표시만 수행. + +--- + +## 7) 샘플 코드 + +### 7.1 Prefab 경로 직렬화 유틸(Nullable, 예제 포함) +```c# +#nullable enable +using System; +using System.Threading; +using Cysharp.Threading.Tasks; +using UnityEngine; + +namespace Architecture.Serialization +{ + /// + /// 프리팹 참조를 직렬화 친화적인 문자열 경로로 보관합니다. + /// + /// 사용 예: + /// + /// CreateSpinnerAsync(CancellationToken ct) + /// { + /// var prefab = await spinnerPrefab.LoadAsync(ct); + /// return prefab != null ? GameObject.Instantiate(prefab) : null; + /// } + /// ]]> + /// + /// + [Serializable] + public struct PrefabRef + { + [SerializeField] private string _path; // "UI/Spinner" (Resources) 또는 Addressables 키 + + /// 프리팹 경로(읽기 전용). + public string Path => _path ?? string.Empty; + + /// 비어있는지 여부. + public bool IsEmpty => string.IsNullOrWhiteSpace(_path); + + /// + /// 프리팹을 동기 로드(Resources). Addressables는 LoadAsync 사용 권장. + /// + public GameObject? Load() + { +#if USE_ADDRESSABLES + Debug.LogWarning("Addressables 사용 시 LoadAsync를 사용하세요."); + return null; +#else + return string.IsNullOrEmpty(_path) ? null : Resources.Load(_path); +#endif + } + + /// + /// 프리팹을 비동기 로드합니다. + /// + /// 취소 토큰. + public async UniTask LoadAsync(CancellationToken ct = default) + { +#if USE_ADDRESSABLES + if (string.IsNullOrEmpty(_path)) return null; + var handle = UnityEngine.AddressableAssets.Addressables.LoadAssetAsync(_path); + try + { + await handle.Task.AsUniTask().AttachExternalCancellation(ct); + return handle.Status == UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationStatus.Succeeded + ? handle.Result + : null; + } + finally + { + // 필요 시 Release는 Instantiate 후에 호출합니다. + // Addressables.Release(handle); + } +#else + if (string.IsNullOrEmpty(_path)) return null; + var request = Resources.LoadAsync(_path); + await request.AsUniTask(cancellationToken: ct); + return request.asset as GameObject; +#endif + } + + /// 경로를 명시적으로 설정합니다. + public PrefabRef(string path) => _path = path; + } +} +``` + + +### 7.2 Model + ViewModel(초보자용 주석 포함, 단순 로직은 간단히) +```c# +#nullable enable +using System; +using Architecture.Serialization; +using UnityEngine; + +namespace Architecture.Model +{ + /// + /// 할 일 아이템 모델. + /// + /// 책임: + /// - 데이터 보유(Name/완료 여부/아이콘 프리팹) + /// - 변경 통지 이벤트 제공 + /// + /// 사용 예: + /// + /// Debug.Log($"Changed: {i.Name}"); + /// ]]> + /// + /// + [Serializable] + public sealed class TodoItem + { + /// 표시 이름. + public string Name { get; private set; } + + /// 완료 여부. + public bool IsCompleted { get; private set; } + + /// 아이콘 프리팹 경로. + public PrefabRef IconPrefab { get; private set; } + + /// 모델 변경 이벤트. + public event Action? OnChanged; + + public TodoItem(string name, bool isCompleted = false, PrefabRef iconPrefab = default) + { + Name = name; + IsCompleted = isCompleted; + IconPrefab = iconPrefab; + } + + /// + /// 이름을 변경합니다. + /// + /// 새 이름. + public void Rename(string name) + { + if (Name == name) return; // 단순 가드 + Name = name; + OnChanged?.Invoke(this); + } + + /// 완료/미완료 토글. + public void ToggleCompleted() + { + IsCompleted = !IsCompleted; + OnChanged?.Invoke(this); + } + } +} +``` +```c# +#nullable enable +using System; +using System.Collections.Generic; +using System.Linq; +using Architecture.Model; + +namespace Architecture.ViewModel +{ + /// + /// Todo 목록의 프레젠테이션 상태를 관리하는 ViewModel. + /// + /// 책임: + /// - 모델 컬렉션 보유/필터/정렬 + /// - View에 필요한 이벤트(추가/제거/갱신) 제공 + /// - MonoBehaviour에 의존하지 않음(테스트 용이) + /// + /// 사용 예: + /// + /// Debug.Log(item.Name); + /// vm.Add(new TodoItem("씬 로딩 최적화")); + /// ]]> + /// + /// + public sealed class TodoListViewModel + { + private readonly List _items = new(); + + /// 현재 아이템 스냅샷. + public IReadOnlyList Items => _items; + + public event Action? OnItemAdded; + public event Action? OnItemRemoved; + public event Action? OnItemChanged; + + /// + /// 아이템을 추가합니다. + /// + /// 추가할 모델. + public void Add(TodoItem item) + { + _items.Add(item); + item.OnChanged += HandleItemChanged; + OnItemAdded?.Invoke(item); + } + + /// + /// 아이템을 제거합니다. + /// + /// 제거할 모델. + public void Remove(TodoItem item) + { + if (_items.Remove(item)) + { + item.OnChanged -= HandleItemChanged; + OnItemRemoved?.Invoke(item); + } + } + + /// + /// 간단한 텍스트 필터를 적용한 결과를 반환합니다. + /// + /// 포함할 텍스트(대소문자 무시). + public IEnumerable Filter(string keyword) + { + if (string.IsNullOrWhiteSpace(keyword)) return _items; + var lower = keyword.ToLowerInvariant(); + return _items.Where(i => i.Name.ToLowerInvariant().Contains(lower)); + } + + private void HandleItemChanged(TodoItem item) => OnItemChanged?.Invoke(item); + } +} +``` + + +### 7.3 View(MVVM 바인딩 예, 간단·상세 주석 구분) +```c# +#nullable enable +using System; +using System.Collections.Generic; +using System.Threading; +using Architecture.Model; +using Architecture.Serialization; +using Architecture.ViewModel; +using Cysharp.Threading.Tasks; +using TMPro; +using UnityEngine; +using UnityEngine.UI; + +namespace Architecture.View +{ + /// + /// TodoList의 View. + /// + /// 책임: + /// - ViewModel 이벤트를 구독해 UI 생성/갱신 + /// - 사용자 입력을 ViewModel에 전달 + /// - PrefabRef를 사용해 아이템 프리팹을 런타임 로드/생성 + /// + /// 개선 사항: + /// - Model-View 매핑을 위해 Dictionary를 사용, O(1) 검색으로 성능 향상. + /// - 명시적 핸들러 메서드로 이벤트 구독/해제 대칭성 확보. + /// - async void 대신 UniTask 반환 및 .Forget() 패턴으로 예외 처리 강화. + /// + /// 주의: + /// - 모든 구독/비동기 작업은 OnDestroy에서 해제/취소합니다. + /// + public sealed class TodoListView : MonoBehaviour + { + [Header("UI")] + [SerializeField] private RectTransform _content = null!; + [SerializeField] private TMP_InputField _filterInput = null!; + [SerializeField] private Button _addButton = null!; + [SerializeField] private PrefabRef _itemPrefab; // "UI/TodoItem" 등 + + private readonly CancellationTokenSource _cts = new(); + private readonly Dictionary _rowViews = new(); + private TodoListViewModel _vm = null!; + + private void Awake() + { + // Composition Root에서 주입받는 것을 권장. 여기서는 예시로 직접 생성. + Init(new TodoListViewModel()); + } + + /// + /// ViewModel을 주입하고 UI를 초기화합니다. + /// + public void Init(TodoListViewModel viewModel) + { + _vm = viewModel; + + // 이벤트 구독 (명시적 핸들러 메서드 사용) + _vm.OnItemAdded += OnItemAddedHandler; + _vm.OnItemRemoved += HandleItemRemoved; + _vm.OnItemChanged += HandleItemChanged; + + // 입력 이벤트 + _addButton.onClick.AddListener(OnAddButtonClicked); + _filterInput.onValueChanged.AddListener(OnFilterInputChanged); + } + + /// ViewModel의 OnItemAdded 이벤트 핸들러. + private void OnItemAddedHandler(TodoItem item) + { + HandleItemAdded(item).Forget(ex => Debug.LogError($"[TodoListView] Failed to add item: {ex}")); + } + + /// Add 버튼 클릭 핸들러. + private void OnAddButtonClicked() + { + _vm.Add(new TodoItem("New Task")); + } + + /// 필터 입력 변경 핸들러. + private void OnFilterInputChanged(string value) + { + RebuildFiltered(); + } + + private async UniTask HandleItemAdded(TodoItem item) + { + var prefab = await _itemPrefab.LoadAsync(_cts.Token); + if (prefab == null || _cts.IsCancellationRequested) return; + + var go = Instantiate(prefab, _content); + var row = go.GetComponent(); + if (row != null) + { + row.Bind(item); + _rowViews[item] = row; // 딕셔너리에 추가 + } + } + + private void HandleItemRemoved(TodoItem item) + { + if (_rowViews.TryGetValue(item, out var row)) + { + Destroy(row.gameObject); + _rowViews.Remove(item); // 딕셔너리에서 제거 + } + } + + private void HandleItemChanged(TodoItem item) + { + if (_rowViews.TryGetValue(item, out var row)) + { + row.Refresh(); + } + } + + private void RebuildFiltered() + { + var keyword = _filterInput.text.ToLowerInvariant(); + var hasKeyword = !string.IsNullOrWhiteSpace(keyword); + + foreach (var (item, row) in _rowViews) + { + var visible = !hasKeyword || item.Name.ToLowerInvariant().Contains(keyword); + row.gameObject.SetActive(visible); + } + } + + private void OnDestroy() + { + _cts.Cancel(); + _cts.Dispose(); + + // ViewModel 이벤트 구독 해제 (등록과 대칭) + if (_vm != null) + { + _vm.OnItemAdded -= OnItemAddedHandler; + _vm.OnItemRemoved -= HandleItemRemoved; + _vm.OnItemChanged -= HandleItemChanged; + } + + // UI 이벤트 구독 해제 + _addButton.onClick.RemoveListener(OnAddButtonClicked); + _filterInput.onValueChanged.RemoveListener(OnFilterInputChanged); + } + } + + /// + /// 개별 Row(View) 컴포넌트. + /// - 간단 로직: 바인딩/리프레시만 담당 + /// + public sealed class TodoRowView : MonoBehaviour + { + [SerializeField] private TMP_Text _nameText = null!; + [SerializeField] private Toggle _completedToggle = null!; + + /// 현재 바인딩된 모델(읽기 전용). + public TodoItem? BoundItem { get; private set; } + + /// + /// Row를 모델에 바인딩합니다. + /// + /// 바인딩할 모델. + public void Bind(TodoItem item) + { + BoundItem = item; + _completedToggle.onValueChanged.AddListener(OnToggleChanged); + Refresh(); + } + + /// UI를 현재 모델 값으로 갱신합니다. + public void Refresh() + { + if (BoundItem == null) return; + _nameText.text = BoundItem.Name; + _completedToggle.SetIsOnWithoutNotify(BoundItem.IsCompleted); + } + + private void OnToggleChanged(bool value) + { + // 단순 전달: 모델 토글 + BoundItem?.ToggleCompleted(); + } + + private void OnDestroy() + { + _completedToggle.onValueChanged.RemoveListener(OnToggleChanged); + } + } +} +``` + +--- + +## 8) 현 코드베이스(HierarchyWindow 등) 적용 팁 +- 긴 작업(검색 등)은 현재처럼 청크 처리 + `await UniTask.Yield()`로 UI 프리즈 방지. +- 로딩 아이콘/초소형 UI: + - 과도 축소 시 MipMap + Trilinear를 켜거나, 전용 해상도 스프라이트 사용. + - 회전보다는 Image `Filled` + `fillAmount` 애니메이션이 초소형에서 더 깔끔. +- DOTween 트윈: 멤버로 보관, `OnDestroy`/취소 시 `Kill()` 처리(현재 코드가 모범 사례). +- `#nullable enable` 유지, `UnityEngine.Object` 계열도 `?` 표기 후 Null 체크. +- 입력/검색 UI는 View, 검색 로직/필터는 ViewModel로 추출하면 테스트·교체 용이. + +## 9) 품질 자동화(선택) +- StyleCop.Analyzers, Roslynator로 XML 주석/네이밍 규칙 검사. +- `.editorconfig`에 문서 주석 필수 규칙 설정. +- VS에서 정기 점검: __Analyze > Run Code Analysis__, 빌드에서 __Treat warnings as errors__. +- CI에서 XML 문서 누락/nullable 경고를 실패로 처리해 조기 차단. +- 권장 `.editorconfig` 요약: + - `dotnet_diagnostic.CS1591.severity = error` (공개 멤버 문서 주석 필수) + - `dotnet_analyzer_diagnostic.category-Style.severity = warning` + - `dotnet_analyzer_diagnostic.category-Nullable.severity = error` + - `dotnet_diagnostic.IDE0060.severity = warning` (사용 안 하는 매개변수) + - `dotnet_style_qualification_for_field = true:suggestion` + +--- + +## 10) 권장 디자인 패턴 +- DI/Composition Root + - 언제: 서비스/로더/뷰모델 주입이 필요할 때 초기화 지점을 일원화합니다. + - 팁: 경량 수동 DI 권장(프레임워크 미사용). 씬 부팅 지점에 구성 루트를 두고 팩토리/인터페이스를 통해 의존성을 명시적으로 연결합니다. +- Event Aggregator/Mediator + - 언제: 윈도우/패널/리스트 간 통신을 느슨하게 연결하고 싶을 때. + - 팁: 강타입 메시지 구조체를 사용하고 구독 해제를 일원화합니다. 남용 시 디버깅이 어려울 수 있습니다. +- Command (+ Undo/Memento) + - 언제: UI 액션(삭제/이동/이름 변경 등)에 되돌리기가 필요할 때. + - 팁: `ExecuteAsync(CancellationToken)`/`UndoAsync(...)`는 `UniTask`를 반환하고, 스택으로 관리합니다. +- Strategy + - 언제: 정렬/필터/드롭 배치 규칙을 교체 가능하게 설계할 때. + - 팁: `ISortStrategy`/`IFilterStrategy` 등 인터페이스를 정의하고 Update 중 할당을 피합니다. +- State/Finite State Machine + - 언제: 편집/선택/드래그 등 모드 전환이 분명할 때. + - 팁: `EnterAsync/ExitAsync`는 `UniTask`를 사용하고 `CancellationToken`을 전파합니다. +- Factory/Abstract Factory + - 언제: 프리팹/뷰 생성 경로와 정책을 캡슐화할 때. + - 팁: `PrefabRef`(+Addressables)를 `IViewFactory`로 감싸고 토큰을 전달합니다. +- Object Pool + - 언제: 다량의 리스트 아이템/툴팁/이펙트를 재사용할 때. + - 팁: `IPoolable.OnRent/OnReturn` 훅을 제공하고 `DOTween.Kill()` 등 수명 종료 처리를 확실히 합니다. +- Repository + Unit of Work + - 언제: 데이터 소스(파일/원격/메모리)를 교체 가능하게 할 때. + - 팁: VM은 `ITodoRepository`에 의존하고 배치 저장은 UoW로 묶습니다. +- Facade/Adapter + - 언제: 서드파티/플랫폼 API를 감싸서 단순화할 때. + - 팁: 테스트 더블을 쉽게 주입할 수 있습니다. +- Composite + - 언제: 트리 구조를 모델링할 때. + - 팁: 노드 공통 인터페이스와 자식 컬렉션만 노출하고 뷰는 Composite만 알도록 합니다. +- Visitor + - 언제: 트리 순회 작업(검색/선택 동기화/통계)을 추가할 때. + - 팁: 순회 로직을 방문자로 분리해 재사용성을 높입니다. +- Template Method + - 언제: 리스트 아이템 바인딩/갱신 단계를 표준화할 때. + - 팁: 공통 베이스 `ListItemView`에 훅 메서드를 제공합니다. +- Builder + - 언제: 복잡한 UI 구성이나 `DOTween` 시퀀스 생성을 읽기 쉽게 만들 때. + - 팁: 체이닝으로 가독성을 높이고 재사용 가능한 빌더를 제공합니다. +- Flyweight/Prototype (ScriptableObject) + - 언제: 공유 불변 데이터/기본 설정을 여러 객체에서 공용으로 사용할 때. + - 팁: ScriptableObject로 메모리를 공유하고 런타임 인스턴스는 얕은 복제를 사용합니다. +- Null Object + - 언제: 선택 없음/루트 노드 등에서 null 분기를 제거하고 싶을 때. + - 팁: `INode`의 빈 구현을 제공해 분기 삭제와 안정성을 높입니다. + +## 11) 비동기(UniTask) 규약 +- 공개 비동기 API는 `UniTask`/`UniTask`를 반환합니다. `async void`는 지양합니다. +- 모든 비동기 메서드에 `CancellationToken` 인자를 제공하고 `AttachExternalCancellation`로 연결합니다. +- Fire-and-forget은 예외 로깅 후 `.Forget()`을 제한적으로 사용합니다. +- 메인 스레드가 필요한 경우 `UniTask.SwitchToMainThread()`를 명시적으로 호출합니다. + +## 12) Addressables/Resources 규약 +- 전처리기 기호: Addressables 사용 시 `Player Settings > Scripting Define Symbols`에 `USE_ADDRESSABLES`를 설정합니다. +- 로드/수명: `LoadAssetAsync`로 얻은 핸들은 참조 수명 관리 후 `Addressables.Release(handle)`로 해제합니다. 인스턴스 생성 후에는 에셋 참조를 유지할 필요가 없으면 해제합니다. +- Instantiate 정책: 다중 인스턴스가 필요하면 `Addressables.InstantiateAsync` 사용을 우선 고려합니다(완료 후 `Addressables.ReleaseInstance`). +- Resources 경로 규약: 경로는 `Resources/` 하위 루트 기준 상대 경로를 사용합니다. Addressables 전환 시 키/그룹/레이블 매핑 표를 준비합니다. +- 전환 체크리스트: 키 네임 규칙, 그룹 빌드/로드 모드, 레이블 기반 로드, Release 누락 검토, 메모리 프로파일 확인. + +## 13) UniTask 취소/예외 처리 상세 +- `CancellationTokenSource` 소유권은 생성한 컴포넌트가 갖습니다. `MonoBehaviour`는 `OnDestroy`에서 `Cancel/Dispose`를 호출합니다. +- 토큰 결합: `CancellationTokenSource.CreateLinkedTokenSource(parent, this._cts.Token)`를 사용해 상위/로컬 토큰을 결합합니다. +- 타임아웃: `using var timeout = new CancellationTokenSource(); timeout.CancelAfter(TimeSpan.FromSeconds(5));` +- 예외 정책: 공개 API는 예외를 전파하고, fire-and-forget은 로깅 후 `.Forget()`을 사용합니다. + +## 14) 스레딩 모델 +- CPU 바운드 작업은 `UniTask.Run`으로 워커 스레드에서 처리하고, Unity API 접근 전 `UniTask.SwitchToMainThread`를 호출합니다. +- IO 바운드는 가능한 비동기 API를 우선 사용합니다(파일/네트워크/주소가능). + +## 15) 이벤트/구독 수명 주기 +- 모든 구독은 등록 지점과 해제 지점을 명시합니다. 컬렉션/모델 이벤트는 명시적으로 해제합니다. +- UI 이벤트(`Button.onClick`, `Toggle.onValueChanged`)는 `OnDestroy`에서 일괄 해제합니다. +- `Bind/Unbind` 패턴을 사용해 View의 수명과 구독 수명을 일치시킵니다. + +## 16) 오브젝트 풀 정책 +- 대량 생성/파괴 대상은 풀을 사용합니다. 항목은 `IPoolable.OnRent/OnReturn` 훅을 구현합니다. +- 트윈/코루틴 등 외부 작업은 반환 시 `DOTween.Kill()` 또는 `DOKill()`로 종료합니다. +- 부모 재설정 최적화: 반환 시 풀 컨테이너로 재부모, 좌표/스케일 초기화 최소화. +- 풀 용량 정책: 최대치/증가 단위 정의, 초과 시 로그 경고 옵션 제공. + +## 17) 수동 DI(Composition Root) 예시 +- 씬 부팅 스크립트에서 인터페이스 구현체를 생성하고 주입합니다. 프레임워크 없이 팩토리/생성자 주입을 사용합니다. +```c# +public sealed class AppBootstrap : MonoBehaviour +{ + private void Awake() + { + // ILogger logger = new UnityLogger(); + // ITodoRepository repo = new FileTodoRepository(logger); + // IViewFactory viewFactory = new AddressablesViewFactory(logger); + + // 1. ViewModel 생성 + var vm = new Architecture.ViewModel.TodoListViewModel(); + + // 2. View 인스턴스 찾기 + var window = FindObjectOfType(); + + // 3. 의존성 주입 + if (window != null) + { + // window.Init(vm, viewFactory, logger); // 더 많은 의존성이 있다면 Init 메서드를 확장 + window.Init(vm); + } + } +} +``` +- 네이밍 컨벤션: 인터페이스 `I*`, 팩토리 `*Factory`, 리포지토리 `*Repository`. + +## 18) 테스트 가이드 +- ViewModel 단위 테스트(NUnit) 권장: MonoBehaviour에 의존하지 않게 유지합니다. +- 에디트 모드/플레이 모드 테스트를 분리하고 CI에서 두 모드를 실행합니다. +- 기본 템플릿(요약): 생성/추가/삭제/이벤트 발행 검증, 필터 로직 검증. + +## 19) 대규모 리스트 가상화 +- `ScrollRect` + Recycler 패턴을 권장합니다. +- 핵심 인터페이스 예시: `IItemProvider`(데이터 크기/아이템 생성), `IItemRenderer`(Bind/Unbind/Refresh). +- 스크롤 오프셋 ↔ 인덱스 매핑 규약을 문서화하고, 배치 업데이트 시 `await UniTask.Yield()`로 프리즈를 방지합니다. + +## 20) UnityEngine.Object와 Nullable 주의 +- Unity는 `== null` 연산자를 오버로드하므로 순수 참조 null 확인 시 `ReferenceEquals(obj, null)` 사용을 고려합니다. +- `UnityEngine.Object` 파괴된 인스턴스는 `null`처럼 동작할 수 있으므로 사용 전 유효성 검사를 수행합니다. +- 직렬화 필드에 `?`를 표기하고, 런타임 Null/파괴 상태를 방어적으로 처리합니다. + +--- +본 문서는 템플릿으로 재사용 가능하며, 신규 컴포넌트(클래스/메서드/속성)마다 동일한 주석·패턴을 유지하면 초보자도 구조와 의도를 빠르게 파악할 수 있습니다. \ No newline at end of file