From f7befb048cabb816cb7cb94c83b71544ae8fe213 Mon Sep 17 00:00:00 2001 From: logonkhi Date: Wed, 30 Jul 2025 20:16:21 +0900 Subject: [PATCH] =?UTF-8?q?draggableList/Tab=20=EA=B0=9C=EB=B0=9C=20?= =?UTF-8?q?=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pretendard/Pretendard-ExtraBold SDF.asset | 8 +- .../Factory.meta => UI/Alarm.meta} | 2 +- .../Alarm}/AlarmIconManager.prefab | 0 .../Alarm}/AlarmIconManager.prefab.meta | 0 .../{Factory => UI/Alarm}/AlarmManager.prefab | 0 .../Alarm}/AlarmManager.prefab.meta | 0 .../Alarm}/AlarmSingleIconManager.prefab | 0 .../Alarm}/AlarmSingleIconManager.prefab.meta | 0 Assets/Resources/Prefabs/UI/List.meta | 8 + .../Prefabs/UI/List/DraggableListItem.prefab | 1039 ++++++++ .../UI/List/DraggableListItem.prefab.meta | 7 + .../UI/List/DraggableScrollList.prefab | 99 + .../UI/List/DraggableScrollList.prefab.meta | 7 + .../Prefabs/UI/Loading/UILoading.prefab | 3 +- .../Prefabs/UI/Loading/UILoadingBar.prefab | 18 +- .../{Factory => UI/Modal}/InfoWindow.prefab | 0 .../Modal}/InfoWindow.prefab.meta | 0 .../Prefabs/{Factory => UI}/Playback.meta | 0 .../Playback/UIDropdown.prefab | 0 .../Playback/UIDropdown.prefab.meta | 0 .../Playback/UIPlayback.prefab | 875 +------ .../Playback/UIPlayback.prefab.meta | 0 .../Playback/UIPlaybackListItem.prefab | 0 .../Playback/UIPlaybackListItem.prefab.meta | 0 .../Playback/UIPlaybackListModal.prefab | 0 .../Playback/UIPlaybackListModal.prefab.meta | 0 .../UI/Playback/UIPlaybackProgressBar.prefab | 756 ++++++ .../UIPlaybackProgressBar.prefab.meta | 7 + .../{Factory => UI}/Playback/images.meta | 0 .../images/UIDropdown_menu_bottom.png | Bin .../images/UIDropdown_menu_bottom.png.meta | 0 .../images/UIDropdown_menu_middle.png | Bin .../images/UIDropdown_menu_middle.png.meta | 0 .../Playback/images/UIDropdown_menu_one.png | Bin .../images/UIDropdown_menu_one.png.meta | 0 .../Playback/images/UIDropdown_menu_top.png | Bin .../images/UIDropdown_menu_top.png.meta | 0 .../UIPlaybackListItem_deleteButton.png | Bin .../UIPlaybackListItem_deleteButton.png.meta | 0 .../UIPlaybackListItem_downloadButton.png | Bin ...UIPlaybackListItem_downloadButton.png.meta | 0 .../UIPlaybackListItem_loadingImage.png | Bin .../UIPlaybackListItem_loadingImage.png.meta | 0 .../UIPlaybackListItem_selectedImage.png | Bin .../UIPlaybackListItem_selectedImage.png.meta | 0 .../images/UIPlaybackListItem_stopButton.png | Bin .../UIPlaybackListItem_stopButton.png.meta | 0 .../images/UIPlaybackListModal_arrow.png | Bin .../images/UIPlaybackListModal_arrow.png.meta | 0 .../Playback/images/UIPlayback_pause.png | Bin .../Playback/images/UIPlayback_pause.png.meta | 0 .../Playback/images/UIPlayback_play.png | Bin .../Playback/images/UIPlayback_play.png.meta | 0 Assets/Resources/Prefabs/UI/Tab.meta | 8 + Assets/Scenes/SampleProject.unity | 2210 ++++++++++++++++- Assets/Scripts/SampleProject/SceneMain.cs | 18 +- Assets/Scripts/UVC/Data/Core/DataArray.cs | 13 +- Assets/Scripts/UVC/Data/DataRepository.cs | 4 +- .../UVC/Factory/Modal/ConfigDataOrderModal.cs | 75 + .../Modal/ConfigDataOrderModal.cs.meta | 2 + .../UVC/Factory/Playback/PlaybackCommand.cs | 46 +- .../Factory/Playback/PlaybackRepository.cs | 113 +- .../Factory/Playback/PlaybackSQLiteService.cs | 110 +- .../UVC/Factory/Playback/PlaybackService.cs | 116 +- .../UVC/Factory/Playback/UI/UIPlayback.cs | 306 +-- .../Playback/UI/UIPlaybackController.cs | 283 +++ .../Playback/UI/UIPlaybackController.cs.meta | 2 + .../Factory/Playback/UI/UIPlaybackListItem.cs | 135 +- .../Playback/UI/UIPlaybackListModal.cs | 112 +- .../Playback/UI/UIPlaybackProgressBar.cs | 100 +- Assets/Scripts/UVC/UI/List.meta | 8 + Assets/Scripts/UVC/UI/List/DraggableItem.cs | 53 + .../Scripts/UVC/UI/List/DraggableItem.cs.meta | 2 + .../Scripts/UVC/UI/List/DraggableItemData.cs | 42 + .../UVC/UI/List/DraggableItemData.cs.meta | 2 + .../Scripts/UVC/UI/List/DraggableListItem.cs | 191 ++ .../UVC/UI/List/DraggableListItem.cs.meta | 2 + .../UVC/UI/List/DraggableScrollList.cs | 1075 ++++++++ .../UVC/UI/List/DraggableScrollList.cs.meta | 2 + Assets/Scripts/UVC/UI/Loading/UILoading.cs | 161 +- Assets/Scripts/UVC/UI/Loading/UILoadingBar.cs | 127 +- Assets/Scripts/UVC/UI/Tab.meta | 8 + Assets/Scripts/UVC/UI/Tab/ITabContent.cs | 16 + Assets/Scripts/UVC/UI/Tab/ITabContent.cs.meta | 2 + Assets/Scripts/UVC/UI/Tab/TabButtonView.cs | 113 + .../Scripts/UVC/UI/Tab/TabButtonView.cs.meta | 2 + Assets/Scripts/UVC/UI/Tab/TabContentConfig.cs | 29 + .../UVC/UI/Tab/TabContentConfig.cs.meta | 2 + Assets/Scripts/UVC/UI/Tab/TabContentLoader.cs | 285 +++ .../UVC/UI/Tab/TabContentLoader.cs.meta | 2 + Assets/Scripts/UVC/UI/Tab/TabController.cs | 352 +++ .../Scripts/UVC/UI/Tab/TabController.cs.meta | 2 + Assets/Scripts/UVC/UI/Tab/TabData.cs | 37 + Assets/Scripts/UVC/UI/Tab/TabData.cs.meta | 2 + Assets/Scripts/UVC/UI/Tab/TabModel.cs | 183 ++ Assets/Scripts/UVC/UI/Tab/TabModel.cs.meta | 2 + Assets/Scripts/UVC/UI/Tab/TabView.cs | 481 ++++ Assets/Scripts/UVC/UI/Tab/TabView.cs.meta | 2 + Assets/Scripts/UVC/UI/UIDragger.cs | 324 ++- 99 files changed, 8819 insertions(+), 1172 deletions(-) rename Assets/Resources/Prefabs/{SampleProject/Factory.meta => UI/Alarm.meta} (77%) rename Assets/Resources/Prefabs/{Factory => UI/Alarm}/AlarmIconManager.prefab (100%) rename Assets/Resources/Prefabs/{Factory => UI/Alarm}/AlarmIconManager.prefab.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI/Alarm}/AlarmManager.prefab (100%) rename Assets/Resources/Prefabs/{Factory => UI/Alarm}/AlarmManager.prefab.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI/Alarm}/AlarmSingleIconManager.prefab (100%) rename Assets/Resources/Prefabs/{Factory => UI/Alarm}/AlarmSingleIconManager.prefab.meta (100%) create mode 100644 Assets/Resources/Prefabs/UI/List.meta create mode 100644 Assets/Resources/Prefabs/UI/List/DraggableListItem.prefab create mode 100644 Assets/Resources/Prefabs/UI/List/DraggableListItem.prefab.meta create mode 100644 Assets/Resources/Prefabs/UI/List/DraggableScrollList.prefab create mode 100644 Assets/Resources/Prefabs/UI/List/DraggableScrollList.prefab.meta rename Assets/Resources/Prefabs/{Factory => UI/Modal}/InfoWindow.prefab (100%) rename Assets/Resources/Prefabs/{Factory => UI/Modal}/InfoWindow.prefab.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/UIDropdown.prefab (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/UIDropdown.prefab.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/UIPlayback.prefab (77%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/UIPlayback.prefab.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/UIPlaybackListItem.prefab (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/UIPlaybackListItem.prefab.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/UIPlaybackListModal.prefab (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/UIPlaybackListModal.prefab.meta (100%) create mode 100644 Assets/Resources/Prefabs/UI/Playback/UIPlaybackProgressBar.prefab create mode 100644 Assets/Resources/Prefabs/UI/Playback/UIPlaybackProgressBar.prefab.meta rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIDropdown_menu_bottom.png (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIDropdown_menu_bottom.png.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIDropdown_menu_middle.png (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIDropdown_menu_middle.png.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIDropdown_menu_one.png (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIDropdown_menu_one.png.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIDropdown_menu_top.png (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIDropdown_menu_top.png.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIPlaybackListItem_deleteButton.png (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIPlaybackListItem_deleteButton.png.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIPlaybackListItem_downloadButton.png (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIPlaybackListItem_downloadButton.png.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIPlaybackListItem_loadingImage.png (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIPlaybackListItem_loadingImage.png.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIPlaybackListItem_selectedImage.png (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIPlaybackListItem_selectedImage.png.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIPlaybackListItem_stopButton.png (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIPlaybackListItem_stopButton.png.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIPlaybackListModal_arrow.png (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIPlaybackListModal_arrow.png.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIPlayback_pause.png (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIPlayback_pause.png.meta (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIPlayback_play.png (100%) rename Assets/Resources/Prefabs/{Factory => UI}/Playback/images/UIPlayback_play.png.meta (100%) create mode 100644 Assets/Resources/Prefabs/UI/Tab.meta create mode 100644 Assets/Scripts/UVC/Factory/Modal/ConfigDataOrderModal.cs create mode 100644 Assets/Scripts/UVC/Factory/Modal/ConfigDataOrderModal.cs.meta create mode 100644 Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackController.cs create mode 100644 Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackController.cs.meta create mode 100644 Assets/Scripts/UVC/UI/List.meta create mode 100644 Assets/Scripts/UVC/UI/List/DraggableItem.cs create mode 100644 Assets/Scripts/UVC/UI/List/DraggableItem.cs.meta create mode 100644 Assets/Scripts/UVC/UI/List/DraggableItemData.cs create mode 100644 Assets/Scripts/UVC/UI/List/DraggableItemData.cs.meta create mode 100644 Assets/Scripts/UVC/UI/List/DraggableListItem.cs create mode 100644 Assets/Scripts/UVC/UI/List/DraggableListItem.cs.meta create mode 100644 Assets/Scripts/UVC/UI/List/DraggableScrollList.cs create mode 100644 Assets/Scripts/UVC/UI/List/DraggableScrollList.cs.meta create mode 100644 Assets/Scripts/UVC/UI/Tab.meta create mode 100644 Assets/Scripts/UVC/UI/Tab/ITabContent.cs create mode 100644 Assets/Scripts/UVC/UI/Tab/ITabContent.cs.meta create mode 100644 Assets/Scripts/UVC/UI/Tab/TabButtonView.cs create mode 100644 Assets/Scripts/UVC/UI/Tab/TabButtonView.cs.meta create mode 100644 Assets/Scripts/UVC/UI/Tab/TabContentConfig.cs create mode 100644 Assets/Scripts/UVC/UI/Tab/TabContentConfig.cs.meta create mode 100644 Assets/Scripts/UVC/UI/Tab/TabContentLoader.cs create mode 100644 Assets/Scripts/UVC/UI/Tab/TabContentLoader.cs.meta create mode 100644 Assets/Scripts/UVC/UI/Tab/TabController.cs create mode 100644 Assets/Scripts/UVC/UI/Tab/TabController.cs.meta create mode 100644 Assets/Scripts/UVC/UI/Tab/TabData.cs create mode 100644 Assets/Scripts/UVC/UI/Tab/TabData.cs.meta create mode 100644 Assets/Scripts/UVC/UI/Tab/TabModel.cs create mode 100644 Assets/Scripts/UVC/UI/Tab/TabModel.cs.meta create mode 100644 Assets/Scripts/UVC/UI/Tab/TabView.cs create mode 100644 Assets/Scripts/UVC/UI/Tab/TabView.cs.meta diff --git a/Assets/Resources/Fonts/Pretendard/Pretendard-ExtraBold SDF.asset b/Assets/Resources/Fonts/Pretendard/Pretendard-ExtraBold SDF.asset index d3db7700..0ffa0b36 100644 --- a/Assets/Resources/Fonts/Pretendard/Pretendard-ExtraBold SDF.asset +++ b/Assets/Resources/Fonts/Pretendard/Pretendard-ExtraBold SDF.asset @@ -73,9 +73,9 @@ Material: - _OutlineWidth: 0 - _PerspectiveFilter: 0.875 - _Reflectivity: 10 - - _ScaleRatioA: 1 - - _ScaleRatioB: 1 - - _ScaleRatioC: 1 + - _ScaleRatioA: 0.8333333 + - _ScaleRatioB: 0.6770833 + - _ScaleRatioC: 0.6770833 - _ScaleX: 1 - _ScaleY: 1 - _ShaderFlags: 0 @@ -120,7 +120,7 @@ Texture2D: serializedVersion: 2 Hash: 00000000000000000000000000000000 m_IsAlphaChannelOptional: 0 - serializedVersion: 4 + serializedVersion: 3 m_Width: 1 m_Height: 1 m_CompleteImageSize: 1 diff --git a/Assets/Resources/Prefabs/SampleProject/Factory.meta b/Assets/Resources/Prefabs/UI/Alarm.meta similarity index 77% rename from Assets/Resources/Prefabs/SampleProject/Factory.meta rename to Assets/Resources/Prefabs/UI/Alarm.meta index b26bd7ea..ddf819d9 100644 --- a/Assets/Resources/Prefabs/SampleProject/Factory.meta +++ b/Assets/Resources/Prefabs/UI/Alarm.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 32fc15a19aea4e944a5ebe70369dc9f1 +guid: 5baaa5a2fc5d561429616c5a45329202 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Resources/Prefabs/Factory/AlarmIconManager.prefab b/Assets/Resources/Prefabs/UI/Alarm/AlarmIconManager.prefab similarity index 100% rename from Assets/Resources/Prefabs/Factory/AlarmIconManager.prefab rename to Assets/Resources/Prefabs/UI/Alarm/AlarmIconManager.prefab diff --git a/Assets/Resources/Prefabs/Factory/AlarmIconManager.prefab.meta b/Assets/Resources/Prefabs/UI/Alarm/AlarmIconManager.prefab.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/AlarmIconManager.prefab.meta rename to Assets/Resources/Prefabs/UI/Alarm/AlarmIconManager.prefab.meta diff --git a/Assets/Resources/Prefabs/Factory/AlarmManager.prefab b/Assets/Resources/Prefabs/UI/Alarm/AlarmManager.prefab similarity index 100% rename from Assets/Resources/Prefabs/Factory/AlarmManager.prefab rename to Assets/Resources/Prefabs/UI/Alarm/AlarmManager.prefab diff --git a/Assets/Resources/Prefabs/Factory/AlarmManager.prefab.meta b/Assets/Resources/Prefabs/UI/Alarm/AlarmManager.prefab.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/AlarmManager.prefab.meta rename to Assets/Resources/Prefabs/UI/Alarm/AlarmManager.prefab.meta diff --git a/Assets/Resources/Prefabs/Factory/AlarmSingleIconManager.prefab b/Assets/Resources/Prefabs/UI/Alarm/AlarmSingleIconManager.prefab similarity index 100% rename from Assets/Resources/Prefabs/Factory/AlarmSingleIconManager.prefab rename to Assets/Resources/Prefabs/UI/Alarm/AlarmSingleIconManager.prefab diff --git a/Assets/Resources/Prefabs/Factory/AlarmSingleIconManager.prefab.meta b/Assets/Resources/Prefabs/UI/Alarm/AlarmSingleIconManager.prefab.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/AlarmSingleIconManager.prefab.meta rename to Assets/Resources/Prefabs/UI/Alarm/AlarmSingleIconManager.prefab.meta diff --git a/Assets/Resources/Prefabs/UI/List.meta b/Assets/Resources/Prefabs/UI/List.meta new file mode 100644 index 00000000..e3777fc5 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/List.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 789fbaba80497234b826caaf22001c7a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/List/DraggableListItem.prefab b/Assets/Resources/Prefabs/UI/List/DraggableListItem.prefab new file mode 100644 index 00000000..81d2c79b --- /dev/null +++ b/Assets/Resources/Prefabs/UI/List/DraggableListItem.prefab @@ -0,0 +1,1039 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &192654008180487363 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3870429411112539252} + - component: {fileID: 6977597116920612462} + - component: {fileID: 3497820945170284491} + - component: {fileID: 7122596470949037595} + - component: {fileID: 5888109263827782323} + m_Layer: 5 + m_Name: DraggableListItem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3870429411112539252 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 192654008180487363} + 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: 7054147954863026825} + - {fileID: 1250467015452537796} + - {fileID: 1484707173828173627} + m_Father: {fileID: 0} + 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: 30} + m_Pivot: {x: 0, y: 1} +--- !u!222 &6977597116920612462 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 192654008180487363} + m_CullTransparentMesh: 1 +--- !u!114 &3497820945170284491 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 192654008180487363} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7cdfe032ad5874e4cbc571f344516b93, type: 3} + m_Name: + m_EditorClassIdentifier: + canvasGroup: {fileID: 5888109263827782323} + rectTransform: {fileID: 3870429411112539252} + dragAnchor: {fileID: 2058167080542246104} + inputField: {fileID: 2342021782791761271} + dragAlpha: 0.6 + blockRaycastsWhileDragging: 0 +--- !u!114 &7122596470949037595 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 192654008180487363} + 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: 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_Sprite: {fileID: 0} + 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!225 &5888109263827782323 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 192654008180487363} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &1464801131498371263 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1484707173828173627} + - component: {fileID: 2058167080542246104} + - component: {fileID: 6901208297906198054} + - component: {fileID: 4367634089592413695} + m_Layer: 5 + m_Name: Dragger + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1484707173828173627 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1464801131498371263} + 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: 3870429411112539252} + 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: 30, y: 30} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &2058167080542246104 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1464801131498371263} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2d93b757e3738184492e84c051530130, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!222 &6901208297906198054 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1464801131498371263} + m_CullTransparentMesh: 1 +--- !u!114 &4367634089592413695 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1464801131498371263} + 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.990566, g: 0.014017418, b: 0.014017418, 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: 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!1 &1908411424317987715 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7054147954863026825} + - component: {fileID: 4070739914034672045} + m_Layer: 5 + m_Name: Toggle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7054147954863026825 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1908411424317987715} + 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: 5817039078628770459} + - {fileID: 1509040345391865814} + m_Father: {fileID: 3870429411112539252} + 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: 10, y: 0} + m_SizeDelta: {x: 160, y: 20} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &4070739914034672045 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1908411424317987715} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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: 1008053780376876972} + toggleTransition: 1 + graphic: {fileID: 7632021912008991384} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &2202787505252222744 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1509040345391865814} + - component: {fileID: 8839915447669435017} + - component: {fileID: 1999293403375794255} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1509040345391865814 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2202787505252222744} + 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: 7054147954863026825} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 9, y: -0.5} + m_SizeDelta: {x: -28, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8839915447669435017 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2202787505252222744} + m_CullTransparentMesh: 1 +--- !u!114 &1999293403375794255 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2202787505252222744} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!1 &2221877575824598091 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5817039078628770459} + - component: {fileID: 7300936564378718146} + - component: {fileID: 1008053780376876972} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5817039078628770459 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2221877575824598091} + 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: 4306853823847359352} + m_Father: {fileID: 7054147954863026825} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 10, y: -10} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7300936564378718146 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2221877575824598091} + m_CullTransparentMesh: 1 +--- !u!114 &1008053780376876972 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2221877575824598091} + 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: 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 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 &5780642114869851084 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8222881141761207797} + - component: {fileID: 8897710984112532687} + 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 &8222881141761207797 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5780642114869851084} + 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: 5774729229154550652} + - {fileID: 1477976811762656248} + m_Father: {fileID: 1250467015452537796} + 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 &8897710984112532687 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5780642114869851084} + 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 &7081454234790430904 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1250467015452537796} + - component: {fileID: 4790640378303290805} + - component: {fileID: 1053765850514281073} + - component: {fileID: 2342021782791761271} + 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 &1250467015452537796 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7081454234790430904} + 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: 8222881141761207797} + m_Father: {fileID: 3870429411112539252} + 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: 120, y: 0} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4790640378303290805 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7081454234790430904} + m_CullTransparentMesh: 1 +--- !u!114 &1053765850514281073 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7081454234790430904} + 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: 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_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 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 &2342021782791761271 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7081454234790430904} + 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: 1053765850514281073} + m_TextViewport: {fileID: 8222881141761207797} + m_TextComponent: {fileID: 6850497070282362291} + m_Placeholder: {fileID: 4315629397813006193} + 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: 14 + 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.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_RichText: 1 + m_GlobalFontAsset: {fileID: 11400000, guid: 08cebd004d97ca742ac80400f37f4eed, 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 &7226872719778532299 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5774729229154550652} + - component: {fileID: 7329118726281060296} + - component: {fileID: 4315629397813006193} + - component: {fileID: 2419647384713756828} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5774729229154550652 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7226872719778532299} + 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: 8222881141761207797} + 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.5, y: 0.5} +--- !u!222 &7329118726281060296 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7226872719778532299} + m_CullTransparentMesh: 1 +--- !u!114 &4315629397813006193 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7226872719778532299} + 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: Enter text... + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 08cebd004d97ca742ac80400f37f4eed, type: 2} + m_sharedMaterial: {fileID: 4860575619018115804, guid: 08cebd004d97ca742ac80400f37f4eed, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2150773298 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + 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: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 2 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + 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 &2419647384713756828 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7226872719778532299} + 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 &7313786275588626695 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1477976811762656248} + - component: {fileID: 8703953343773509388} + - component: {fileID: 6850497070282362291} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1477976811762656248 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7313786275588626695} + 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: 8222881141761207797} + 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.5, y: 0.5} +--- !u!222 &8703953343773509388 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7313786275588626695} + m_CullTransparentMesh: 1 +--- !u!114 &6850497070282362291 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7313786275588626695} + 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: 08cebd004d97ca742ac80400f37f4eed, type: 2} + m_sharedMaterial: {fileID: 4860575619018115804, guid: 08cebd004d97ca742ac80400f37f4eed, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + 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 &8206955810778234226 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4306853823847359352} + - component: {fileID: 4282996345882099786} + - component: {fileID: 7632021912008991384} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4306853823847359352 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8206955810778234226} + 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: 5817039078628770459} + 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: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4282996345882099786 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8206955810778234226} + m_CullTransparentMesh: 1 +--- !u!114 &7632021912008991384 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8206955810778234226} + 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: 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_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + 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 diff --git a/Assets/Resources/Prefabs/UI/List/DraggableListItem.prefab.meta b/Assets/Resources/Prefabs/UI/List/DraggableListItem.prefab.meta new file mode 100644 index 00000000..5b0a8f88 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/List/DraggableListItem.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7f20039b3cd21554096c9ac3adfbd7a5 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/List/DraggableScrollList.prefab b/Assets/Resources/Prefabs/UI/List/DraggableScrollList.prefab new file mode 100644 index 00000000..455da19a --- /dev/null +++ b/Assets/Resources/Prefabs/UI/List/DraggableScrollList.prefab @@ -0,0 +1,99 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &8136911777273008353 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5208007342563872741} + - component: {fileID: 2965738868788178389} + - component: {fileID: 5076158976701961981} + - component: {fileID: 4550704492290639124} + m_Layer: 5 + m_Name: DraggableScrollList + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5208007342563872741 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8136911777273008353} + 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: 0} + 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_Pivot: {x: 0, y: 1} +--- !u!114 &2965738868788178389 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8136911777273008353} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 71e6121c6103b0a4c9aeadc24c891b86, type: 3} + m_Name: + m_EditorClassIdentifier: + scrollRect: {fileID: 0} + contentParent: {fileID: 5208007342563872741} + layoutGroup: {fileID: 5076158976701961981} + itemPrefabPath: Prefabs/UI/List/DraggableListItem + dropZoneThreshold: 50 + scrollSensitivity: 100 + enableAutoScroll: 1 +--- !u!114 &5076158976701961981 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8136911777273008353} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 8 + m_Right: 8 + m_Top: 8 + m_Bottom: 8 + m_ChildAlignment: 0 + m_Spacing: 4 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &4550704492290639124 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8136911777273008353} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 diff --git a/Assets/Resources/Prefabs/UI/List/DraggableScrollList.prefab.meta b/Assets/Resources/Prefabs/UI/List/DraggableScrollList.prefab.meta new file mode 100644 index 00000000..fc7a35d5 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/List/DraggableScrollList.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 11968bbba596a584e92e29ce26e3897d +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/Loading/UILoading.prefab b/Assets/Resources/Prefabs/UI/Loading/UILoading.prefab index 9580de51..1d18366f 100644 --- a/Assets/Resources/Prefabs/UI/Loading/UILoading.prefab +++ b/Assets/Resources/Prefabs/UI/Loading/UILoading.prefab @@ -54,6 +54,7 @@ MonoBehaviour: m_EditorClassIdentifier: canvasGroup: {fileID: 4097232251975178814} loadinImage: {fileID: 5537735754607583444} + loadingImageTransform: {fileID: 2492902462340881910} --- !u!223 &5836275117983516284 Canvas: m_ObjectHideFlags: 0 @@ -114,7 +115,7 @@ RectTransform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3720191927695001841} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + 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 diff --git a/Assets/Resources/Prefabs/UI/Loading/UILoadingBar.prefab b/Assets/Resources/Prefabs/UI/Loading/UILoadingBar.prefab index 0dd31d0e..725759af 100644 --- a/Assets/Resources/Prefabs/UI/Loading/UILoadingBar.prefab +++ b/Assets/Resources/Prefabs/UI/Loading/UILoadingBar.prefab @@ -85,7 +85,6 @@ GameObject: m_Component: - component: {fileID: 3316965954832882549} - component: {fileID: 923263126373587623} - - component: {fileID: 3314964221659757925} - component: {fileID: 4097232251975178814} - component: {fileID: 5959041612264278031} m_Layer: 5 @@ -130,14 +129,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 4fb7ebdfa824a214caad9f55f3398cc0, type: 3} m_Name: m_EditorClassIdentifier: ---- !u!222 &3314964221659757925 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3247177050376678973} - m_CullTransparentMesh: 0 + canvasGroup: {fileID: 4097232251975178814} + loadinImage: {fileID: 5537735754607583444} + text: {fileID: 5965769881319077586} --- !u!225 &4097232251975178814 CanvasGroup: m_ObjectHideFlags: 0 @@ -171,7 +165,7 @@ Canvas: m_AdditionalShaderChannelsFlag: 0 m_UpdateRectTransformForStandalone: 0 m_SortingLayerID: 0 - m_SortingOrder: 0 + m_SortingOrder: 101 m_TargetDisplay: 0 --- !u!1 &3720191927695001841 GameObject: @@ -411,8 +405,8 @@ MonoBehaviour: m_Calls: [] m_text: m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontAsset: {fileID: 11400000, guid: 08cebd004d97ca742ac80400f37f4eed, type: 2} + m_sharedMaterial: {fileID: 4860575619018115804, guid: 08cebd004d97ca742ac80400f37f4eed, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] diff --git a/Assets/Resources/Prefabs/Factory/InfoWindow.prefab b/Assets/Resources/Prefabs/UI/Modal/InfoWindow.prefab similarity index 100% rename from Assets/Resources/Prefabs/Factory/InfoWindow.prefab rename to Assets/Resources/Prefabs/UI/Modal/InfoWindow.prefab diff --git a/Assets/Resources/Prefabs/Factory/InfoWindow.prefab.meta b/Assets/Resources/Prefabs/UI/Modal/InfoWindow.prefab.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/InfoWindow.prefab.meta rename to Assets/Resources/Prefabs/UI/Modal/InfoWindow.prefab.meta diff --git a/Assets/Resources/Prefabs/Factory/Playback.meta b/Assets/Resources/Prefabs/UI/Playback.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback.meta rename to Assets/Resources/Prefabs/UI/Playback.meta diff --git a/Assets/Resources/Prefabs/Factory/Playback/UIDropdown.prefab b/Assets/Resources/Prefabs/UI/Playback/UIDropdown.prefab similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/UIDropdown.prefab rename to Assets/Resources/Prefabs/UI/Playback/UIDropdown.prefab diff --git a/Assets/Resources/Prefabs/Factory/Playback/UIDropdown.prefab.meta b/Assets/Resources/Prefabs/UI/Playback/UIDropdown.prefab.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/UIDropdown.prefab.meta rename to Assets/Resources/Prefabs/UI/Playback/UIDropdown.prefab.meta diff --git a/Assets/Resources/Prefabs/Factory/Playback/UIPlayback.prefab b/Assets/Resources/Prefabs/UI/Playback/UIPlayback.prefab similarity index 77% rename from Assets/Resources/Prefabs/Factory/Playback/UIPlayback.prefab rename to Assets/Resources/Prefabs/UI/Playback/UIPlayback.prefab index 0f865400..fabc047e 100644 --- a/Assets/Resources/Prefabs/Factory/Playback/UIPlayback.prefab +++ b/Assets/Resources/Prefabs/UI/Playback/UIPlayback.prefab @@ -1,80 +1,5 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: ---- !u!1 &142473307186880493 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2212794593377927555} - - component: {fileID: 2543815536604706675} - - component: {fileID: 907042583023779876} - m_Layer: 5 - m_Name: Fill - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2212794593377927555 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 142473307186880493} - 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: 2052035080147039476} - 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: 8, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &2543815536604706675 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 142473307186880493} - m_CullTransparentMesh: 1 ---- !u!114 &907042583023779876 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 142473307186880493} - 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.14117648, g: 0.54509807, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 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 &524629217329646727 GameObject: m_ObjectHideFlags: 0 @@ -671,178 +596,6 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!1 &2596344147536603055 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4603262739189244112} - - component: {fileID: 2148154503416279850} - - component: {fileID: 2098005496725083057} - m_Layer: 5 - m_Name: PlayTimeTxt - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &4603262739189244112 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2596344147536603055} - 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: 1355571794369558167} - 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: 80, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &2148154503416279850 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2596344147536603055} - m_CullTransparentMesh: 1 ---- !u!114 &2098005496725083057 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2596344147536603055} - 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: 00:00:00 - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 08cebd004d97ca742ac80400f37f4eed, type: 2} - m_sharedMaterial: {fileID: 4860575619018115804, guid: 08cebd004d97ca742ac80400f37f4eed, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, 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: 12 - m_fontSizeBase: 12 - 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: -1 - 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: 1 - 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 &2691644320341202184 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2934293647230093717} - m_Layer: 5 - m_Name: Handle Slide Area - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2934293647230093717 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2691644320341202184} - 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: 1379976025267262066} - m_Father: {fileID: 475259887956418939} - 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: -24} - m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &3243958776734417420 GameObject: m_ObjectHideFlags: 0 @@ -1339,42 +1092,6 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!1 &4064351744636590050 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2052035080147039476} - m_Layer: 5 - m_Name: Fill Area - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2052035080147039476 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4064351744636590050} - 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: 2212794593377927555} - m_Father: {fileID: 475259887956418939} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.25} - m_AnchorMax: {x: 1, y: 0.75} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: -8} - m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &4548019106164848943 GameObject: m_ObjectHideFlags: 0 @@ -1972,97 +1689,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5842636379417192733} m_CullTransparentMesh: 1 ---- !u!1 &5959356688591116280 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1355571794369558167} - - component: {fileID: 1875730371384184921} - - component: {fileID: 3137698686019385162} - - component: {fileID: 3213640032001464174} - m_Layer: 5 - m_Name: UIPlaybackProgressBar - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1355571794369558167 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5959356688591116280} - 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: 4603262739189244112} - - {fileID: 475259887956418939} - - {fileID: 2037023258457412994} - m_Father: {fileID: 2985284779945075815} - 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: 5, y: 0} - m_SizeDelta: {x: 428, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1875730371384184921 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5959356688591116280} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: bce52072cdea6144b98e9297b89d6558, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!114 &3137698686019385162 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5959356688591116280} - 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: 3 - m_Spacing: 0 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 1 - m_ChildControlWidth: 0 - m_ChildControlHeight: 0 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 ---- !u!225 &3213640032001464174 -CanvasGroup: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5959356688591116280} - m_Enabled: 1 - m_Alpha: 1 - m_Interactable: 0 - m_BlocksRaycasts: 1 - m_IgnoreParentGroups: 0 --- !u!1 &6095878340803605202 GameObject: m_ObjectHideFlags: 0 @@ -2424,232 +2050,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: -28} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &7180270421573006431 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2037023258457412994} - - component: {fileID: 3418930163742956515} - - component: {fileID: 1879602012963642071} - m_Layer: 5 - m_Name: TotalTimeTxt - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2037023258457412994 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7180270421573006431} - 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: 1355571794369558167} - 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: 130, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &3418930163742956515 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7180270421573006431} - m_CullTransparentMesh: 1 ---- !u!114 &1879602012963642071 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7180270421573006431} - 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: 00:60:00 - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 08cebd004d97ca742ac80400f37f4eed, type: 2} - m_sharedMaterial: {fileID: 4860575619018115804, guid: 08cebd004d97ca742ac80400f37f4eed, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, 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: 12 - m_fontSizeBase: 12 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 4 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: -1 - 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: 1 - 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 &7255621567353008705 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 475259887956418939} - - component: {fileID: 838636949093095911} - m_Layer: 5 - m_Name: ProgressBar - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &475259887956418939 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7255621567353008705} - 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: 2404807485042726370} - - {fileID: 2052035080147039476} - - {fileID: 2934293647230093717} - m_Father: {fileID: 1355571794369558167} - 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: 268, y: 40} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &838636949093095911 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7255621567353008705} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c91122bcd4466654a8edf4e66c23448a, 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: 6601414212130519427} - m_FillRect: {fileID: 2212794593377927555} - m_HandleRect: {fileID: 1379976025267262066} - m_Direction: 0 - m_MinValue: 0 - m_MaxValue: 3600 - m_WholeNumbers: 0 - m_Value: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] --- !u!1 &8010062772174439758 GameObject: m_ObjectHideFlags: 0 @@ -2982,81 +2382,6 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!1 &9069967403573002026 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1379976025267262066} - - component: {fileID: 4229706552096532897} - - component: {fileID: 6601414212130519427} - m_Layer: 5 - m_Name: Handle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1379976025267262066 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9069967403573002026} - 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: 2934293647230093717} - 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: 6, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &4229706552096532897 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9069967403573002026} - m_CullTransparentMesh: 1 ---- !u!114 &6601414212130519427 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9069967403573002026} - 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: 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_Sprite: {fileID: 21300000, guid: e5829cbc100001646956a9c3ed4e33c5, type: 3} - 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 &9120583007845979077 GameObject: m_ObjectHideFlags: 0 @@ -3094,81 +2419,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 528, y: 32} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &9142233292563063716 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2404807485042726370} - - component: {fileID: 1771436850855349595} - - component: {fileID: 8104840636219438454} - m_Layer: 5 - m_Name: Background - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2404807485042726370 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9142233292563063716} - 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: 475259887956418939} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.25} - m_AnchorMax: {x: 1, y: 0.75} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: -10} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &1771436850855349595 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9142233292563063716} - m_CullTransparentMesh: 1 ---- !u!114 &8104840636219438454 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9142233292563063716} - 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: 1, g: 1, b: 1, a: 0.2} - 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: 10907, guid: 0000000000000000f000000000000000, type: 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!1001 &1741713488949895712 PrefabInstance: m_ObjectHideFlags: 0 @@ -3185,6 +2435,10 @@ PrefabInstance: propertyPath: dragObject value: objectReference: {fileID: 1772582241787108090} + - target: {fileID: 4336813538161482815, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: yMinHeight + value: 0 + objectReference: {fileID: 0} - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} propertyPath: m_Pivot.x value: 0 @@ -3286,3 +2540,124 @@ RectTransform: m_CorrespondingSourceObject: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} m_PrefabInstance: {fileID: 1741713488949895712} m_PrefabAsset: {fileID: 0} +--- !u!1001 &2818395949540507463 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 2985284779945075815} + m_Modifications: + - target: {fileID: 3763422474971032885, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_AnchorMax.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_AnchorMin.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_SizeDelta.x + value: 428 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_SizeDelta.y + value: 20 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_AnchoredPosition.x + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4155020195241443012, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8480022438557558975, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + propertyPath: m_Name + value: UIPlaybackProgressBar + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} +--- !u!224 &1355571794369558167 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 3878445294948272592, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + m_PrefabInstance: {fileID: 2818395949540507463} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1875730371384184921 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 4403142724682182430, guid: ededfe70f265a2f409ca4fdfffb735fc, type: 3} + m_PrefabInstance: {fileID: 2818395949540507463} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bce52072cdea6144b98e9297b89d6558, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/Assets/Resources/Prefabs/Factory/Playback/UIPlayback.prefab.meta b/Assets/Resources/Prefabs/UI/Playback/UIPlayback.prefab.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/UIPlayback.prefab.meta rename to Assets/Resources/Prefabs/UI/Playback/UIPlayback.prefab.meta diff --git a/Assets/Resources/Prefabs/Factory/Playback/UIPlaybackListItem.prefab b/Assets/Resources/Prefabs/UI/Playback/UIPlaybackListItem.prefab similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/UIPlaybackListItem.prefab rename to Assets/Resources/Prefabs/UI/Playback/UIPlaybackListItem.prefab diff --git a/Assets/Resources/Prefabs/Factory/Playback/UIPlaybackListItem.prefab.meta b/Assets/Resources/Prefabs/UI/Playback/UIPlaybackListItem.prefab.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/UIPlaybackListItem.prefab.meta rename to Assets/Resources/Prefabs/UI/Playback/UIPlaybackListItem.prefab.meta diff --git a/Assets/Resources/Prefabs/Factory/Playback/UIPlaybackListModal.prefab b/Assets/Resources/Prefabs/UI/Playback/UIPlaybackListModal.prefab similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/UIPlaybackListModal.prefab rename to Assets/Resources/Prefabs/UI/Playback/UIPlaybackListModal.prefab diff --git a/Assets/Resources/Prefabs/Factory/Playback/UIPlaybackListModal.prefab.meta b/Assets/Resources/Prefabs/UI/Playback/UIPlaybackListModal.prefab.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/UIPlaybackListModal.prefab.meta rename to Assets/Resources/Prefabs/UI/Playback/UIPlaybackListModal.prefab.meta diff --git a/Assets/Resources/Prefabs/UI/Playback/UIPlaybackProgressBar.prefab b/Assets/Resources/Prefabs/UI/Playback/UIPlaybackProgressBar.prefab new file mode 100644 index 00000000..07d69d95 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Playback/UIPlaybackProgressBar.prefab @@ -0,0 +1,756 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &163906468634978895 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1127096903710226130} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1127096903710226130 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 163906468634978895} + 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: 3763422474971032885} + m_Father: {fileID: 2415198746135535164} + 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: -24} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &222054138603084008 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1801131152219070359} + - component: {fileID: 4238787803905428589} + - component: {fileID: 4179737159690841334} + m_Layer: 5 + m_Name: PlayTimeTxt + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1801131152219070359 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 222054138603084008} + 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: 3878445294948272592} + 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: 80, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4238787803905428589 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 222054138603084008} + m_CullTransparentMesh: 1 +--- !u!114 &4179737159690841334 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 222054138603084008} + 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: 00:00:00 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 08cebd004d97ca742ac80400f37f4eed, type: 2} + m_sharedMaterial: {fileID: 4860575619018115804, guid: 08cebd004d97ca742ac80400f37f4eed, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, 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: 12 + m_fontSizeBase: 12 + 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: -1 + 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: 1 + 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 &2268563310445029541 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4280318672268889011} + m_Layer: 5 + m_Name: Fill Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4280318672268889011 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2268563310445029541} + 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: 4155020195241443012} + m_Father: {fileID: 2415198746135535164} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: -8} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &2803172565992579242 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4155020195241443012} + - component: {fileID: 311178213436131380} + - component: {fileID: 3137463316529282915} + m_Layer: 5 + m_Name: Fill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4155020195241443012 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2803172565992579242} + 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: 4280318672268889011} + 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: 8, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &311178213436131380 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2803172565992579242} + m_CullTransparentMesh: 1 +--- !u!114 &3137463316529282915 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2803172565992579242} + 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.14117648, g: 0.54509807, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 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 &4876784253204942086 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2415198746135535164} + - component: {fileID: 3224467329000990368} + m_Layer: 5 + m_Name: ProgressBar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2415198746135535164 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4876784253204942086} + 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: 451313813165107877} + - {fileID: 4280318672268889011} + - {fileID: 1127096903710226130} + m_Father: {fileID: 3878445294948272592} + 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: 268, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &3224467329000990368 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4876784253204942086} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c91122bcd4466654a8edf4e66c23448a, 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: 8971200621436978884} + m_FillRect: {fileID: 4155020195241443012} + m_HandleRect: {fileID: 3763422474971032885} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 3600 + m_WholeNumbers: 0 + m_Value: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &4952136363032480536 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4276169991110453957} + - component: {fileID: 607580168181425316} + - component: {fileID: 4398121541985658256} + m_Layer: 5 + m_Name: TotalTimeTxt + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4276169991110453957 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4952136363032480536} + 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: 3878445294948272592} + 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: 130, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &607580168181425316 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4952136363032480536} + m_CullTransparentMesh: 1 +--- !u!114 &4398121541985658256 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4952136363032480536} + 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: 00:60:00 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 08cebd004d97ca742ac80400f37f4eed, type: 2} + m_sharedMaterial: {fileID: 4860575619018115804, guid: 08cebd004d97ca742ac80400f37f4eed, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, 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: 12 + m_fontSizeBase: 12 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 4 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: -1 + 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: 1 + 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 &6468093285766946019 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 451313813165107877} + - component: {fileID: 4578362299949511196} + - component: {fileID: 6297960483353807409} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &451313813165107877 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6468093285766946019} + 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: 2415198746135535164} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: -10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4578362299949511196 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6468093285766946019} + m_CullTransparentMesh: 1 +--- !u!114 &6297960483353807409 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6468093285766946019} + 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: 1, g: 1, b: 1, a: 0.2} + 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: 10907, guid: 0000000000000000f000000000000000, type: 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 &6539802130848792685 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3763422474971032885} + - component: {fileID: 2138677238417708774} + - component: {fileID: 8971200621436978884} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3763422474971032885 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6539802130848792685} + 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: 1127096903710226130} + 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: 6, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2138677238417708774 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6539802130848792685} + m_CullTransparentMesh: 1 +--- !u!114 &8971200621436978884 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6539802130848792685} + 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: 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_Sprite: {fileID: 21300000, guid: e5829cbc100001646956a9c3ed4e33c5, type: 3} + 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 &8480022438557558975 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3878445294948272592} + - component: {fileID: 4403142724682182430} + - component: {fileID: 907383497048967181} + - component: {fileID: 830299204133775401} + m_Layer: 5 + m_Name: UIPlaybackProgressBar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3878445294948272592 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8480022438557558975} + 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: 1801131152219070359} + - {fileID: 2415198746135535164} + - {fileID: 4276169991110453957} + m_Father: {fileID: 0} + 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: 5, y: 0} + m_SizeDelta: {x: 428, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &4403142724682182430 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8480022438557558975} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bce52072cdea6144b98e9297b89d6558, type: 3} + m_Name: + m_EditorClassIdentifier: + canvasGroup: {fileID: 830299204133775401} + playTimeTxt: {fileID: 4179737159690841334} + totalTimeTxt: {fileID: 4398121541985658256} + progressBar: {fileID: 3224467329000990368} +--- !u!114 &907383497048967181 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8480022438557558975} + 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: 3 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!225 &830299204133775401 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8480022438557558975} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 0 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 diff --git a/Assets/Resources/Prefabs/UI/Playback/UIPlaybackProgressBar.prefab.meta b/Assets/Resources/Prefabs/UI/Playback/UIPlaybackProgressBar.prefab.meta new file mode 100644 index 00000000..68f88fd0 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Playback/UIPlaybackProgressBar.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ededfe70f265a2f409ca4fdfffb735fc +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/Factory/Playback/images.meta b/Assets/Resources/Prefabs/UI/Playback/images.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images.meta rename to Assets/Resources/Prefabs/UI/Playback/images.meta diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIDropdown_menu_bottom.png b/Assets/Resources/Prefabs/UI/Playback/images/UIDropdown_menu_bottom.png similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIDropdown_menu_bottom.png rename to Assets/Resources/Prefabs/UI/Playback/images/UIDropdown_menu_bottom.png diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIDropdown_menu_bottom.png.meta b/Assets/Resources/Prefabs/UI/Playback/images/UIDropdown_menu_bottom.png.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIDropdown_menu_bottom.png.meta rename to Assets/Resources/Prefabs/UI/Playback/images/UIDropdown_menu_bottom.png.meta diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIDropdown_menu_middle.png b/Assets/Resources/Prefabs/UI/Playback/images/UIDropdown_menu_middle.png similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIDropdown_menu_middle.png rename to Assets/Resources/Prefabs/UI/Playback/images/UIDropdown_menu_middle.png diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIDropdown_menu_middle.png.meta b/Assets/Resources/Prefabs/UI/Playback/images/UIDropdown_menu_middle.png.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIDropdown_menu_middle.png.meta rename to Assets/Resources/Prefabs/UI/Playback/images/UIDropdown_menu_middle.png.meta diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIDropdown_menu_one.png b/Assets/Resources/Prefabs/UI/Playback/images/UIDropdown_menu_one.png similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIDropdown_menu_one.png rename to Assets/Resources/Prefabs/UI/Playback/images/UIDropdown_menu_one.png diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIDropdown_menu_one.png.meta b/Assets/Resources/Prefabs/UI/Playback/images/UIDropdown_menu_one.png.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIDropdown_menu_one.png.meta rename to Assets/Resources/Prefabs/UI/Playback/images/UIDropdown_menu_one.png.meta diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIDropdown_menu_top.png b/Assets/Resources/Prefabs/UI/Playback/images/UIDropdown_menu_top.png similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIDropdown_menu_top.png rename to Assets/Resources/Prefabs/UI/Playback/images/UIDropdown_menu_top.png diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIDropdown_menu_top.png.meta b/Assets/Resources/Prefabs/UI/Playback/images/UIDropdown_menu_top.png.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIDropdown_menu_top.png.meta rename to Assets/Resources/Prefabs/UI/Playback/images/UIDropdown_menu_top.png.meta diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_deleteButton.png b/Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_deleteButton.png similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_deleteButton.png rename to Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_deleteButton.png diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_deleteButton.png.meta b/Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_deleteButton.png.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_deleteButton.png.meta rename to Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_deleteButton.png.meta diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_downloadButton.png b/Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_downloadButton.png similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_downloadButton.png rename to Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_downloadButton.png diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_downloadButton.png.meta b/Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_downloadButton.png.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_downloadButton.png.meta rename to Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_downloadButton.png.meta diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_loadingImage.png b/Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_loadingImage.png similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_loadingImage.png rename to Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_loadingImage.png diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_loadingImage.png.meta b/Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_loadingImage.png.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_loadingImage.png.meta rename to Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_loadingImage.png.meta diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_selectedImage.png b/Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_selectedImage.png similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_selectedImage.png rename to Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_selectedImage.png diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_selectedImage.png.meta b/Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_selectedImage.png.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_selectedImage.png.meta rename to Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_selectedImage.png.meta diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_stopButton.png b/Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_stopButton.png similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_stopButton.png rename to Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_stopButton.png diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_stopButton.png.meta b/Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_stopButton.png.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListItem_stopButton.png.meta rename to Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListItem_stopButton.png.meta diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListModal_arrow.png b/Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListModal_arrow.png similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListModal_arrow.png rename to Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListModal_arrow.png diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListModal_arrow.png.meta b/Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListModal_arrow.png.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIPlaybackListModal_arrow.png.meta rename to Assets/Resources/Prefabs/UI/Playback/images/UIPlaybackListModal_arrow.png.meta diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIPlayback_pause.png b/Assets/Resources/Prefabs/UI/Playback/images/UIPlayback_pause.png similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIPlayback_pause.png rename to Assets/Resources/Prefabs/UI/Playback/images/UIPlayback_pause.png diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIPlayback_pause.png.meta b/Assets/Resources/Prefabs/UI/Playback/images/UIPlayback_pause.png.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIPlayback_pause.png.meta rename to Assets/Resources/Prefabs/UI/Playback/images/UIPlayback_pause.png.meta diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIPlayback_play.png b/Assets/Resources/Prefabs/UI/Playback/images/UIPlayback_play.png similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIPlayback_play.png rename to Assets/Resources/Prefabs/UI/Playback/images/UIPlayback_play.png diff --git a/Assets/Resources/Prefabs/Factory/Playback/images/UIPlayback_play.png.meta b/Assets/Resources/Prefabs/UI/Playback/images/UIPlayback_play.png.meta similarity index 100% rename from Assets/Resources/Prefabs/Factory/Playback/images/UIPlayback_play.png.meta rename to Assets/Resources/Prefabs/UI/Playback/images/UIPlayback_play.png.meta diff --git a/Assets/Resources/Prefabs/UI/Tab.meta b/Assets/Resources/Prefabs/UI/Tab.meta new file mode 100644 index 00000000..51f89526 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Tab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a47c62d73f7117344bc36b27a7cce32c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/SampleProject.unity b/Assets/Scenes/SampleProject.unity index ef156ecb..1352ba2d 100644 --- a/Assets/Scenes/SampleProject.unity +++ b/Assets/Scenes/SampleProject.unity @@ -198,6 +198,223 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!224 &229847714 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + m_PrefabInstance: {fileID: 4323524856404202291} + m_PrefabAsset: {fileID: 0} +--- !u!114 &229847717 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 2965738868788178389, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + m_PrefabInstance: {fileID: 4323524856404202291} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 71e6121c6103b0a4c9aeadc24c891b86, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &264838796 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 264838797} + - component: {fileID: 264838800} + - component: {fileID: 264838799} + - component: {fileID: 264838798} + 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 &264838797 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 264838796} + 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: 421895418} + m_Father: {fileID: 1312094714} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!114 &264838798 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 264838796} + 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: 914060398} + m_HandleRect: {fileID: 914060397} + m_Direction: 2 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &264838799 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 264838796} + 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: 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_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 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 &264838800 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 264838796} + m_CullTransparentMesh: 1 +--- !u!1 &302722921 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 302722922} + - component: {fileID: 302722924} + - component: {fileID: 302722923} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &302722922 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 302722921} + 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: 2134831441} + 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!114 &302722923 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 302722921} + 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: 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 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 &302722924 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 302722921} + m_CullTransparentMesh: 1 --- !u!1 &330585543 GameObject: m_ObjectHideFlags: 0 @@ -498,6 +715,42 @@ MonoBehaviour: m_LightCookieSize: {x: 1, y: 1} m_LightCookieOffset: {x: 0, y: 0} m_SoftShadowQuality: 1 +--- !u!1 &421895417 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 421895418} + 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 &421895418 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421895417} + 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: 914060397} + m_Father: {fileID: 264838797} + 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 &483439347 GameObject: m_ObjectHideFlags: 0 @@ -604,6 +857,81 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 0} +--- !u!1 &487515690 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 487515691} + - component: {fileID: 487515693} + - component: {fileID: 487515692} + m_Layer: 5 + m_Name: shadow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &487515691 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 487515690} + 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: 953514228} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 5, y: -5} + m_SizeDelta: {x: 10, y: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &487515692 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 487515690} + 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: 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_Sprite: {fileID: 21300000, guid: 4cf3568ca3f55f64cb11447d139d7a3d, type: 3} + 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 &487515693 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 487515690} + m_CullTransparentMesh: 1 --- !u!1 &495653794 GameObject: m_ObjectHideFlags: 0 @@ -697,7 +1025,8 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0} m_ConstrainProportionsScale: 0 - m_Children: [] + m_Children: + - {fileID: 953514228} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -705,6 +1034,219 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 0} +--- !u!1 &496879388 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 496879389} + - component: {fileID: 496879391} + - component: {fileID: 496879390} + m_Layer: 5 + m_Name: Top + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &496879389 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 496879388} + 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: 1379231488} + - {fileID: 607406010} + m_Father: {fileID: 953514228} + 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: 30} + m_Pivot: {x: 0, y: 1} +--- !u!114 &496879390 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 496879388} + 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.42521098, g: 0.81960785, b: 0.25098035, 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: 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 &496879391 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 496879388} + m_CullTransparentMesh: 1 +--- !u!1 &607406009 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 607406010} + - component: {fileID: 607406012} + - component: {fileID: 607406011} + 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 &607406010 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 607406009} + 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: 496879389} + 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: 10, y: 0} + m_SizeDelta: {x: 200, y: 30} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &607406011 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 607406009} + 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: Title + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8edbb972b2fb8004cade5f2c47be8292, type: 2} + m_sharedMaterial: {fileID: -8176753524350981470, guid: 8edbb972b2fb8004cade5f2c47be8292, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4278190080 + m_fontColor: {r: 0, g: 0, b: 0, 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: 18 + m_fontSizeBase: 18 + 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 &607406012 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 607406009} + m_CullTransparentMesh: 1 --- !u!1 &632541406 GameObject: m_ObjectHideFlags: 0 @@ -762,6 +1304,81 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 621ed7b485f821040890dfe3f6211461, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &694586739 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 694586740} + - component: {fileID: 694586742} + - component: {fileID: 694586741} + m_Layer: 5 + m_Name: bg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &694586740 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 694586739} + 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: 953514228} + 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.5, y: 0.5} +--- !u!114 &694586741 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 694586739} + 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.9150943, g: 0.8842637, b: 0.21150766, 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: e5829cbc100001646956a9c3ed4e33c5, type: 3} + 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 &694586742 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 694586739} + m_CullTransparentMesh: 1 --- !u!1001 &769109585 PrefabInstance: m_ObjectHideFlags: 0 @@ -913,11 +1530,149 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &914060396 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 914060397} + - component: {fileID: 914060399} + - component: {fileID: 914060398} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &914060397 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 914060396} + 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: 421895418} + 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!114 &914060398 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 914060396} + 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: 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 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 &914060399 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 914060396} + m_CullTransparentMesh: 1 --- !u!224 &945196059 stripped RectTransform: m_CorrespondingSourceObject: {fileID: 5064510836022735693, guid: 27ddee6261f49584c8634ba7c5f4ae46, type: 3} m_PrefabInstance: {fileID: 8261569461642068635} m_PrefabAsset: {fileID: 0} +--- !u!1 &953514227 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 953514228} + - component: {fileID: 953514230} + - component: {fileID: 953514231} + m_Layer: 5 + m_Name: UIConfigInfoModal + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &953514228 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 953514227} + 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: 487515691} + - {fileID: 694586740} + - {fileID: 496879389} + - {fileID: 2036714140} + - {fileID: 1312094714} + m_Father: {fileID: 495653798} + 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: 0, y: 0} + m_SizeDelta: {x: 800, y: 500} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &953514230 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 953514227} + m_CullTransparentMesh: 1 +--- !u!114 &953514231 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 953514227} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc92cc933c1ce844c955ffc32982d3af, type: 3} + m_Name: + m_EditorClassIdentifier: + draggableList: {fileID: 229847717} --- !u!1 &1091201604 GameObject: m_ObjectHideFlags: 0 @@ -1173,6 +1928,603 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1101428664} m_CullTransparentMesh: 1 +--- !u!1 &1118689018 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1118689019} + - component: {fileID: 1118689021} + - component: {fileID: 1118689020} + 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 &1118689019 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1118689018} + 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: 1559054156} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 5, y: 0} + m_SizeDelta: {x: -10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1118689020 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1118689018} + 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: Button + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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: 16 + m_fontSizeBase: 16 + 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 &1118689021 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1118689018} + m_CullTransparentMesh: 1 +--- !u!1 &1147576787 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1147576788} + - component: {fileID: 1147576790} + - component: {fileID: 1147576789} + 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 &1147576788 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1147576787} + 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: 1635335853} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 5, y: 0} + m_SizeDelta: {x: -10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1147576789 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1147576787} + 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: Button + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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: 16 + m_fontSizeBase: 16 + 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 &1147576790 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1147576787} + m_CullTransparentMesh: 1 +--- !u!1 &1174938649 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1174938650} + - component: {fileID: 1174938653} + - component: {fileID: 1174938652} + - component: {fileID: 1174938651} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1174938650 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1174938649} + 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: 2078014188} + m_Father: {fileID: 1312094714} + 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: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1174938651 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1174938649} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!114 &1174938652 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1174938649} + 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: 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_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 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 &1174938653 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1174938649} + m_CullTransparentMesh: 1 +--- !u!1 &1246324762 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1246324763} + - component: {fileID: 1246324766} + - component: {fileID: 1246324765} + - component: {fileID: 1246324764} + 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 &1246324763 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1246324762} + 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: 2134831441} + m_Father: {fileID: 1312094714} + 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: 0, y: 20} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1246324764 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1246324762} + 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: 302722923} + m_HandleRect: {fileID: 302722922} + m_Direction: 0 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1246324765 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1246324762} + 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: 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_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 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 &1246324766 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1246324762} + m_CullTransparentMesh: 1 +--- !u!1 &1312094713 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1312094714} + - component: {fileID: 1312094717} + - component: {fileID: 1312094716} + - component: {fileID: 1312094715} + m_Layer: 5 + m_Name: RightContents + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1312094714 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1312094713} + 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: 1174938650} + - {fileID: 1246324763} + - {fileID: 264838797} + m_Father: {fileID: 953514228} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 150, y: -30} + m_SizeDelta: {x: -150, y: -30} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1312094715 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1312094713} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 2078014188} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 1 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 1174938650} + m_HorizontalScrollbar: {fileID: 1246324764} + m_VerticalScrollbar: {fileID: 264838798} + m_HorizontalScrollbarVisibility: 2 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: -3 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1312094716 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1312094713} + 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, g: 0.01969001, b: 0.0754717, a: 0.392} + 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: 10907, guid: 0000000000000000f000000000000000, type: 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 &1312094717 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1312094713} + m_CullTransparentMesh: 1 --- !u!1001 &1316465221 PrefabInstance: m_ObjectHideFlags: 0 @@ -1311,6 +2663,127 @@ RectTransform: m_CorrespondingSourceObject: {fileID: 645519807822385127, guid: 12db500810bde2f42b6cc1aa17543fb5, type: 3} m_PrefabInstance: {fileID: 1316465221} m_PrefabAsset: {fileID: 0} +--- !u!1 &1379231487 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1379231488} + - component: {fileID: 1379231491} + - component: {fileID: 1379231490} + - component: {fileID: 1379231489} + m_Layer: 5 + m_Name: CloseButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1379231488 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1379231487} + 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: 1868668760} + m_Father: {fileID: 496879389} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 32, y: 32} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1379231489 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1379231487} + 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: 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: 1379231490} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1379231490 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1379231487} + 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: 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_Sprite: {fileID: 21300000, guid: a458a60f90f95e74292928ca17721b8f, 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 &1379231491 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1379231487} + m_CullTransparentMesh: 1 --- !u!1001 &1379798062 PrefabInstance: m_ObjectHideFlags: 0 @@ -1519,6 +2992,144 @@ RectTransform: m_CorrespondingSourceObject: {fileID: 317620767794348250, guid: e220aefe1cafb8544b57693317cf1e48, type: 3} m_PrefabInstance: {fileID: 1506231960} m_PrefabAsset: {fileID: 0} +--- !u!1 &1559054155 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1559054156} + - component: {fileID: 1559054159} + - component: {fileID: 1559054160} + - component: {fileID: 1559054158} + - component: {fileID: 1559054157} + m_Layer: 5 + m_Name: UITabButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1559054156 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1559054155} + 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: 1118689019} + m_Father: {fileID: 2036714140} + 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: 0, y: 30} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1559054157 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1559054155} + 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: 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: 1559054158} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1559054158 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1559054155} + 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: 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_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 &1559054159 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1559054155} + m_CullTransparentMesh: 1 +--- !u!114 &1559054160 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1559054155} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 58af61b23f40877429f8889337d2006a, type: 3} + m_Name: + m_EditorClassIdentifier: + button: {fileID: 1559054157} + tabText: {fileID: 0} + tabIcon: {fileID: 0} + background: {fileID: 0} --- !u!1 &1561871829 GameObject: m_ObjectHideFlags: 0 @@ -1597,6 +3208,144 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1561871829} m_CullTransparentMesh: 1 +--- !u!1 &1635335852 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1635335853} + - component: {fileID: 1635335857} + - component: {fileID: 1635335856} + - component: {fileID: 1635335855} + - component: {fileID: 1635335854} + m_Layer: 5 + m_Name: UITabButton (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1635335853 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1635335852} + 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: 1147576788} + m_Father: {fileID: 2036714140} + 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: 0, y: 30} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1635335854 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1635335852} + 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: 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: 1635335855} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1635335855 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1635335852} + 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: 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_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 &1635335856 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1635335852} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 58af61b23f40877429f8889337d2006a, type: 3} + m_Name: + m_EditorClassIdentifier: + button: {fileID: 1635335854} + tabText: {fileID: 0} + tabIcon: {fileID: 0} + background: {fileID: 0} +--- !u!222 &1635335857 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1635335852} + m_CullTransparentMesh: 1 --- !u!1001 &1840728471 PrefabInstance: m_ObjectHideFlags: 0 @@ -1927,6 +3676,142 @@ RectTransform: m_CorrespondingSourceObject: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3} m_PrefabInstance: {fileID: 2046556551915540031} m_PrefabAsset: {fileID: 0} +--- !u!1 &1868668759 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1868668760} + - component: {fileID: 1868668762} + - component: {fileID: 1868668761} + 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 &1868668760 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1868668759} + 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: 1379231488} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -465.5, y: -447} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1868668761 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1868668759} + 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: + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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: 24 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + 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 &1868668762 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1868668759} + m_CullTransparentMesh: 1 --- !u!1 &2030316708 GameObject: m_ObjectHideFlags: 0 @@ -2029,6 +3914,228 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 0} +--- !u!1 &2036714139 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2036714140} + - component: {fileID: 2036714142} + - component: {fileID: 2036714141} + - component: {fileID: 2036714144} + - component: {fileID: 2036714143} + - component: {fileID: 2036714145} + m_Layer: 5 + m_Name: LeftTabs + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2036714140 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2036714139} + 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: 1559054156} + - {fileID: 1635335853} + m_Father: {fileID: 953514228} + 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: -30} + m_SizeDelta: {x: 150, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &2036714141 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2036714139} + 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.8207547, g: 0.2516465, b: 0.2516465, 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: 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 &2036714142 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2036714139} + m_CullTransparentMesh: 1 +--- !u!114 &2036714143 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2036714139} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 0} + m_Horizontal: 1 + m_Vertical: 1 + m_MovementType: 1 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 0} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 0} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 0 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &2036714144 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2036714139} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &2036714145 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2036714139} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &2078014187 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2078014188} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2078014188 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2078014187} + 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: 229847714} + m_Father: {fileID: 1174938650} + 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!1 &2134831440 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2134831441} + 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 &2134831441 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2134831440} + 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: 302722922} + m_Father: {fileID: 1246324763} + 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!1001 &2046556551915540031 PrefabInstance: m_ObjectHideFlags: 0 @@ -2204,6 +4311,107 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: d8e7b6156a18a264390467f538204521, type: 3} +--- !u!1001 &4323524856404202291 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 2078014188} + m_Modifications: + - target: {fileID: 2965738868788178389, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: scrollRect + value: + objectReference: {fileID: 1312094715} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_Pivot.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_AnchorMin.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5208007342563872741, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8136911777273008353, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} + propertyPath: m_Name + value: DraggableScrollList + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 11968bbba596a584e92e29ce26e3897d, type: 3} --- !u!1001 &4941106811875985460 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/SampleProject/SceneMain.cs b/Assets/Scripts/SampleProject/SceneMain.cs index fd27f836..2609d412 100644 --- a/Assets/Scripts/SampleProject/SceneMain.cs +++ b/Assets/Scripts/SampleProject/SceneMain.cs @@ -47,9 +47,6 @@ namespace SampleProject { Initialized.Invoke(); } - - //MqttReceiver 시작 - DataRepository.Instance.MqttReceiver.Start(); } /// @@ -70,7 +67,8 @@ namespace SampleProject Debug.Log("requestDataAsync"); - UILoading.Show(); + //UILoading.Show(); + //Debug.Log("Requesting BaseInfo data..."); //var httpFetcher = DataRepository.Instance.HttpFetcher; //var splitRequest = new HttpRequestConfig(URLList.Get("baseinfo")) @@ -83,12 +81,12 @@ namespace SampleProject //UILoading.Hide(); //MqttReceiver 시작 - DataRepository.Instance.MqttReceiver.Start(); - if(AGVManager.Instance.Created) - { - await UniTask.Delay(1000); - UILoading.Hide(); - } + //DataRepository.Instance.MqttReceiver.Start(); + //if(AGVManager.Instance.Created) + //{ + // await UniTask.Delay(1000); + // UILoading.Hide(); + //} } private async void OnExitPlayback() diff --git a/Assets/Scripts/UVC/Data/Core/DataArray.cs b/Assets/Scripts/UVC/Data/Core/DataArray.cs index b925abe8..cc62796d 100644 --- a/Assets/Scripts/UVC/Data/Core/DataArray.cs +++ b/Assets/Scripts/UVC/Data/Core/DataArray.cs @@ -1,9 +1,8 @@ -using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; -using UnityEngine; namespace UVC.Data.Core { @@ -17,7 +16,9 @@ namespace UVC.Data.Core /// 이 객체가 객체 풀에 있는지 여부를 나타냅니다. /// 중복 반환을 방지하기 위해 DataArrayPool에서 내부적으로 사용됩니다. /// - internal bool IsInPool { get => isInPool; + internal bool IsInPool + { + get => isInPool; set { isInPool = value; @@ -268,7 +269,7 @@ namespace UVC.Data.Core // 기존 변경 추적 목록을 초기화합니다. ClearTrackedChanges(); - + var thisDict = this.ToDictionary(item => item.Id); var otherDict = otherArray.ToDictionary(item => item.Id); @@ -453,7 +454,7 @@ namespace UVC.Data.Core { // 풀에서 새 DataArray 인스턴스를 가져옵니다. DataArray clone; - if(fromPool) clone = DataArrayPool.Get(); + if (fromPool) clone = DataArrayPool.Get(); else clone = new DataArray(); // 배열의 모든 DataObject를 순회하며 각각을 복제합니다. @@ -475,7 +476,7 @@ namespace UVC.Data.Core { clone.modifiedList.Add(clonedItem); } - + } return clone; diff --git a/Assets/Scripts/UVC/Data/DataRepository.cs b/Assets/Scripts/UVC/Data/DataRepository.cs index 422590d6..fd1d298e 100644 --- a/Assets/Scripts/UVC/Data/DataRepository.cs +++ b/Assets/Scripts/UVC/Data/DataRepository.cs @@ -5,7 +5,6 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; -using UnityEngine; using UVC.Data.Core; using UVC.Data.Http; using UVC.Data.Mqtt; @@ -241,7 +240,8 @@ namespace UVC.Data { if (dataUpdateHandlers.ContainsKey(key)) { - UniTask.Post(() => dataUpdateHandlers[key]!.Invoke(dataObject)); + var handler = dataUpdateHandlers[key]; + UniTask.Post(() => handler.Invoke(dataObject)); } } } diff --git a/Assets/Scripts/UVC/Factory/Modal/ConfigDataOrderModal.cs b/Assets/Scripts/UVC/Factory/Modal/ConfigDataOrderModal.cs new file mode 100644 index 00000000..5d9ec117 --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Modal/ConfigDataOrderModal.cs @@ -0,0 +1,75 @@ +#nullable enable +using UnityEngine; +using UVC.UI.List; + +namespace UVC.Factory.Modal +{ + public class ConfigDataOrderModal : MonoBehaviour + { + [SerializeField] + private DraggableScrollList? draggableList; + + protected virtual void Awake() + { + if (draggableList == null) + { + Debug.LogError("draggableList 참조가 설정되지 않았습니다."); + return; + } + + // 이벤트 구독 + draggableList.OnItemReordered += OnItemReordered; + draggableList.OnItemSelected += OnItemSelected; + } + + private void Start() + { + // 1. DraggableItemData 설정 + for (int i = 0; i < 10; i++) + { + draggableList?.AddItem(new DraggableItemData($"Item {i + 1}", i)); + } + } + + /// + /// 아이템 순서 변경 이벤트 처리 + /// + /// 이벤트 발생자 + /// 이벤트 인자 + private void OnItemReordered(object? sender, DraggableItemReorderEventArgs e) + { + Debug.Log($"아이템 순서 변경됨: ID={e.ItemId}, {e.OldIndex} -> {e.NewIndex}"); + + // 여기에 순서 변경에 대한 비즈니스 로직 구현 + // 예: 서버에 변경사항 전송, 설정 저장 등 + } + + /// + /// 아이템 선택 이벤트 처리 + /// + /// 이벤트 발생자 + /// 선택된 아이템 + private void OnItemSelected(object? sender, DraggableListItem item) + { + if (item?.Data != null) + { + Debug.Log($"아이템 선택됨: {item.Data.Id}"); + + // 선택된 아이템에 대한 처리 + // 예: 상세 정보 표시, 편집 모드 진입 등 + } + } + + /// + /// 컴포넌트 정리 + /// + private void OnDestroy() + { + if (draggableList != null) + { + draggableList.OnItemReordered -= OnItemReordered; + draggableList.OnItemSelected -= OnItemSelected; + } + } + } +} diff --git a/Assets/Scripts/UVC/Factory/Modal/ConfigDataOrderModal.cs.meta b/Assets/Scripts/UVC/Factory/Modal/ConfigDataOrderModal.cs.meta new file mode 100644 index 00000000..a991929f --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Modal/ConfigDataOrderModal.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: dc92cc933c1ce844c955ffc32982d3af \ No newline at end of file diff --git a/Assets/Scripts/UVC/Factory/Playback/PlaybackCommand.cs b/Assets/Scripts/UVC/Factory/Playback/PlaybackCommand.cs index 7774c8a1..15746911 100644 --- a/Assets/Scripts/UVC/Factory/Playback/PlaybackCommand.cs +++ b/Assets/Scripts/UVC/Factory/Playback/PlaybackCommand.cs @@ -8,33 +8,75 @@ using UVC.UI.Modal; namespace UVC.Factory.Playback { + /// + /// 재생(Playback) 명령을 실행하는 클래스입니다. + /// + /// + /// 이 명령은 팩토리 카메라를 비활성화하고, 재생 목록 모달을 띄운 뒤, + /// 사용자가 재생 항목을 선택하면 재생을 시작합니다. + /// 사용자가 취소하면 재생을 종료합니다. + /// + /// + /// + /// + /// // ICommand 인터페이스를 구현하므로 다음과 같이 사용할 수 있습니다. + /// ICommand playbackCommand = new PlaybackCommand(); + /// playbackCommand.Execute(); + /// + /// + /// public class PlaybackCommand : ICommand { + /// + /// 재생 명령을 실행합니다. + /// + /// + /// 1. 카메라를 비활성화합니다.
+ /// 2. 재생 목록 모달을 띄웁니다.
+ /// 3. 사용자가 항목을 선택하면 재생을 시작합니다.
+ /// 4. 사용자가 취소하면 재생을 종료합니다.
+ ///
+ /// + /// + /// + /// // 명령 실행 예시 + /// var command = new PlaybackCommand(); + /// command.Execute(); + /// + /// + ///
+ /// 사용하지 않음 public async void Execute(object? parameter = null) { + // 1. 카메라 비활성화 FactoryCameraController.Instance.Enable = false; + // 2. 재생 목록 모달 생성 및 표시 var modalContent = new ModalContent(UIPlaybackListModal.PrefabPath) { Title = "Playback List", ConfirmButtonText = "Play", ShowCancelButton = false }; - + // 3. 사용자가 항목을 선택할 때까지 대기 UIPlaybackListItemData? result = await UVC.UI.Modal.Modal.Open(modalContent); Debug.Log($"PlaybackCommand result==null:{result==null}"); if (result != null) { + // 4. 항목 선택 시: 로딩 표시, 재생 시작 UILoading.Show(); UIPlaybackListItemData data = result; Debug.Log($"PlaybackCommand data:{data}"); DataRepository.Instance.MqttReceiver.Stop(); + await PlaybackService.Instance.StartAsync(data); + FactoryCameraController.Instance.Enable = true; UILoading.Hide(); } else - { + { + // 5. 취소 시: 재생 종료 UILoading.Show(); PlaybackService.Instance.Exit(); FactoryCameraController.Instance.Enable = true; diff --git a/Assets/Scripts/UVC/Factory/Playback/PlaybackRepository.cs b/Assets/Scripts/UVC/Factory/Playback/PlaybackRepository.cs index e021caa9..1b21ca9e 100644 --- a/Assets/Scripts/UVC/Factory/Playback/PlaybackRepository.cs +++ b/Assets/Scripts/UVC/Factory/Playback/PlaybackRepository.cs @@ -1,7 +1,6 @@ #nullable enable using Best.HTTP; using Cysharp.Threading.Tasks; -using SampleProject.Config; using System; using System.Collections.Generic; using UnityEngine; @@ -15,6 +14,23 @@ namespace UVC.Factory.Playback private PlaybackSQLiteService? sqliteService = null; + /// + /// 서버에서 재생 목록 날짜 리스트를 요청합니다. + /// + /// 예시: + /// + /// var repo = new PlaybackRepository(); + /// var dateList = await repo.RequestPlaybackDateList(); + /// if (dateList != null) + /// { + /// foreach (var date in dateList.Keys) + /// { + /// Debug.Log($"날짜: {date}"); + /// } + /// } + /// + /// + /// 성공 시 날짜별 재생 목록 딕셔너리, 실패 시 null public async UniTask>?> RequestPlaybackDateList() { @@ -45,6 +61,29 @@ namespace UVC.Factory.Playback } } + /// + /// 서버에서 재생 데이터 파일을 다운로드합니다. + /// + /// 예시: + /// + /// var repo = new PlaybackRepository(); + /// string fileName = "sample.db"; + /// string savePath = Application.persistentDataPath + "/sample.db"; + /// repo.DownloadPlaybackData( + /// fileName, + /// savePath, + /// (current, total) => Debug.Log($"{current}/{total} bytes 다운로드 중"), + /// () => Debug.Log("다운로드 완료"), + /// (error) => Debug.LogError($"다운로드 실패: {error}") + /// ); + /// + /// + /// 다운로드할 파일명 + /// 저장 경로 + /// 다운로드 진행 콜백 (현재, 전체 바이트) + /// 다운로드 완료 콜백 + /// 다운로드 실패 콜백 (에러 메시지) + /// 다운로드 요청 객체(필요시 Abort 등 제어 가능), 실패 시 null public HTTPRequest? DownloadPlaybackData(string fileName, string savePath, Action OnProgress, Action OnComplete, Action OnError) { try @@ -59,15 +98,29 @@ namespace UVC.Factory.Playback } /// - /// selectTime보다 +- second 사이의 데이터 요청. selectTime, second 포함 + /// selectTime보다 ±second 사이의 데이터를 조회합니다. selectTime, second 포함. + /// + /// 예시: + /// + /// var repo = new PlaybackRepository(); + /// string date = "2024-07-29"; + /// string sqlFileName = "sample.db"; + /// string selectTime = "2024-07-29T12:00:00.000Z"; + /// int second = 10; + /// var list = await repo.SelectBySecondAsync(date, sqlFileName, selectTime, second, true, 5); + /// foreach (var entity in list) + /// { + /// Debug.Log($"데이터: {entity.data}, 시간: {entity.timestamp}"); + /// } + /// /// - /// - /// - /// yyyy-MM-ddTHH:mm:ss.fffZ format string - /// - /// true: 오래된 시간이 먼저, false: 최근 시간이 먼저 - /// - /// + /// 폴더명(날짜 등) + /// SQLite 파일명 + /// yyyy-MM-ddTHH:mm:ss.fffZ 형식의 기준 시간 + /// ±초(양수: 미래, 음수: 과거) + /// true: 오래된 시간부터, false: 최근 시간부터 + /// 최대 조회 개수(0이면 제한 없음) + /// 조회된 데이터 리스트 public async UniTask> SelectBySecondAsync(string date, string sqlFileName, string selectTime, int second, bool orderAsc = true, int limit = 0) { validationSqliteService(date, sqlFileName); @@ -75,22 +128,46 @@ namespace UVC.Factory.Playback } /// - /// selectTime보다 +- second 사이의 데이터 요청. selectTime, second 포함 + /// baseInfo 테이블에서 selectTime보다 ±second 사이의 데이터를 조회합니다. selectTime, second 포함. + /// + /// 예시: + /// + /// var repo = new PlaybackRepository(); + /// string date = "2024-07-29"; + /// string sqlFileName = "sample.db"; + /// string selectTime = "2024-07-29T12:00:00.000Z"; + /// int second = -5; + /// var list = await repo.SelectBySecondBaseInfo(date, sqlFileName, selectTime, second, false, 1); + /// foreach (var entity in list) + /// { + /// Debug.Log($"데이터: {entity.data}, 시간: {entity.timestamp}"); + /// } + /// /// - /// - /// - /// yyyy-MM-ddTHH:mm:ss.fffZ format string - /// - /// true: 오래된 시간이 먼저, false: 최근 시간이 먼저 - /// - /// + /// 폴더명(날짜 등) + /// SQLite 파일명 + /// yyyy-MM-ddTHH:mm:ss.fffZ 형식의 기준 시간 + /// ±초(양수: 미래, 음수: 과거) + /// true: 오래된 시간부터, false: 최근 시간부터 + /// 최대 조회 개수 + /// 조회된 데이터 리스트 public async UniTask> SelectBySecondBaseInfo(string date, string sqlFileName, string selectTime, int second = 59, bool orderAsc = true, int limit = 1) { validationSqliteService(date, sqlFileName); return await sqliteService!.SelectBySecondBaseInfo(selectTime, second, orderAsc, limit); } - + /// + /// 내부적으로 SQLite 서비스가 올바른 파일에 연결되어 있는지 확인하고, 필요시 재연결합니다. + /// + /// 예시: + /// + /// // 일반적으로 직접 호출할 필요 없음(내부에서 자동 호출) + /// validationSqliteService("2024-07-29", "sample.db"); + /// + /// + /// 폴더명(날짜 등) + /// SQLite 파일명 private void validationSqliteService(string date, string sqlFileName) { if (sqliteService == null) sqliteService = new PlaybackSQLiteService(); diff --git a/Assets/Scripts/UVC/Factory/Playback/PlaybackSQLiteService.cs b/Assets/Scripts/UVC/Factory/Playback/PlaybackSQLiteService.cs index e7c5f5fd..d8bca4a7 100644 --- a/Assets/Scripts/UVC/Factory/Playback/PlaybackSQLiteService.cs +++ b/Assets/Scripts/UVC/Factory/Playback/PlaybackSQLiteService.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.IO; using System.Text; -using UnityEngine; using UVC.Factory.Playback; using UVC.Util; @@ -12,16 +11,10 @@ namespace UVC.Factory { public class PlaybackSQLiteService { - - //#region Singleton - //private static readonly SQLiteService instance = new SQLiteService(); - //public static SQLiteService Instance => instance; - //static SQLiteService() { } - //#endregion - - + // SQLite 데이터베이스 연결 객체 private SQLiteConnection dbConnection; + // 데이터베이스 연결 여부 확인 public bool Connected { get => dbConnection != null; } private string date; @@ -29,6 +22,16 @@ namespace UVC.Factory private string sqliteFileName; public string SqliteFileName { get => sqliteFileName; } + /// + /// 데이터베이스 파일에 연결합니다. + /// 예시: + /// + /// var service = new PlaybackSQLiteService(); + /// service.Connect("2024-07-29", "sample.db"); + /// + /// + /// 폴더명(날짜 등) + /// SQLite 파일명 public void Connect(string date, string sqliteFileName) { this.date = date; @@ -36,6 +39,13 @@ namespace UVC.Factory dbConnection = new SQLiteConnection(Path.Combine(PlaybackService.PlaybackFolderPath, date, sqliteFileName)); } + /// + /// 데이터베이스 연결을 닫습니다. + /// 예시: + /// + /// service.CloseDB(); + /// + /// public void CloseDB() { dbConnection.Close(); @@ -43,30 +53,23 @@ namespace UVC.Factory } /// - /// 추가하기 + /// realTime 테이블에 데이터를 추가합니다. + /// 예시: + /// + /// int rows = service.Insert("센서값", "2024-07-29T12:00:00.000Z", "온도값"); + /// /// - /// - /// yyyy-MM-ddTHH:mm:ss.fffZ format string - /// - /// 데이터베이스에서 추가된 행 수 + /// 저장할 데이터(문자열) + /// yyyy-MM-ddTHH:mm:ss.fffZ 형식의 시간 + /// 임시 데이터(옵션) + /// 추가된 행 수 public int Insert(string data, string timeStamp, string temp = null) { var query = $"INSERT INTO realTime (data, timestamp, temp) VALUES ('{data}', '{timeStamp}', " + (temp == null ? "null" : "'" + temp + "'") + ");"; int changedRowLen = dbConnection.Execute(query); return changedRowLen; } - - /// - /// selectTime보다 +- second 사이의 데이터 요청. selectTime, second 포함 - /// second > 0 : selectTime <= data < selectTime + second - /// second < 0 : selectTime + second < data <= selectTime - /// - /// yyyy-MM-ddTHH:mm:ss.fffZ format string - /// - /// true: 오래된 시간이 먼저, false: 최근 시간이 먼저 - /// - /// - /// + readonly string[] queryParts = { "SELECT * FROM realTime WHERE ", @@ -77,6 +80,20 @@ namespace UVC.Factory " ORDER BY timestamp ", " LIMIT ", }; + + /// + /// 특정 시간(selectTime) 기준으로 ±second 범위의 데이터를 조회합니다. + /// 예시: + /// + /// // 10초 뒤까지의 데이터 5개를 조회(오름차순) + /// var list = await service.SelectBySecond("2024-07-29T12:00:00.000Z", 10, true, 5); + /// + /// + /// 기준 시간(yyyy-MM-ddTHH:mm:ss.fffZ) + /// ±초(양수: 미래, 음수: 과거) + /// true: 오래된 시간부터, false: 최근 시간부터 + /// 최대 조회 개수(0이면 제한 없음) + /// 조회된 데이터 리스트 public async UniTask> SelectBySecond(string selectTime, int second, bool orderAsc = true, int limit = 0) { bool isMainThread = PlayerLoopHelper.IsMainThread; @@ -104,25 +121,26 @@ namespace UVC.Factory //Debug.Log($"SelectBySecond {query}"); var query = queryBuilder.ToString(); queryBuilder.Clear(); + // 쿼리 실행 및 결과 반환 return dbConnection.Query(query); }); if (!isMainThread) await UniTask.SwitchToThreadPool(); return result; } - /// - /// selectTime보다 +- second 사이의 데이터 요청. selectTime, second 포함 - /// second > 0 : selectTime <= data < selectTime + second - /// second < 0 : selectTime + second < data <= selectTime - /// - /// yyyy-MM-ddTHH:mm:ss.fffZ format string - /// - /// true: 오래된 시간이 먼저, false: 최근 시간이 먼저 - /// - /// - /// - StringBuilder queryBuilder = new(); + /// baseInfo 테이블에서 특정 시간(selectTime) 기준으로 ±second 범위의 데이터를 조회합니다. + /// 예시: + /// + /// // 5초 전까지의 데이터 1개를 조회(내림차순) + /// var list = await service.SelectBySecondBaseInfo("2024-07-29T12:00:00.000Z", -5); + /// + /// + /// 기준 시간(yyyy-MM-ddTHH:mm:ss.fffZ) + /// ±초(양수: 미래, 음수: 과거) + /// true: 오래된 시간부터, false: 최근 시간부터 + /// 최대 조회 개수 + /// 조회된 데이터 리스트 public async UniTask> SelectBySecondBaseInfo(string selectTime, int second, bool orderAsc = false, int limit = 1) { bool isMainThread = PlayerLoopHelper.IsMainThread; @@ -148,6 +166,7 @@ namespace UVC.Factory //Debug.Log($"SelectBySecondBaseInfo {query}"); var query = queryBuilder.ToString(); queryBuilder.Clear(); + // 쿼리 실행 및 결과 반환 return dbConnection.Query(query); }); if (!isMainThread) await UniTask.SwitchToThreadPool(); @@ -155,14 +174,25 @@ namespace UVC.Factory } } - + /// + /// 데이터베이스에서 사용하는 데이터 구조체입니다. + /// 예시: + /// + /// var entity = new PlaybackSQLiteDataEntity { + /// data = "센서값", + /// timestamp = "2024-07-29T12:00:00.000Z", + /// temp = "임시값" + /// }; + /// + /// [System.Serializable] public class PlaybackSQLiteDataEntity { public string data { get; set; } [PrimaryKey] public string timestamp { get; set; } - public DateTime timestampHungary { get => DateTimeUtil.UtcStringToKoreaDateTime(timestamp); } + // timestampHungary는 timestamp를 DateTime으로 변환한 값입니다. + public DateTime timestampHungary { get => DateTimeUtil.UtcStringToHungaryDateTime(timestamp); } public string temp { get; set; } } } diff --git a/Assets/Scripts/UVC/Factory/Playback/PlaybackService.cs b/Assets/Scripts/UVC/Factory/Playback/PlaybackService.cs index 41b32e7b..0747d3e5 100644 --- a/Assets/Scripts/UVC/Factory/Playback/PlaybackService.cs +++ b/Assets/Scripts/UVC/Factory/Playback/PlaybackService.cs @@ -12,14 +12,34 @@ using UVC.Factory.Playback.UI; using UVC.Util; namespace UVC.Factory.Playback { + /// + /// Playback 관련 서비스 클래스입니다. + /// - 싱글턴 패턴으로 사용합니다. + /// - 재생 데이터 요청, 다운로드, 시간 스케일 조정 등 주요 기능을 제공합니다. + /// + /// + /// + /// // 재생 시작 예시 + /// var itemData = new UIPlaybackListItemData { date = "2024-07-29", time = "13", sqlFileName = "2024-07-29_13.sqlite" }; + /// await PlaybackService.Instance.StartAsync(itemData); + /// + /// // 재생 목록 데이터 요청 예시 + /// var data = await PlaybackService.Instance.RequestDataAsync(); + /// + /// // 재생 종료 예시 + /// PlaybackService.Instance.Exit(); + /// + /// + /// public class PlaybackService { #region Singleton + // 싱글턴 인스턴스. PlaybackService.Instance로 접근합니다. private static readonly PlaybackService instance = new PlaybackService(new PlaybackRepository()); public static PlaybackService Instance => instance; static PlaybackService() { } #endregion - + // 재생 데이터가 저장되는 폴더 경로입니다. public static readonly string PlaybackFolderPath = Path.Combine(Application.persistentDataPath, "playback");//streamingAssetsPath, "playback"); appData 폴더로 변경 private readonly PlaybackRepository repository; @@ -31,6 +51,15 @@ namespace UVC.Factory.Playback public Action OnExitPlayback; private float timeScale = 1.0f; + /// + /// 재생 시간 스케일(배속)입니다. 1.0f가 기본입니다. + /// + /// + /// + /// // 재생 속도를 2배로 변경 + /// PlaybackService.Instance.TimeScale = 2.0f; + /// + /// public float TimeScale { get => timeScale; @@ -48,17 +77,49 @@ namespace UVC.Factory.Playback public Action OnChangeTimeScale; + /// + /// 생성자. 일반적으로 직접 호출하지 않고 싱글턴 인스턴스를 사용합니다. + /// public PlaybackService(PlaybackRepository repository) { this.repository = repository; } + /// + /// 서버에서 재생 가능한 날짜별 데이터 목록을 비동기로 요청합니다. + /// + /// 성공 시 날짜별 재생 목록 딕셔너리, 실패 시 null + /// + /// + /// var data = await PlaybackService.Instance.RequestDataAsync(); + /// if (data != null) + /// { + /// foreach (var date in data.Keys) + /// { + /// Debug.Log($"날짜: {date}"); + /// } + /// } + /// + /// public async UniTask>?> RequestDataAsync() { Dictionary>? data = await repository.RequestPlaybackDateList(); return data; } + /// + /// 재생을 위한 기본 정보 데이터를 비동기로 처리합니다. + /// + /// 날짜(예: "2024-07-29") + /// 시간(예: "13") + /// 파일명(예: "2024-07-29_13.sqlite") + /// 분(기본값: "00") + /// 초(기본값: "00") + /// + /// + /// await PlaybackService.Instance.DispatchBaseInfoData("2024-07-29", "13", "2024-07-29_13.sqlite"); + /// + /// public async UniTask DispatchBaseInfoData(string date, string time, string fileName, string minute = "00", string second = "00") { await UniTask.RunOnThreadPool(async () => @@ -87,9 +148,15 @@ namespace UVC.Factory.Playback } /// - /// + /// 실시간 재생 데이터(특정 초 단위)를 비동기로 처리합니다. /// - /// 0 ~ 3600 + /// 0 ~ 3600 (초 단위) + /// 재생 속도 + /// + /// + /// await PlaybackService.Instance.DispatchRealTimeData(120, 1); // 120초(2분) 위치 데이터 처리 + /// + /// public async UniTask DispatchRealTimeData(int second, int speed) { await UniTask.RunOnThreadPool(async () => @@ -117,6 +184,16 @@ namespace UVC.Factory.Playback }); } + /// + /// 재생을 시작합니다. UI를 표시하고 데이터를 세팅합니다. + /// + /// 재생 목록 아이템 데이터 + /// + /// + /// var itemData = new UIPlaybackListItemData { date = "2024-07-29", time = "13", sqlFileName = "2024-07-29_13.sqlite" }; + /// await PlaybackService.Instance.StartAsync(itemData); + /// + /// public async Task StartAsync(UIPlaybackListItemData data) { timeScale = 1.0f; //기본 시간 스케일 설정 @@ -124,11 +201,44 @@ namespace UVC.Factory.Playback await UIPlayback.Instance.SetData(data.date, data.time, data.sqlFileName); } + /// + /// 재생을 종료합니다. (이벤트 발생) + /// + /// + /// + /// PlaybackService.Instance.Exit(); + /// + /// public void Exit() { OnExitPlayback?.Invoke(); } + /// + /// 재생 데이터 파일을 준비(다운로드 및 압축 해제)합니다. + /// 이미 파일이 있으면 바로 콜백을 호출합니다. + /// + /// 날짜(예: "2024-12-05") + /// 시간(예: "13") + /// 파일명(예: "2024-12-05_0.sqlite.7z") + /// 진행 상황 콜백 (진행 바이트, 전체 바이트, 퍼센트) + /// 완료 콜백 (에러 메시지, 성공 시 null) + /// 다운로드 요청 객체(필요시 Abort 등 제어 가능), 이미 파일이 있으면 null + /// + /// + /// // 파일 준비 및 다운로드 예시 + /// PlaybackService.Instance.ReadyData( + /// "2024-12-05", "13", "2024-12-05_0.sqlite.7z", + /// (progress, total, percent) => Debug.Log($"{progress}/{total} ({percent * 100:F1}%)"), + /// (error) => { + /// if (string.IsNullOrEmpty(error)) + /// Debug.Log("파일 준비 완료"); + /// else + /// Debug.LogError($"오류: {error}"); + /// } + /// ); + /// + /// public HTTPRequest? ReadyData(string date, string time, string fileName, Action OnProgress, Action OnComplete) { //date : "2024-12-05" diff --git a/Assets/Scripts/UVC/Factory/Playback/UI/UIPlayback.cs b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlayback.cs index 2ed0f7f1..3b712d1a 100644 --- a/Assets/Scripts/UVC/Factory/Playback/UI/UIPlayback.cs +++ b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlayback.cs @@ -3,15 +3,18 @@ using System; using TMPro; using UnityEngine; using UnityEngine.UI; -using UVC.Extension; using UVC.UI; -using UVC.UI.Loading; namespace UVC.Factory.Playback.UI { + /// + /// 재생 UI를 관리하는 클래스입니다. + /// - UI 요소의 표시/숨김, 버튼/슬라이더 등 UI 이벤트를 처리합니다. + /// - 실제 재생 로직은 UIPlaybackController에서 처리합니다. + /// public class UIPlayback : MonoBehaviour { - + // 싱글톤 패턴: 어디서든 UIPlayback.Instance로 접근할 수 있습니다. private static UIPlayback instance; public static UIPlayback Instance { @@ -22,98 +25,129 @@ namespace UVC.Factory.Playback.UI } } + /// + /// UIPlayback 프리팹을 동적으로 생성합니다. + /// + /// 생성된 UIPlayback 인스턴스 private static UIPlayback CreateUIPlayBack() { - GameObject prefab = Resources.Load("Prefabs/Factory/Playback/UIPlayback"); + // Resources 폴더에서 프리팹을 불러와 인스턴스화합니다. + GameObject prefab = Resources.Load("Prefabs/UI/Playback/UIPlayback"); GameObject go = GameObject.Instantiate(prefab); return go.GetComponent(); } - + + // Inspector에서 연결할 UI 컴포넌트들입니다. [SerializeField] [Tooltip("종료 버튼")] private Button exitButton; + [SerializeField] [Tooltip("종료 버튼")] private TextMeshProUGUI dateTimeTxt0; + [SerializeField] [Tooltip("종료 버튼")] private TextMeshProUGUI dateTimeTxt1; + [SerializeField] [Tooltip("play 버튼")] private Button playButton; + [SerializeField] [Tooltip("play 버튼 이미지")] private Image playButtonImage; + [SerializeField] [Tooltip("play 버튼 이미지 Sprite")] private Sprite playButtonImagePlay; + [SerializeField] [Tooltip("play 버튼 Puase 이미지 Sprite")] private Sprite playButtonImagePause; + [SerializeField] [Tooltip("Speed Slider")] private UISliderWithLabel sliderSpeed; + [SerializeField] [Tooltip("투명 조절 Slider")] private SliderWithEvent opacitySlider; + [SerializeField] [Tooltip("Progress Bar")] private UIPlaybackProgressBar progressBar; + [SerializeField] private CanvasGroup canvasGroup; + [SerializeField] private UIDragger uiDragger; - private bool isPlaying = false; - private bool preparingData = false; + // 컨트롤러: 실제 재생 로직을 담당합니다. + private UIPlaybackController controller; - private string date; - private string time; - private string fileName; + // UI 이벤트를 외부(Controller)로 전달하기 위한 이벤트입니다. + public event Action OnClickExitButton; + public event Action OnClickPlayButton; + public event Action OnChangeProgressValue; + public event Action OnChangeSpeedValue; + public event Action OnChangeOpacityValue; - private bool isTick = false; - private bool IsTick + /// + /// 오브젝트가 생성될 때 호출됩니다. + /// + private void Awake() { - get => isTick; - set - { - if (isTick != value) - { - var temp = isTick; - isTick = value; - if (!temp && value) OnTimer().Forget(); - } - } + controller = new UIPlaybackController(this); + Init(); } + /// + /// UI 이벤트 리스너를 등록합니다. + /// private void Init() { - exitButton.onClick.AddListener(OnClickExit); - playButton.onClick.AddListener(OnClickPlay); + // 버튼 클릭 시 이벤트 발생 + exitButton.onClick.AddListener(() => OnClickExitButton?.Invoke()); + playButton.onClick.AddListener(() => OnClickPlayButton?.Invoke()); - progressBar.OnChangeValue += OnChangeProgress; - sliderSpeed.OnChangeValue += OnChangeSpeed; - opacitySlider.onValueChanged.AddListener(OnValueChangedOpcity); + // 슬라이더/프로그레스바 값 변경 시 이벤트 발생 + progressBar.OnChangeValue += (value) => OnChangeProgressValue?.Invoke(value); + sliderSpeed.OnChangeValue += (value) => OnChangeSpeedValue?.Invoke(value); + opacitySlider.onValueChanged.AddListener((value) => OnChangeOpacityValue?.Invoke(value)); } - - + /// + /// 오브젝트가 파괴될 때 호출됩니다. + /// private void OnDestroy() { - exitButton.onClick.RemoveListener(OnClickExit); - playButton.onClick.RemoveListener(OnClickPlay); + // 모든 이벤트 리스너 해제 + exitButton.onClick.RemoveAllListeners(); + playButton.onClick.RemoveAllListeners(); progressBar.OnChangeValue = null; sliderSpeed.OnChangeValue = null; - opacitySlider.onValueChanged.RemoveListener(OnValueChangedOpcity); - if (isPlaying) IsTick = false; + opacitySlider.onValueChanged.RemoveAllListeners(); + controller.Dispose(); } + /// + /// UI를 화면에 표시합니다. + /// + /// + /// + /// // UIPlayback을 화면에 띄우는 예시 + /// UIPlayback.Instance.Show(); + /// + /// public void Show() { if (playButton == null) Init(); gameObject.SetActive(true); if (transform.parent == null) { + // ModalCanvas에 붙여서 항상 위에 보이도록 설정 var canvases = GameObject.FindObjectsByType(FindObjectsSortMode.None); foreach (var canvas in canvases) { @@ -127,146 +161,118 @@ namespace UVC.Factory.Playback.UI } } + /// + /// UI를 화면에서 숨깁니다. + /// + /// + /// + /// // UIPlayback을 숨기는 예시 + /// UIPlayback.Instance.Hide(); + /// + /// public void Hide() { - UpdateTimeScale(1); - IsTick = false; + controller.UpdateTimeScale(1); + controller.IsTick = false; gameObject.SetActive(false); } - private void OnClickExit() + /// + /// 재생에 필요한 데이터를 설정합니다. + /// + /// 날짜(예: "2024-07-29") + /// 시간(초 단위 문자열, 예: "3600") + /// 파일명 + /// 비동기 작업(UniTask) + /// + /// + /// await UIPlayback.Instance.SetData("2024-07-29", "3600", "sample.sqlite"); + /// + /// + public UniTask SetData(string date, string time, string fileName) { - UILoading.Show(); - isPlaying = false; - UpdatePlayState(); - Hide(); - PlaybackService.Instance.Exit(); - + return controller.SetData(date, time, fileName); } - private void OnClickPlay() + #region View Update Methods + + /// + /// 날짜/시간 텍스트를 갱신합니다. + /// + /// 표시할 날짜 문자열 + public void UpdateDateTime(string date) { - isPlaying = !isPlaying; - UpdatePlayState(); + dateTimeTxt0.text = dateTimeTxt1.text = date; } - private void OnChangeProgress(int newValue) + /// + /// 재생 진행 바를 초기화합니다. + /// + /// 전체 재생 시간(초) + public void InitProgressBar(int time) => progressBar.Init(time); + + /// + /// 속도 슬라이더를 초기화합니다. + /// + public void InitSpeedSlider() => sliderSpeed.Init(); + + /// + /// 재생/일시정지 버튼 이미지를 갱신합니다. + /// + /// 재생 중이면 true, 아니면 false + public void UpdatePlayButtonState(bool isPlaying) { - ChangePlayTime().Forget(); - } - - private void OnChangeSpeed(int newValue) - { - if (isPlaying) - { - //if (Time.timeScale != sliderSpeed.Value) UpdateTimeScale(sliderSpeed.Value); - UpdateTimeScale(sliderSpeed.Value); - } - else - { - UpdateTimeScale(1); - } - } - - private void OnValueChangedOpcity(float newValue) - { - canvasGroup.alpha = opacitySlider.value; - } - - - private async UniTaskVoid ChangePlayTime() - { - - bool tempIsPlaing = isPlaying; - isPlaying = false; - int newSecond = (int)progressBar.Value; - if (newSecond == progressBar.MaxValue) - { - newSecond -= 60; - progressBar.Value = newSecond; - } - preparingData = true; - progressBar.Interactable = !preparingData; - IsTick = false; - UILoading.Show(); - UpdatePlayState(); - await UniTask.WaitForSeconds(0.5f); - int minute = (int)newSecond / 60; - int seconds = (int)newSecond % 60; - await PlaybackService.Instance.DispatchBaseInfoData(date, time, fileName, minute.ToString("00"), seconds.ToString("00")); - preparingData = false; - progressBar.Interactable = !preparingData; - if (isPlaying != tempIsPlaing) - { - isPlaying = tempIsPlaing; - UpdatePlayState(); - } - UILoading.Hide(); - await UniTask.WaitForSeconds(0.5f); - } - - public async UniTask SetData(string date, string time, string fileName) - { - Init(); - this.date = date; - this.time = time; - this.fileName = fileName; - Debug.Log($"UIPlayback SetData {date} {time}"); - - int timeInt = int.Parse(time); - dateTimeTxt0.text = dateTimeTxt1.text = date.Substring(2).Replace("-", "."); - progressBar.Init(timeInt); - sliderSpeed.Init(); - - UpdateTimeScale(1); - canvasGroup.alpha = opacitySlider.value = 1; - preparingData = true; - progressBar.Interactable = !preparingData; - isPlaying = false; - - UpdatePlayState(); - - await PlaybackService.Instance.DispatchBaseInfoData(date, time, fileName); - preparingData = false; - progressBar.Interactable = !preparingData; - } - - private void UpdatePlayState() - { - playButton.enabled = false; - progressBar.enabled = false; playButtonImage.sprite = isPlaying ? playButtonImagePause : playButtonImagePlay; - IsTick = isPlaying; - progressBar.enabled = true; - playButton.enabled = true; - OnChangeSpeed(sliderSpeed.Value); } - - private async UniTaskVoid OnTimer() + /// + /// 재생 진행 바의 값을 설정합니다. + /// + /// 설정할 값(초) + public void SetProgressValue(int value) { - if (progressBar.Value == progressBar.MaxValue) + if (progressBar.Value != value) { - if (isPlaying) OnClickPlay(); - return; - } - progressBar.Value += 1; - //PlaybackService.Instance.DispatchingTimelineEvent = false; - PlaybackService.Instance.DispatchRealTimeData(progressBar.Value, sliderSpeed.Value).Forget(); - - if (isTick) - { - //PlaybackService.Instance.DispatchingTimelineEvent = true; - await UniTask.Delay(TimeSpan.FromMilliseconds(1000 / sliderSpeed.Value)); - OnTimer().Forget(); + progressBar.Value = value; } } - private void UpdateTimeScale(float timeScale) + /// + /// 현재 재생 위치(초)를 반환합니다. + /// + public int GetProgressValue() => progressBar.Value; + + /// + /// 전체 재생 시간(초)를 반환합니다. + /// + public int GetProgressMaxValue() => progressBar.MaxValue; + + /// + /// 현재 선택된 재생 속도를 반환합니다. + /// + public int GetSpeedValue() => sliderSpeed.Value; + + /// + /// UI의 투명도를 설정합니다. + /// + /// 0(완전 투명) ~ 1(완전 불투명) + public void SetOpacity(float value) { - PlaybackService.Instance.TimeScale = timeScale; + canvasGroup.alpha = value; + opacitySlider.value = value; } + /// + /// UI의 상호작용 가능 여부를 설정합니다. + /// + /// true면 버튼/슬라이더 사용 가능 + public void SetUIInteractable(bool isInteractable) + { + playButton.enabled = isInteractable; + progressBar.Interactable = isInteractable; + } + #endregion + } } diff --git a/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackController.cs b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackController.cs new file mode 100644 index 00000000..9fb08e7e --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackController.cs @@ -0,0 +1,283 @@ +using Cysharp.Threading.Tasks; +using System; +using UVC.UI.Loading; + +namespace UVC.Factory.Playback.UI +{ + /// + /// UIPlaybackController는 UIPlayback(View)에서 발생하는 이벤트를 받아 + /// 실제 재생, 일시정지, 데이터 준비 등 비즈니스 로직을 처리하는 컨트롤러입니다. + /// + /// 예시: UIPlayback과의 연결 + /// + /// // UIPlayback에서 컨트롤러를 생성할 때 View를 넘겨줍니다. + /// var controller = new UIPlaybackController(this); + /// + /// + public class UIPlaybackController : IDisposable + { + /// + /// View 역할을 하는 UIPlayback 참조입니다. + /// + private readonly UIPlayback view; + + // 재생 중 여부 + private bool isPlaying = false; + // 데이터 준비 중 여부 + private bool preparingData = false; + // 재생에 필요한 정보 + private string date; + private string time; + private string fileName; + // 타이머 동작 여부 + private bool isTick = false; + + /// + /// 타이머 동작 여부를 외부에서 제어할 수 있습니다. + /// true로 설정하면 내부적으로 OnTimer()가 실행됩니다. + /// + /// + /// + /// // 타이머를 시작하려면 + /// controller.IsTick = true; + /// // 타이머를 멈추려면 + /// controller.IsTick = false; + /// + /// + public bool IsTick + { + get => isTick; + set + { + if (isTick != value) + { + isTick = value; + if (isTick) OnTimer().Forget(); + } + } + } + + /// + /// 생성자에서 View와 이벤트를 연결합니다. + /// + /// UIPlayback 인스턴스 + public UIPlaybackController(UIPlayback view) + { + this.view = view; + SubscribeToViewEvents(); + } + + /// + /// View에서 발생하는 이벤트를 컨트롤러의 메서드와 연결합니다. + /// + private void SubscribeToViewEvents() + { + view.OnClickExitButton += OnClickExit; + view.OnClickPlayButton += OnClickPlay; + view.OnChangeProgressValue += OnChangeProgress; + view.OnChangeSpeedValue += OnChangeSpeed; + view.OnChangeOpacityValue += OnValueChangedOpacity; + } + + /// + /// 컨트롤러가 더 이상 필요 없을 때 이벤트 연결을 해제합니다. + /// + public void Dispose() + { + if (isPlaying) IsTick = false; + view.OnClickExitButton -= OnClickExit; + view.OnClickPlayButton -= OnClickPlay; + view.OnChangeProgressValue -= OnChangeProgress; + view.OnChangeSpeedValue -= OnChangeSpeed; + view.OnChangeOpacityValue -= OnValueChangedOpacity; + } + + /// + /// 재생에 필요한 데이터를 설정하고 UI를 초기화합니다. + /// + /// 날짜(예: "2024-07-29") + /// 시간(초 단위 문자열, 예: "3600") + /// 파일명 + /// 비동기 작업(UniTask) + /// + /// + /// // 재생 데이터를 설정하는 예시 + /// await controller.SetData("2024-07-29", "3600", "sample.sqlite"); + /// + /// + public async UniTask SetData(string date, string time, string fileName) + { + this.date = date; + this.time = time; + this.fileName = fileName; + + int timeInt = int.Parse(time); + view.UpdateDateTime(date.Substring(2).Replace("-", ".")); + view.InitProgressBar(timeInt); + view.InitSpeedSlider(); + view.SetOpacity(1); + + UpdateTimeScale(1); + preparingData = true; + view.SetUIInteractable(!preparingData); + isPlaying = false; + UpdatePlayState(); + + // 실제 데이터 로딩 (비동기) + await PlaybackService.Instance.DispatchBaseInfoData(date, time, fileName); + preparingData = false; + view.SetUIInteractable(!preparingData); + } + + /// + /// 종료 버튼 클릭 시 호출됩니다. + /// + /// + /// UI를 숨기고, 재생 상태를 초기화하며, PlaybackService에 종료를 알립니다. + /// + private void OnClickExit() + { + UILoading.Show(); + isPlaying = false; + UpdatePlayState(); + view.Hide(); + PlaybackService.Instance.Exit(); + } + + /// + /// 재생/일시정지 버튼 클릭 시 호출됩니다. + /// + /// + /// 데이터 준비 중에는 동작하지 않습니다. + /// + private void OnClickPlay() + { + if (preparingData) return; + isPlaying = !isPlaying; + UpdatePlayState(); + } + + // + /// 재생 위치(프로그레스바) 변경 시 호출됩니다. + /// + /// 변경된 위치(초) + private void OnChangeProgress(int newValue) + { + ChangePlayTime().Forget(); + } + + /// + /// 재생 속도 변경 시 호출됩니다. + /// + /// 변경된 속도 값 + private void OnChangeSpeed(int newValue) + { + UpdateTimeScale(isPlaying ? view.GetSpeedValue() : 1); + } + + /// + /// 투명도 슬라이더 변경 시 호출됩니다. + /// + /// 0~1 사이의 투명도 값 + private void OnValueChangedOpacity(float newValue) + { + view.SetOpacity(newValue); + } + + /// + /// 재생/일시정지 상태에 따라 UI와 타이머를 갱신합니다. + /// + private void UpdatePlayState() + { + view.UpdatePlayButtonState(isPlaying); + IsTick = isPlaying; + OnChangeSpeed(view.GetSpeedValue()); + } + + /// + /// 재생 위치를 변경할 때 호출됩니다. + /// 데이터 준비, UI 비활성화, 로딩 표시 등 처리 후 재생 위치를 이동합니다. + /// + private async UniTaskVoid ChangePlayTime() + { + bool tempIsPlaying = isPlaying; + isPlaying = false; + UpdatePlayState(); + + int newSecond = view.GetProgressValue(); + if (newSecond == view.GetProgressMaxValue()) + { + newSecond -= 60; + view.SetProgressValue(newSecond); + } + + preparingData = true; + view.SetUIInteractable(!preparingData); + IsTick = false; + UILoading.Show(); + + + int minute = newSecond / 60; + int seconds = newSecond % 60; + // 새로운 위치로 데이터 요청 + await PlaybackService.Instance.DispatchBaseInfoData(date, time, fileName, minute.ToString("00"), seconds.ToString("00")); + + preparingData = false; + view.SetUIInteractable(!preparingData); + + if (tempIsPlaying) + { + isPlaying = true; + UpdatePlayState(); + } + UILoading.Hide(); + } + + /// + /// 재생 중일 때 일정 간격으로 호출되어 진행 바를 업데이트합니다. + /// + /// + /// IsTick이 true일 때만 동작합니다. + /// + /// + /// + /// // 타이머를 시작하려면 + /// controller.IsTick = true; + /// + /// + private async UniTaskVoid OnTimer() + { + if (view.GetProgressValue() >= view.GetProgressMaxValue()) + { + if (isPlaying) OnClickPlay(); + return; + } + + view.SetProgressValue(view.GetProgressValue() + 1); + // 실시간 데이터 요청 + PlaybackService.Instance.DispatchRealTimeData(view.GetProgressValue(), view.GetSpeedValue()).Forget(); + + if (IsTick) + { + // 재생 속도에 따라 대기 시간 조절 + await UniTask.Delay(TimeSpan.FromMilliseconds(1000 / view.GetSpeedValue())); + if (IsTick) OnTimer().Forget(); + } + } + + /// + /// 재생 속도를 PlaybackService에 반영합니다. + /// + /// 적용할 재생 속도 + /// + /// + /// // 재생 속도를 2배로 변경 + /// controller.UpdateTimeScale(2f); + /// + /// + internal void UpdateTimeScale(float timeScale) + { + PlaybackService.Instance.TimeScale = timeScale; + } + } +} diff --git a/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackController.cs.meta b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackController.cs.meta new file mode 100644 index 00000000..c592d55f --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: eedd46434a3229b479a141df871ae2ae \ No newline at end of file diff --git a/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListItem.cs b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListItem.cs index 77384529..1966db42 100644 --- a/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListItem.cs +++ b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListItem.cs @@ -14,20 +14,55 @@ using UVC.Util; namespace UVC.Factory.Playback.UI { - + /// + /// 재생 목록의 각 아이템(1시간 단위 파일)을 나타내는 UI 컴포넌트입니다. + /// 다운로드, 삭제, 선택 등 다양한 상태를 관리합니다. + /// + /// 샘플 사용법: + /// + /// // 1. 풀에서 아이템 생성 및 초기화 + /// var itemData = new UIPlaybackListItemData { + /// date = "2024-07-29", + /// time = "13", + /// zipFileName = "2024-07-29_13.zip", + /// sqlFileName = "2024-07-29_13.sql" + /// }; + /// var item = UIPlaybackListItem.CreateFromPool(parentTransform); + /// item.Init(itemData); + /// + /// // 2. 선택 이벤트 등록 + /// item.OnSelect = (data, selected) => { + /// Debug.Log($"{data.time}시 아이템이 {(selected ? "선택됨" : "선택 해제됨")}"); + /// }; + /// + /// // 3. 상태 변경 이벤트 등록 + /// item.OnChangeStatus = (data, status) => { + /// Debug.Log($"{data.time}시 아이템 상태: {status}"); + /// }; + /// + /// // 4. 다운로드 버튼 클릭(직접 호출 예시) + /// // item.SendMessage("onClickDownload"); + /// + /// public enum UIPlaybackListItemStatus { + /// 기본 상태(다운로드 전) Default, + /// 다운로드 중 Downloading, + /// 다운로드 완료 Downloaded } + /// + /// 재생 목록 아이템의 데이터 구조체입니다. + /// public class UIPlaybackListItemData { - public string date = ""; - public string time = ""; - public string zipFileName = ""; - public string sqlFileName = ""; + public string date = ""; // 날짜 (예: "2024-07-29") + public string time = ""; // 시간 (예: "13") + public string zipFileName = ""; // ZIP 파일명 + public string sqlFileName = ""; // SQL 파일명 public UIPlaybackListItemStatus status = UIPlaybackListItemStatus.Default; public override string ToString() @@ -36,13 +71,28 @@ namespace UVC.Factory.Playback.UI } } + /// + /// 재생 목록의 각 아이템을 관리하는 UI 컴포넌트입니다. + /// - 풀링, 상태 관리, 다운로드/삭제/중지 버튼, 선택 이벤트 등을 제공합니다. + /// public class UIPlaybackListItem : UnityEngine.MonoBehaviour, IPointerClickHandler { - + // 오브젝트 풀: 아이템을 효율적으로 재사용하기 위한 풀입니다. protected static ItemPool pool; - public static readonly string PrefabPath = "Prefabs/Factory/Playback/UIPlaybackListItem"; + /// + /// 프리팹 경로(Resources 폴더 기준) + /// + public static readonly string PrefabPath = "Prefabs/UI/Playback/UIPlaybackListItem"; + /// + /// 풀에서 아이템을 생성(또는 재사용)합니다. + /// + /// 부모 Transform + /// UIPlaybackListItem 인스턴스 + /// + /// var item = UIPlaybackListItem.CreateFromPool(parentTransform); + /// public static UIPlaybackListItem CreateFromPool(Transform parent) { if (pool == null) @@ -53,6 +103,9 @@ namespace UVC.Factory.Playback.UI return pool.GetItem(true, parent); } + /// + /// 현재 활성화된(화면에 보이는) 아이템 목록 + /// public static List ActiveItems { get @@ -62,6 +115,9 @@ namespace UVC.Factory.Playback.UI } } + /// + /// 현재 다운로드 중인 아이템 목록 + /// public static List DownloadingItems { get @@ -70,6 +126,9 @@ namespace UVC.Factory.Playback.UI } } + /// + /// 모든 아이템을 풀에 반환(비활성화)합니다. + /// public static void ReleaseAll() { if (pool != null) @@ -79,6 +138,9 @@ namespace UVC.Factory.Playback.UI } } + /// + /// 모든 아이템을 풀에 반환하고, 재활용 목록도 비웁니다. + /// public static void ClearAll() { if (pool != null) @@ -89,6 +151,7 @@ namespace UVC.Factory.Playback.UI } } + // --- UI 요소들 (Unity 에디터에서 할당) --- [SerializeField] private Image loadingImage; [SerializeField] @@ -104,13 +167,26 @@ namespace UVC.Factory.Playback.UI [SerializeField] private TextMeshProUGUI text; + /// + /// 아이템이 선택될 때 호출되는 콜백 (data, 선택여부) + /// public Action OnSelect { get; set; } + + /// + /// 아이템 상태가 변경될 때 호출되는 콜백 (data, 변경된 상태) + /// public Action OnChangeStatus { get; set; } private UIPlaybackListItemData data; + + /// + /// 이 아이템의 데이터 + /// public UIPlaybackListItemData Data { get => data; } - + /// + /// 아이템의 현재 상태 (Default/Downloading/Downloaded) + /// public UIPlaybackListItemStatus Status { get => data.status; @@ -125,8 +201,12 @@ namespace UVC.Factory.Playback.UI } } + private bool selected = false; + /// + /// 아이템이 선택되었는지 여부 + /// public bool Selected { get => selected; @@ -140,10 +220,17 @@ namespace UVC.Factory.Playback.UI } } - + // 다운로드 요청 객체 (다운로드 중일 때만 사용) private HTTPRequest? downloadRequest; - + /// + /// 아이템을 초기화합니다. (데이터 바인딩 및 버튼 이벤트 등록) + /// + /// 초기화할 데이터 + /// + /// var item = UIPlaybackListItem.CreateFromPool(parent); + /// item.Init(data); + /// public void Init(UIPlaybackListItemData data) { transform.localScale = Vector3.one; @@ -158,6 +245,10 @@ namespace UVC.Factory.Playback.UI ChangeStatus(); } + /// + /// 다운로드 버튼 클릭 시 호출됩니다. + /// - 용량 체크, 동시 다운로드 제한, 다운로드 시작 등 처리 + /// private void onClickDownload() { if (Status == UIPlaybackListItemStatus.Downloading) return; @@ -179,6 +270,8 @@ namespace UVC.Factory.Playback.UI } Status = UIPlaybackListItemStatus.Downloading; + + // 실제 다운로드 요청 (진행률/완료/에러 콜백 처리) downloadRequest = PlaybackService.Instance.ReadyData(data.date, data.time, data.zipFileName, (long read, long total, float percent) => { @@ -206,6 +299,9 @@ namespace UVC.Factory.Playback.UI }); } + /// + /// 다운로드/삭제 시 파일을 실제로 삭제합니다. + /// private void deleteFile() { try @@ -231,6 +327,9 @@ namespace UVC.Factory.Playback.UI } } + /// + /// 다운로드 중지 버튼 클릭 시 호출됩니다. + /// private void onClickStop() { if (downloadRequest != null && Status == UIPlaybackListItemStatus.Downloading) @@ -243,23 +342,36 @@ namespace UVC.Factory.Playback.UI } } + /// + /// 삭제 버튼 클릭 시 호출됩니다. + /// private void onClickDelete() { deleteFile(); Status = UIPlaybackListItemStatus.Default; } + /// + /// 아이템을 클릭하면 선택/해제 상태가 토글됩니다. + /// + /// 이벤트 데이터 public void OnPointerClick(PointerEventData eventData) { Selected = !selected; if (OnSelect != null) OnSelect.Invoke(data, Selected); } + /// + /// 풀에 반환될 때 호출 (이벤트 해제 등) + /// public void Release() { OnDestroy(); } + /// + /// 오브젝트가 파괴될 때 호출 (이벤트 해제) + /// private void OnDestroy() { downloadButton.onClick.RemoveListener(onClickDownload); @@ -270,6 +382,9 @@ namespace UVC.Factory.Playback.UI transform.SetParent(null); } + /// + /// 상태에 따라 UI를 갱신합니다. + /// private void ChangeStatus() { downloadText.text = ""; diff --git a/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListModal.cs b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListModal.cs index bfeab28c..526f90ed 100644 --- a/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListModal.cs +++ b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListModal.cs @@ -13,11 +13,43 @@ using UVC.Util; namespace UVC.Factory.Playback.UI { + /// + /// 📅 재생 목록(Playback List)을 날짜별로 보여주고, 원하는 시간대의 파일을 선택할 수 있는 모달 창입니다. + /// - 날짜 드롭다운, 시간별 리스트, 다운로드 상태, 선택/확인 버튼 등을 제공합니다. + /// + /// 샘플 사용법: + /// + /// // 1. 모달을 띄우는 코드 예시 + /// var content = new ModalContent(UIPlaybackListModal.PrefabPath) + /// { + /// Title = "Playback List", + /// ConfirmButtonText = "Play", + /// ShowCancelButton = false + /// }; + /// // 모달을 열고, 사용자가 선택한 결과를 기다립니다. + /// var result = await Modal.Open(content); + /// if (result != null) + /// { + /// Debug.Log($"선택된 파일: {result.date} {result.time}시"); + /// } + /// + /// [RequireComponent(typeof(CanvasGroup))] public class UIPlaybackListModal : ModalView { - public static new readonly string PrefabPath = "Prefabs/Factory/Playback/UIPlaybackListModal"; + /// + /// 이 모달의 프리팹 경로(Resources 폴더 기준) + /// + public static readonly string PrefabPath = "Prefabs/UI/Playback/UIPlaybackListModal"; + /// + /// 프리팹에서 모달을 생성합니다. + /// + /// 부모 Transform (생략 가능) + /// UIPlaybackListModal 인스턴스 + /// + /// var modal = UIPlaybackListModal.CreateFromPrefab(parentTransform); + /// public static UIPlaybackListModal CreateFromPrefab(Transform parent = null) { GameObject prefab = Resources.Load(PrefabPath); @@ -26,26 +58,40 @@ namespace UVC.Factory.Playback.UI return modal; } + // 날짜별로 시간대 파일 목록을 저장하는 딕셔너리 private Dictionary>? data; + /// + /// '확인' 버튼을 누를 수 있는지 여부 + /// (다운로드 완료된 항목이 선택되어 있고, 현재 다운로드 중인 항목이 없을 때만 true) + /// public bool IsOkable => (selectedItem != null && selectedItem.status == UIPlaybackListItemStatus.Downloaded && UIPlaybackListItem.DownloadingItems.Count == 0); + // 현재 선택된 아이템 데이터 private UIPlaybackListItemData? selectedItem = null; [SerializeField] - private TMP_Dropdown dropdownDate; + private TMP_Dropdown dropdownDate; // 날짜 선택 드롭다운 [SerializeField] - private ScrollRect scrollRectTime; + private ScrollRect scrollRectTime; // 시간대 리스트 스크롤 영역 + // 모달이 닫힐 때 반환할 결과 데이터 private UIPlaybackListItemData? resultData = null; + /// + /// 모달이 열릴 때 호출됩니다. (비동기) + /// + /// 모달에 표시할 내용/설정 public override async UniTask OnOpen(ModalContent content) { await base.OnOpen(content); // 부모의 OnOpen을 먼저 호출해서 기본 UI를 설정해요. - initContent(); } + /// + /// 모달이 닫힐 때 결과로 반환할 데이터를 돌려줍니다. + /// + /// 선택된 UIPlaybackListItemData 또는 null public override object? GetResult() { if (data != null) data.Clear(); @@ -53,29 +99,40 @@ namespace UVC.Factory.Playback.UI return resultData; } + /// + /// 모달이 닫힐 때 호출됩니다. + /// public override async UniTask OnClose(ModalContent content) { await base.OnClose(content); } - + /// + /// 모달의 내용을 초기화합니다. (날짜/시간대 데이터 불러오기) + /// private async void initContent() { confirmButton.interactable = false; + // 서버에서 날짜/시간대 목록을 받아옵니다. Dictionary>? data = await PlaybackService.Instance.RequestDataAsync(); dropdownDate.onValueChanged.AddListener(DropDownDateChanged); - LocalSetData(); - if (data != null) SetData(data); + LocalSetData(); // 로컬 파일 기준으로 먼저 리스트를 만듭니다. + if (data != null) SetData(data); // 서버 데이터가 있으면 반영합니다. } - + /// + /// 오브젝트가 파괴될 때 이벤트 해제 및 정리 + /// protected void OnDestroy() { dropdownDate.onValueChanged.RemoveListener(DropDownDateChanged); UIPlaybackListItem.ClearAll(); } + /// + /// 로컬 저장소에서 날짜/시간대 파일 목록을 읽어와 리스트를 만듭니다. + /// public void LocalSetData() { Dictionary> newData = new Dictionary>(); @@ -131,6 +188,10 @@ namespace UVC.Factory.Playback.UI dropdownDate.value = -1; } + /// + /// 서버에서 받은 날짜/시간대 데이터를 리스트에 반영합니다. + /// + /// 서버에서 받은 데이터 public void SetData(Dictionary> data) { //{ @@ -142,7 +203,7 @@ namespace UVC.Factory.Playback.UI //} Dictionary> dataList = new Dictionary>(); - //헝가리 시간으로 변경 + // 날짜/시간대 정규화 foreach (var keyPair in data) { if (!dataList.ContainsKey(keyPair.Key)) dataList[keyPair.Key] = new Dictionary(); @@ -215,8 +276,7 @@ namespace UVC.Factory.Playback.UI } } - - + // 서버 데이터 기준으로 추가 foreach (var keyPair in dataList) { string date = keyPair.Key; @@ -238,7 +298,8 @@ namespace UVC.Factory.Playback.UI }); } } - //내림차순 정리 + + // 시간 오름차순 정렬 if (newData.ContainsKey(date)) newData[date].Sort((a, b) => int.Parse(a.time) - int.Parse(b.time)); } @@ -249,14 +310,17 @@ namespace UVC.Factory.Playback.UI } - + /// + /// 날짜 드롭다운이 변경될 때 호출됩니다. + /// + /// 선택된 인덱스 private void DropDownDateChanged(int value) { - + // 선택된 날짜의 시간대 리스트를 갱신 //dropdownDatePlaceHolder.gameObject.SetActive(value == -1); string key = dropdownDate.options[dropdownDate.value].text; Debug.Log($"DropDownDateChanged dropdownDate.value:{dropdownDate.value} value:{value} key:{key}"); - if (data.ContainsKey(key)) + if (data != null && data.ContainsKey(key)) { if (UIPlaybackListItem.ActiveItems.Count > 0) UIPlaybackListItem.ReleaseAll(); List itemList = data[key]; @@ -270,11 +334,16 @@ namespace UVC.Factory.Playback.UI selectedItem = null; updateButtonStatus(); } - //scroll move to top - scrollRectTime.normalizedPosition = new Vector2(0, 1); + // 스크롤을 맨 위로 이동 + scrollRectTime.normalizedPosition = new Vector2(0, 1); } + /// + /// 시간대 아이템이 선택될 때 호출됩니다. + /// + /// 선택된 아이템 데이터 + /// 선택 여부 private void OnItemSelect(UIPlaybackListItemData data, bool selected) { if (selected) @@ -296,17 +365,26 @@ namespace UVC.Factory.Playback.UI updateButtonStatus(); } + /// + /// 아이템의 다운로드 상태가 변경될 때 호출됩니다. + /// private void OnItemChangeStatus(UIPlaybackListItemData data, UIPlaybackListItemStatus status) { bool enable = UIPlaybackListItem.DownloadingItems.Count == 0; dropdownDate.interactable = enable; } + /// + /// '확인' 버튼의 활성화 상태를 갱신합니다. + /// private void updateButtonStatus() { confirmButton.interactable = IsOkable; } + /// + /// '확인' 버튼 클릭 시 호출됩니다. + /// public override void OnConfirmButtonClicked() { resultData = selectedItem; diff --git a/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackProgressBar.cs b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackProgressBar.cs index 67298110..1b4d70ef 100644 --- a/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackProgressBar.cs +++ b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackProgressBar.cs @@ -1,4 +1,4 @@ -using System; +using System; using TMPro; using UnityEngine; using UVC.Extension; @@ -6,18 +6,59 @@ using UVC.UI; namespace UVC.Factory.Playback.UI { + /// + /// 재생 위치를 표시하고 조작할 수 있는 UI 프로그레스바 컴포넌트입니다. + /// - 현재 재생 시간, 전체 시간, 슬라이더(Seek Bar)로 구성됩니다. + /// - 슬라이더를 드래그하거나 클릭하여 재생 위치를 변경할 수 있습니다. + /// + /// 샘플 사용법: + /// + /// // UIPlaybackProgressBar를 가진 오브젝트를 찾고 초기화 + /// var progressBar = FindObjectOfType<UIPlaybackProgressBar>(); + /// progressBar.Init(1); // 1시간짜리 재생바로 초기화 + /// + /// // 값이 변경될 때마다 호출되는 콜백 등록 + /// progressBar.OnChangeValue = (value) => { + /// Debug.Log($"재생 위치가 {value}초로 변경됨"); + /// }; + /// + /// // 재생 위치를 코드로 변경 + /// progressBar.Value = 120; // 2분(120초) 위치로 이동 + /// + /// public class UIPlaybackProgressBar : MonoBehaviour { - private TextMeshProUGUI playTimeTxt; - private TextMeshProUGUI totalTimeTxt; - private SliderWithEvent progressBar; - private float progressBarPrevValue = 0; + [Header("UI Playback Progress Bar")] + [Tooltip("UI 활성/비활성 및 상호작용 제어용")] + [SerializeField] + private CanvasGroup canvasGroup;// UI 활성/비활성 및 상호작용 제어용 - private CanvasGroup canvasGroup; + [Tooltip("현재 재생 시간 텍스트")] + [SerializeField] + private TextMeshProUGUI playTimeTxt;// 현재 재생 시간 텍스트 + + [Tooltip("전체 재생 시간 텍스트")] + [SerializeField] + private TextMeshProUGUI totalTimeTxt;// 전체 재생 시간 텍스트 + + [Tooltip("재생 위치를 조작하는 슬라이더")] + [SerializeField] + private SliderWithEvent progressBar;// 재생 위치를 조작하는 슬라이더 + + private float progressBarPrevValue = 0;// 이전 슬라이더 값(변경 감지용) + // 전체 시간(시간 단위, 예: 1이면 1시간) private int time; + /// + /// 슬라이더 값이 변경될 때 호출되는 이벤트입니다. + /// 예시: progressBar.OnChangeValue = (value) => { ... }; + /// public Action OnChangeValue { get; set; } + /// + /// 현재 슬라이더(재생 위치) 값(초 단위)입니다. + /// 값을 설정하면 UI와 내부 상태가 함께 갱신됩니다. + /// public int Value { get @@ -36,17 +77,26 @@ namespace UVC.Factory.Playback.UI } } + /// + /// 슬라이더의 최대값(전체 재생 시간, 초 단위)입니다. + /// public int MaxValue { get => (int)progressBar.maxValue; } + /// + /// 프로그레스바의 상호작용 가능 여부를 설정/조회합니다. + /// public bool Interactable { get => canvasGroup.interactable; set => canvasGroup.interactable = value; } + /// + /// 오브젝트가 파괴될 때 이벤트 리스너를 해제합니다. + /// private void OnDestroy() { progressBar.onValueChanged.RemoveListener(OnChangeSlider); @@ -55,27 +105,35 @@ namespace UVC.Factory.Playback.UI progressBar.OnEndDragAction = null; } + /// + /// 프로그레스바를 초기화합니다. + /// + /// 전체 시간(시간 단위, 예: 1이면 1시간) + /// + /// progressBar.Init(1); // 1시간짜리 재생바로 초기화 + /// public void Init(int time) { this.time = time; - canvasGroup = GetComponent(); - - playTimeTxt = transform.FindChildren("PlayTimeTxt").GetComponent(); - totalTimeTxt = transform.FindChildren("TotalTimeTxt").GetComponent(); - progressBar = GetComponentInChildren(); + // 슬라이더 이벤트 등록 progressBar.onValueChanged.AddListener(OnChangeSlider); progressBar.OnClickAction += OnClickProgressBar; progressBar.OnDragAction += OnDragProgressBar; progressBar.OnEndDragAction += OnEndDragProgressBar; + // 초기 텍스트 및 값 설정 playTimeTxt.text = $"{time.ToString("00")}:00:00"; totalTimeTxt.text = $"{(time + 1).ToString("00")}:00:00"; progressBar.value = 0; Interactable = true; } - + /// + /// 슬라이더 값이 변경될 때 호출됩니다. + /// 상호작용 불가 상태면 값을 되돌립니다. + /// + /// 변경된 값 private void OnChangeSlider(float newValue) { if (!Interactable) @@ -86,6 +144,10 @@ namespace UVC.Factory.Playback.UI } } + /// + /// 슬라이더를 클릭했을 때 호출됩니다. + /// 값이 변경되면 OnChangeValue 이벤트가 발생합니다. + /// private void OnClickProgressBar() { float snapedValue = SnapProgressBarValue(); @@ -98,6 +160,9 @@ namespace UVC.Factory.Playback.UI } } + /// + /// 슬라이더를 드래그하는 동안 계속 호출됩니다. + /// private void OnDragProgressBar() { float snapedValue = SnapProgressBarValue(); @@ -105,6 +170,10 @@ namespace UVC.Factory.Playback.UI UpdateTimeText(); } + /// + /// 슬라이더 드래그가 끝났을 때 호출됩니다. + /// 값이 변경되면 OnChangeValue 이벤트가 발생합니다. + /// private void OnEndDragProgressBar() { float snapedValue = SnapProgressBarValue(); @@ -117,6 +186,10 @@ namespace UVC.Factory.Playback.UI } } + /// + /// 슬라이더 값을 60초(1분) 단위로 스냅합니다. + /// + /// 스냅된 값 private float SnapProgressBarValue() { float value = progressBar.value; @@ -125,6 +198,9 @@ namespace UVC.Factory.Playback.UI return value; } + /// + /// 현재 재생 시간 텍스트를 갱신합니다. + /// private void UpdateTimeText() { int minute = (int)progressBar.value / 60; diff --git a/Assets/Scripts/UVC/UI/List.meta b/Assets/Scripts/UVC/UI/List.meta new file mode 100644 index 00000000..6214d65e --- /dev/null +++ b/Assets/Scripts/UVC/UI/List.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 01351942c80cc7042b2ec18f41173854 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UVC/UI/List/DraggableItem.cs b/Assets/Scripts/UVC/UI/List/DraggableItem.cs new file mode 100644 index 00000000..7d1ec8dc --- /dev/null +++ b/Assets/Scripts/UVC/UI/List/DraggableItem.cs @@ -0,0 +1,53 @@ +#nullable enable +using System; +using UnityEngine; +using UnityEngine.EventSystems; + +namespace UVC.UI.List +{ + /// + /// 개별 드래그 가능한 아이템의 UI 컴포넌트 + /// 드래그 동작과 시각적 피드백을 담당 + /// + public class DraggableItem : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler + { + // 이벤트 + public Action? OnBeginDragEvent; + public Action? OnDragEvent; + public Action? OnEndDragEvent; + + /// + /// 드래그 시작 시 호출 + /// + public void OnBeginDrag(PointerEventData eventData) + { + OnBeginDragEvent?.Invoke(eventData); + } + + /// + /// 드래그 중 호출 + /// + public void OnDrag(PointerEventData eventData) + { + // 이벤트 발생 + OnDragEvent?.Invoke(eventData); + } + + /// + /// 드래그 종료 시 호출 + /// + public void OnEndDrag(PointerEventData eventData) + { + // 이벤트 발생 + OnEndDragEvent?.Invoke(eventData); + } + + void OnDestroy() + { + // 이벤트 구독 해제 + OnBeginDragEvent = null; + OnDragEvent = null; + OnEndDragEvent = null; + } + } +} diff --git a/Assets/Scripts/UVC/UI/List/DraggableItem.cs.meta b/Assets/Scripts/UVC/UI/List/DraggableItem.cs.meta new file mode 100644 index 00000000..6e24330b --- /dev/null +++ b/Assets/Scripts/UVC/UI/List/DraggableItem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2d93b757e3738184492e84c051530130 \ No newline at end of file diff --git a/Assets/Scripts/UVC/UI/List/DraggableItemData.cs b/Assets/Scripts/UVC/UI/List/DraggableItemData.cs new file mode 100644 index 00000000..481421a9 --- /dev/null +++ b/Assets/Scripts/UVC/UI/List/DraggableItemData.cs @@ -0,0 +1,42 @@ +#nullable enable +using System; +using UnityEngine; + +namespace UVC.UI.List +{ + /// + /// 드래그 가능한 목록 아이템의 데이터 모델 + /// + [Serializable] + public class DraggableItemData + { + [SerializeField] protected string id; + [SerializeField] protected int sortOrder; + + public string Id => id; + public int SortOrder { get => sortOrder; set => sortOrder = value; } + + public DraggableItemData(string id, int sortOrder = 0) + { + this.id = id ?? throw new ArgumentNullException(nameof(id)); + this.sortOrder = sortOrder; + } + } + + /// + /// 드래그 작업의 결과를 나타내는 이벤트 인자 + /// + public class DraggableItemReorderEventArgs : EventArgs + { + public string ItemId { get; } + public int OldIndex { get; } + public int NewIndex { get; } + + public DraggableItemReorderEventArgs(string itemId, int oldIndex, int newIndex) + { + ItemId = itemId; + OldIndex = oldIndex; + NewIndex = newIndex; + } + } +} diff --git a/Assets/Scripts/UVC/UI/List/DraggableItemData.cs.meta b/Assets/Scripts/UVC/UI/List/DraggableItemData.cs.meta new file mode 100644 index 00000000..dff09ea5 --- /dev/null +++ b/Assets/Scripts/UVC/UI/List/DraggableItemData.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2a576b71abcd5ff41a1c3d0adf21a45c \ No newline at end of file diff --git a/Assets/Scripts/UVC/UI/List/DraggableListItem.cs b/Assets/Scripts/UVC/UI/List/DraggableListItem.cs new file mode 100644 index 00000000..257a4014 --- /dev/null +++ b/Assets/Scripts/UVC/UI/List/DraggableListItem.cs @@ -0,0 +1,191 @@ +#nullable enable +using System; +using TMPro; +using UnityEngine; +using UnityEngine.EventSystems; + +namespace UVC.UI.List +{ + /// + /// 개별 드래그 가능한 아이템의 UI 컴포넌트 + /// 드래그 동작과 시각적 피드백을 담당 + /// + public class DraggableListItem : MonoBehaviour + { + [Header("UI 컴포넌트")] + [SerializeField] protected CanvasGroup? canvasGroup; + [SerializeField] protected RectTransform? rectTransform; + [SerializeField] protected DraggableItem? dragAnchor; + [SerializeField] protected TMP_InputField? inputField; + + [Header("드래그 설정")] + [SerializeField] protected float dragAlpha = 0.6f; + [SerializeField] protected bool blockRaycastsWhileDragging = false; + + // 프로퍼티 + public DraggableItemData? Data { get; private set; } + public RectTransform? RectTransform => rectTransform; + public bool IsDragging { get; private set; } + + public event Action? OnBeginDragEvent; + public event Action? OnDragEvent; + public event Action? OnEndDragEvent; + + private Vector2 originalPosition; + private Transform? originalParent; + private int originalSiblingIndex; + + /// + /// 컴포넌트 초기화 + /// + private void Awake() + { + // null 체크 및 자동 할당 + if (rectTransform == null) + rectTransform = GetComponent(); + + if (canvasGroup == null) + canvasGroup = GetComponent(); + + // CanvasGroup이 없으면 추가 + if (canvasGroup == null) + canvasGroup = gameObject.AddComponent(); + + if (dragAnchor == null) + { + Debug.LogError("Drag Anchor is not assigned. Please assign it in the inspector."); + return; + } + + dragAnchor.OnBeginDragEvent += OnBeginDrag; + dragAnchor.OnDragEvent += OnDrag; + dragAnchor.OnEndDragEvent += OnEndDrag; + } + + /// + /// 아이템 데이터로 UI 업데이트 + /// + /// 표시할 데이터 + public void SetData(DraggableItemData? data) + { + if (data == null) return; + + Data = data; + UpdateUI(); + } + + /// + /// UI 요소들을 데이터에 맞게 업데이트 + /// + protected virtual void UpdateUI() + { + if (Data == null) return; + if(inputField != null) + { + inputField.text = Data.Id; + } + } + + /// + /// 드래그 시작 시 호출 + /// + public void OnBeginDrag(PointerEventData eventData) + { + if (rectTransform == null) return; + + IsDragging = true; + + // 원래 위치와 부모 저장 + originalPosition = rectTransform.anchoredPosition; + originalParent = transform.parent; + originalSiblingIndex = transform.GetSiblingIndex(); + + // 시각적 피드백 적용 + ApplyDragVisuals(true); + + // 이벤트 발생 + OnBeginDragEvent?.Invoke(this); + } + + /// + /// 드래그 중 호출 + /// + public void OnDrag(PointerEventData eventData) + { + if (rectTransform == null) return; + + // 마우스 위치로 아이템 이동 + rectTransform.anchoredPosition += new Vector2(0, eventData.delta.y);//eventData.delta + + // 이벤트 발생 + OnDragEvent?.Invoke(this, rectTransform.anchoredPosition); + } + + /// + /// 드래그 종료 시 호출 + /// + public void OnEndDrag(PointerEventData eventData) + { + IsDragging = false; + + // 시각적 피드백 복원 + ApplyDragVisuals(false); + + // 이벤트 발생 + OnEndDragEvent?.Invoke(this); + } + + /// + /// 드래그 시각적 효과 적용/해제 + /// + /// 드래그 중인지 여부 + private void ApplyDragVisuals(bool isDragging) + { + if (canvasGroup == null) return; + + if (isDragging) + { + canvasGroup.alpha = dragAlpha; + canvasGroup.blocksRaycasts = blockRaycastsWhileDragging; + } + else + { + canvasGroup.alpha = 1f; + canvasGroup.blocksRaycasts = true; + } + } + + /// + /// 원래 위치로 되돌리기 (드래그 취소 시 사용) + /// + public void ResetToOriginalPosition() + { + if (rectTransform == null || originalParent == null) return; + + transform.SetParent(originalParent); + transform.SetSiblingIndex(originalSiblingIndex); + rectTransform.anchoredPosition = originalPosition; + } + + public void OnDestroy() + { + // 이벤트 구독 해제 + if (dragAnchor != null) + { + dragAnchor.OnBeginDragEvent -= OnBeginDrag; + dragAnchor.OnDragEvent -= OnDrag; + dragAnchor.OnEndDragEvent -= OnEndDrag; + } + + OnBeginDragEvent = null; + OnDragEvent = null; + OnEndDragEvent = null; + + // 리소스 정리 + canvasGroup = null; + rectTransform = null; + dragAnchor = null; + } + + } +} diff --git a/Assets/Scripts/UVC/UI/List/DraggableListItem.cs.meta b/Assets/Scripts/UVC/UI/List/DraggableListItem.cs.meta new file mode 100644 index 00000000..d4665779 --- /dev/null +++ b/Assets/Scripts/UVC/UI/List/DraggableListItem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7cdfe032ad5874e4cbc571f344516b93 \ No newline at end of file diff --git a/Assets/Scripts/UVC/UI/List/DraggableScrollList.cs b/Assets/Scripts/UVC/UI/List/DraggableScrollList.cs new file mode 100644 index 00000000..7173229e --- /dev/null +++ b/Assets/Scripts/UVC/UI/List/DraggableScrollList.cs @@ -0,0 +1,1075 @@ +#nullable enable +using System; +using System.Collections.Generic; +using System.Linq; +using Unity.VisualScripting; +using UnityEditorInternal.VersionControl; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +namespace UVC.UI.List +{ + /// + /// 드래그 가능한 ScrollRect 목록을 관리하는 메인 컨트롤러 + /// Model-View 패턴을 적용하여 데이터와 UI를 분리 + /// + /// + /// 사용 예제: + /// 1. 이벤트 구독 + /// 2. DraggableItemData 설정 + /// + /// public class DraggableScrollListSetup : MonoBehaviour + /// { + /// [SerializeField] + /// private DraggableScrollList? draggableList; + /// + /// protected virtual void Awake() + /// { + /// if (draggableList == null) + /// { + /// Debug.LogError("draggableList 참조가 설정되지 않았습니다."); + /// return; + /// } + /// + /// // 이벤트 구독 + /// draggableList.OnItemReordered += OnItemReordered; + /// draggableList.OnItemSelected += OnItemSelected; + /// } + /// + /// void Start() + /// { + /// // 1. DraggableItemData 설정 + /// draggableList?.AddItem(new DraggableItemData("AGV", 0)); + /// draggableList?.AddItem(new DraggableItemData("ALARM", 1)); + /// } + /// + /// /// + /// /// 아이템 순서 변경 이벤트 처리 + /// /// + /// /// 이벤트 발생자 + /// /// 이벤트 인자 + /// private void OnItemReordered(object? sender, DraggableItemReorderEventArgs e) + /// { + /// Debug.Log($"아이템 순서 변경됨: ID={e.ItemId}, {e.OldIndex} -> {e.NewIndex}"); + /// + /// // 여기에 순서 변경에 대한 비즈니스 로직 구현 + /// // 예: 서버에 변경사항 전송, 설정 저장 등 + /// } + /// + /// /// + /// /// 아이템 선택 이벤트 처리 + /// /// + /// /// 이벤트 발생자 + /// /// 선택된 아이템 + /// private void OnItemSelected(object? sender, DraggableListItem item) + /// { + /// if (item?.Data != null) + /// { + /// Debug.Log($"아이템 선택됨: {item.Data.Id}"); + /// + /// // 선택된 아이템에 대한 처리 + /// // 예: 상세 정보 표시, 편집 모드 진입 등 + /// } + /// } + /// + /// /// + /// /// 컴포넌트 정리 + /// /// + /// private void OnDestroy() + /// { + /// if (draggableList != null) + /// { + /// draggableList.OnItemReordered -= OnItemReordered; + /// draggableList.OnItemSelected -= OnItemSelected; + /// } + /// } + /// } + /// + /// + public class DraggableScrollList : MonoBehaviour + { + [Header("UI 참조")] + [SerializeField] private ScrollRect? scrollRect; + [SerializeField] private RectTransform? contentParent; + [SerializeField] private VerticalLayoutGroup? layoutGroup; + + [Header("드롭 인디케이터")] + [SerializeField] private Sprite? dropLineSprite; + [SerializeField] private Color dropLineColor = Color.cyan; + [SerializeField] private float dropLineHeight = 3f; + [SerializeField] private float dropLineMargin = 10f; + [SerializeField] private Material? dropLineMaterial; // 선택적: 특별한 Material 사용 시 + + [Header("프리팹 설정")] + [SerializeField] private string itemPrefabPath = "Prefabs/UI/List/DraggableListItem"; + + [Header("드래그 설정")] + [SerializeField] private float dropZoneThreshold = 50f; + [SerializeField] private float scrollSensitivity = 100f; + [SerializeField] private bool enableAutoScroll = true; + + // 이벤트 + public event EventHandler? OnItemReordered; + public event EventHandler? OnItemSelected; + + // 데이터 및 UI 관리 + private List itemDataList = new List(); + private List itemUIList = new List(); + private GameObject? itemPrefab; + + // 드래그 상태 관리 + private DraggableListItem? currentDraggingItem; + private int dragStartIndex = -1; + private int currentDropIndex = -1; + private Camera? uiCamera; + + // 드롭 라인 관리 (동적 생성) + private GameObject? dropLineObject; + private Image? dropLineImage; + private RectTransform? dropLineRectTransform; + private bool isDropLineVisible = false; + + /// + /// 현재 아이템 데이터 목록 (읽기 전용) + /// + public IReadOnlyList ItemDataList => itemDataList.AsReadOnly(); + + /// + /// 컴포넌트 초기화 + /// + private void Awake() + { + InitializeComponents(); + LoadItemPrefab(); + } + + /// + /// UI 카메라 참조 설정 + /// + private void Start() + { + // UI 카메라 찾기 (Canvas의 카메라 또는 메인 카메라) + Canvas? canvas = GetComponentInParent(); + uiCamera = canvas?.worldCamera ?? Camera.main; + + // 드롭 라인 생성 (Start에서 호출하여 모든 컴포넌트가 초기화된 후 실행) + CreateDropLine(); + } + + /// + /// 필수 컴포넌트들 초기화 및 검증 + /// + private void InitializeComponents() + { + // ScrollRect 자동 할당 + if (scrollRect == null) + scrollRect = GetComponent(); + + // Content 부모 자동 할당 + if (contentParent == null && scrollRect?.content != null) + contentParent = scrollRect.content; + + // LayoutGroup 자동 할당 + if (layoutGroup == null && contentParent != null) + layoutGroup = contentParent.GetComponent(); + + // 필수 컴포넌트 검증 + if (scrollRect == null) + Debug.LogError($"[{nameof(DraggableScrollList)}] ScrollRect 컴포넌트를 찾을 수 없습니다!"); + + if (contentParent == null) + Debug.LogError($"[{nameof(DraggableScrollList)}] Content 부모 Transform을 찾을 수 없습니다!"); + } + + /// + /// 드롭 라인을 동적으로 생성 + /// + private void CreateDropLine() + { + if (contentParent == null) + { + Debug.LogError($"[{nameof(DraggableScrollList)}] Content 부모가 없어 드롭 라인을 생성할 수 없습니다!"); + return; + } + + try + { + // 드롭 라인 GameObject 생성 + dropLineObject = new GameObject("DropLineIndicator"); + + // Content의 자식으로 설정 + dropLineObject.transform.SetParent(contentParent, false); + + // Image 컴포넌트 추가 + dropLineImage = dropLineObject.AddComponent(); + + // RectTransform 참조 가져오기 + dropLineRectTransform = dropLineObject.GetComponent(); + + // 드롭 라인 설정 적용 + ConfigureDropLine(); + + // 초기에는 비활성화 + if (dropLineObject != null) dropLineObject.SetActive(false); + + Debug.Log($"[{nameof(DraggableScrollList)}] 드롭 라인이 동적으로 생성되었습니다."); + } + catch (Exception ex) + { + Debug.LogError($"[{nameof(DraggableScrollList)}] 드롭 라인 생성 중 오류 발생: {ex.Message}"); + } + } + + /// + /// 드롭 라인의 시각적 속성 설정 + /// + private void ConfigureDropLine() + { + if (dropLineImage == null || dropLineRectTransform == null) return; + + // Sprite 설정 + if (dropLineSprite != null) + { + dropLineImage.sprite = dropLineSprite; + dropLineImage.type = Image.Type.Sliced; // 스프라이트 늘어남 방지 + } + else + { + // 기본 스프라이트 생성 (단색 사각형) + dropLineImage.sprite = CreateDefaultDropLineSprite(); + dropLineImage.type = Image.Type.Simple; + } + + // 색상 설정 + dropLineImage.color = dropLineColor; + + // Material 설정 (선택적) + if (dropLineMaterial != null) + { + dropLineImage.material = dropLineMaterial; + } + + // RectTransform 설정 + SetupDropLineRectTransform(); + } + + /// + /// 드롭 라인의 RectTransform 설정 + /// + private void SetupDropLineRectTransform() + { + if (dropLineRectTransform == null) return; + + // 앵커와 피벗 설정 (가로 전체를 차지하도록) + dropLineRectTransform.anchorMin = new Vector2(0f, 0.5f); + dropLineRectTransform.anchorMax = new Vector2(1f, 0.5f); + dropLineRectTransform.pivot = new Vector2(0.5f, 0.5f); + + // 크기 설정 (가로는 부모에 맞춤, 세로는 설정값 사용) + dropLineRectTransform.sizeDelta = new Vector2(0f, dropLineHeight); + + // 위치 초기화 + dropLineRectTransform.anchoredPosition = Vector2.zero; + + // 레이캐스트 차단 방지 (드래그 중 방해하지 않도록) + dropLineImage!.raycastTarget = false; + } + + /// + /// 기본 드롭 라인 스프라이트 생성 (Sprite가 없을 경우) + /// + /// 생성된 기본 스프라이트 + private Sprite CreateDefaultDropLineSprite() + { + // 1x1 픽셀 텍스처 생성 + Texture2D texture = new Texture2D(1, 1, TextureFormat.RGBA32, false); + texture.SetPixel(0, 0, Color.white); + texture.Apply(); + + // 스프라이트 생성 + Sprite defaultSprite = Sprite.Create( + texture, + new Rect(0, 0, 1, 1), + new Vector2(0.5f, 0.5f), + 100f // pixelsPerUnit + ); + + defaultSprite.name = "DefaultDropLineSprite"; + + Debug.Log($"[{nameof(DraggableScrollList)}] 기본 드롭 라인 스프라이트가 생성되었습니다."); + + return defaultSprite; + } + + /// + /// 아이템 프리팹 로드 + /// + private void LoadItemPrefab() + { + try + { + itemPrefab = Resources.Load(itemPrefabPath); + if (itemPrefab == null) + { + Debug.LogError($"[{nameof(DraggableScrollList)}] 프리팹을 로드할 수 없습니다: {itemPrefabPath}"); + } + } + catch (Exception ex) + { + Debug.LogError($"[{nameof(DraggableScrollList)}] 프리팹 로드 중 오류 발생: {ex.Message}"); + } + } + + /// + /// 목록에 새 아이템 추가 + /// + /// 추가할 아이템 데이터 + public void AddItem(DraggableItemData data) + { + if (data == null) + { + Debug.LogWarning($"[{nameof(DraggableScrollList)}] null 데이터는 추가할 수 없습니다."); + return; + } + + // 데이터 추가 + data.SortOrder = itemDataList.Count; + itemDataList.Add(data); + + // UI 생성 + CreateItemUI(data); + } + + /// + /// 여러 아이템을 한번에 추가 (성능 최적화) + /// + /// 추가할 아이템 데이터 목록 + public void AddItems(IEnumerable dataList) + { + if (dataList == null) return; + + var dataArray = dataList.ToArray(); + if (dataArray.Length == 0) return; + + // 레이아웃 업데이트 일시 중지 (성능 최적화) + if (layoutGroup != null) + layoutGroup.enabled = false; + + try + { + foreach (var data in dataArray) + { + if (data != null) + { + data.SortOrder = itemDataList.Count; + itemDataList.Add(data); + CreateItemUI(data); + } + } + } + finally + { + // 레이아웃 업데이트 재개 + if (layoutGroup != null) + { + layoutGroup.enabled = true; + LayoutRebuilder.ForceRebuildLayoutImmediate(contentParent); + } + } + } + + /// + /// 특정 아이템 제거 + /// + /// 제거할 아이템의 ID + /// 제거 성공 여부 + public bool RemoveItem(string itemId) + { + if (string.IsNullOrEmpty(itemId)) return false; + + // 데이터에서 제거 + var dataIndex = itemDataList.FindIndex(d => d.Id == itemId); + if (dataIndex == -1) return false; + + itemDataList.RemoveAt(dataIndex); + + // UI에서 제거 + var uiIndex = itemUIList.FindIndex(ui => ui.Data?.Id == itemId); + if (uiIndex >= 0) + { + var itemUI = itemUIList[uiIndex]; + itemUIList.RemoveAt(uiIndex); + + // 이벤트 해제 + UnsubscribeFromItemEvents(itemUI); + + // GameObject 파괴 + if (itemUI != null) + Destroy(itemUI.gameObject); + } + + // 순서 재정렬 + UpdateSortOrders(); + return true; + } + + /// + /// 모든 아이템 제거 + /// + public void ClearItems() + { + // UI 제거 + foreach (var itemUI in itemUIList) + { + if (itemUI != null) + { + UnsubscribeFromItemEvents(itemUI); + Destroy(itemUI.gameObject); + } + } + + // 목록 초기화 + itemDataList.Clear(); + itemUIList.Clear(); + currentDraggingItem = null; + dragStartIndex = -1; + } + + /// + /// 아이템 UI 생성 + /// + /// 아이템 데이터 + private void CreateItemUI(DraggableItemData data) + { + Debug.Log($"[{nameof(DraggableScrollList)}]1 itemPrefab == null:{itemPrefab == null}, contentParent == null:{contentParent == null}"); + if (itemPrefab == null || contentParent == null) return; + Debug.Log($"[{nameof(DraggableScrollList)}]2 아이템 UI 생성: {data.Id}"); + try + { + // 프리팹 인스턴스 생성 + GameObject itemObject = Instantiate(itemPrefab, contentParent); + + // DraggableListItem 컴포넌트 가져오기 + DraggableListItem? itemUI = itemObject.GetComponentInChildren(); + if (itemUI == null) + { + Debug.LogError($"[{nameof(DraggableScrollList)}] 프리팹에 DraggableListItem 컴포넌트가 없습니다!"); + Destroy(itemObject); + return; + } + + // 데이터 설정 + itemUI.SetData(data); + + // 이벤트 연결 + SubscribeToItemEvents(itemUI); + + // UI 목록에 추가 + itemUIList.Add(itemUI); + } + catch (Exception ex) + { + Debug.LogError($"[{nameof(DraggableScrollList)}] 아이템 UI 생성 중 오류: {ex.Message}"); + } + } + + /// + /// 아이템 이벤트 구독 + /// + /// 구독할 아이템 + private void SubscribeToItemEvents(DraggableListItem item) + { + if (item == null) return; + + item.OnBeginDragEvent += OnItemBeginDrag; + item.OnDragEvent += OnItemDrag; + item.OnEndDragEvent += OnItemEndDrag; + } + + /// + /// 아이템 이벤트 구독 해제 + /// + /// 구독 해제할 아이템 + private void UnsubscribeFromItemEvents(DraggableListItem item) + { + if (item == null) return; + + item.OnBeginDragEvent -= OnItemBeginDrag; + item.OnDragEvent -= OnItemDrag; + item.OnEndDragEvent -= OnItemEndDrag; + } + + /// + /// 아이템 드래그 시작 이벤트 처리 + /// + /// 드래그 시작된 아이템 + private void OnItemBeginDrag(DraggableListItem item) + { + if (item?.Data == null) return; + + currentDraggingItem = item; + dragStartIndex = itemUIList.IndexOf(item); + + // ScrollRect 드래그 비활성화 (아이템 드래그와 충돌 방지) + if (scrollRect != null) + scrollRect.enabled = false; + + if (layoutGroup != null) layoutGroup.enabled = false; + + // 드래그 중인 아이템을 최상위로 이동 (다른 아이템 위에 표시) + item.transform.SetAsLastSibling(); + + // 드롭 라인을 최상위로 이동 (드래그 아이템 다음) + if (dropLineObject != null) + dropLineObject.transform.SetAsLastSibling(); + + Debug.Log($"드래그 시작: {item.Data.Id} (인덱스: {dragStartIndex})"); + } + + /// + /// 아이템 드래그 중 이벤트 처리 + /// + /// 드래그 중인 아이템 + /// item의 anchoredPosition + private void OnItemDrag(DraggableListItem item, Vector2 itemAnchoredPosition) + { + if (item != currentDraggingItem || uiCamera == null) return; + + // 자동 스크롤 처리 + if (enableAutoScroll) + HandleAutoScroll(itemAnchoredPosition); + + // 드롭 위치 계산 및 시각적 피드백 + UpdateDropIndicator(itemAnchoredPosition); + } + + /// + /// 아이템 드래그 종료 이벤트 처리 + /// + /// 드래그 종료된 아이템 + private void OnItemEndDrag(DraggableListItem item) + { + if (item != currentDraggingItem) return; + + try + { + // 드롭 위치 계산 + int dropIndex = CalculateDropIndex(); + + // 순서 변경 처리 + if (dropIndex != dragStartIndex && dropIndex >= 0) + { + ReorderItem(dragStartIndex, dropIndex); + } + else + { + // 순서 변경이 없으면 원래 위치로 복원 + item.ResetToOriginalPosition(); + } + } + finally + { + // 드롭 라인 숨기기 + HideDropLine(); + + // 상태 초기화 + currentDraggingItem = null; + dragStartIndex = -1; + + // ScrollRect 다시 활성화 + if (scrollRect != null) + scrollRect.enabled = true; + + if (layoutGroup != null) layoutGroup.enabled = true; + + // 레이아웃 강제 업데이트 + if (layoutGroup != null) + LayoutRebuilder.ForceRebuildLayoutImmediate(contentParent); + } + } + + + /// + /// 아이템 순서 변경 + /// + /// 원래 위치 + /// 새로운 위치 + private void ReorderItem(int fromIndex, int toIndex) + { + if (fromIndex == toIndex || fromIndex < 0 || toIndex < 0 || + fromIndex >= itemUIList.Count || toIndex >= itemUIList.Count) + return; + + try + { + // UI 목록에서 순서 변경 + var itemUI = itemUIList[fromIndex]; + itemUIList.RemoveAt(fromIndex); + itemUIList.Insert(toIndex, itemUI); + + // 데이터 목록에서 순서 변경 + var itemData = itemDataList[fromIndex]; + itemDataList.RemoveAt(fromIndex); + itemDataList.Insert(toIndex, itemData); + + // Transform 계층 구조에서 순서 변경 + itemUI.transform.SetSiblingIndex(toIndex); + + // 정렬 순서 업데이트 + UpdateSortOrders(); + + // 이벤트 발생 + var eventArgs = new DraggableItemReorderEventArgs(itemData.Id, fromIndex, toIndex); + OnItemReordered?.Invoke(this, eventArgs); + + Debug.Log($"아이템 순서 변경: {itemData.Id} ({fromIndex} -> {toIndex})"); + } + catch (Exception ex) + { + Debug.LogError($"[{nameof(DraggableScrollList)}] 순서 변경 중 오류: {ex.Message}"); + } + } + + /// + /// 모든 아이템의 정렬 순서 업데이트 + /// + private void UpdateSortOrders() + { + for (int i = 0; i < itemDataList.Count; i++) + { + itemDataList[i].SortOrder = i; + } + } + + /// + /// 자동 스크롤 처리 + /// + /// item의 anchoredPosition + private void HandleAutoScroll(Vector2 itemAnchoredPosition) + { + if (scrollRect?.viewport == null) return; + + // 뷰포트 영역을 스크린 좌표로 변환 + Vector3[] viewportCorners = new Vector3[4]; + scrollRect.viewport.GetWorldCorners(viewportCorners); + + // contentParent의 월드 좌표를 로컬로 변환 + Vector2 viewportTopLeft = contentParent.InverseTransformPoint(viewportCorners[1]); + Vector2 viewportBottomLeft = contentParent.InverseTransformPoint(viewportCorners[0]); + + float topY = viewportTopLeft.y; + float bottomY = viewportBottomLeft.y; + float scrollZone = 100f; // 스크롤 감지 영역 높이 + + // 상단 스크롤 + if (itemAnchoredPosition.y > topY - scrollZone && itemAnchoredPosition.y < topY) + { + float scrollSpeed = (itemAnchoredPosition.y - (topY - scrollZone)) / scrollZone * scrollSensitivity; + scrollRect.verticalNormalizedPosition = Mathf.Clamp01( + scrollRect.verticalNormalizedPosition + scrollSpeed * Time.deltaTime); + } + // 하단 스크롤 + else if (itemAnchoredPosition.y < bottomY + scrollZone && itemAnchoredPosition.y > bottomY) + { + float scrollSpeed = ((bottomY + scrollZone) - itemAnchoredPosition.y) / scrollZone * scrollSensitivity; + scrollRect.verticalNormalizedPosition = Mathf.Clamp01( + scrollRect.verticalNormalizedPosition - scrollSpeed * Time.deltaTime); + } + + //float topY = viewportCorners[1].y; + //float bottomY = viewportCorners[0].y; + //float scrollZone = 100f; // 스크롤 감지 영역 높이 + + //// 상단 스크롤 + //if (screenPosition.y > topY - scrollZone && screenPosition.y < topY) + //{ + // float scrollSpeed = (screenPosition.y - (topY - scrollZone)) / scrollZone * scrollSensitivity; + // scrollRect.verticalNormalizedPosition = Mathf.Clamp01( + // scrollRect.verticalNormalizedPosition + scrollSpeed * Time.deltaTime); + //} + //// 하단 스크롤 + //else if (screenPosition.y < bottomY + scrollZone && screenPosition.y > bottomY) + //{ + // float scrollSpeed = ((bottomY + scrollZone) - screenPosition.y) / scrollZone * scrollSensitivity; + // scrollRect.verticalNormalizedPosition = Mathf.Clamp01( + // scrollRect.verticalNormalizedPosition - scrollSpeed * Time.deltaTime); + //} + } + + /// + /// 드롭 위치 시각적 표시 업데이트 + /// + /// 드래그 되고 있는 item의 anchoredPosition + protected virtual void UpdateDropIndicator(Vector2 itemAnchoredPosition) + { + if (currentDraggingItem?.RectTransform == null || + contentParent == null || + dropLineRectTransform == null || + uiCamera == null) + { + HideDropLine(); + return; + } + + + // 스크린 좌표를 로컬 좌표로 변환 + //Vector2 localPoint; + //if (!RectTransformUtility.ScreenPointToLocalPointInRectangle( + // contentParent, + // eventData.position, + // uiCamera, + // out localPoint)) + //{ + // HideDropLine(); + // return; + //} + + // 드롭 인덱스 계산 + int newDropIndex = CalculateDropIndexFromPosition(itemAnchoredPosition); + Debug.Log($"드롭 인덱스 계산: {newDropIndex}, {itemAnchoredPosition})"); + if (newDropIndex != currentDropIndex) + { + currentDropIndex = newDropIndex; + } + ShowDropLineAtIndex(newDropIndex); + } + + /// + /// 로컬 좌표를 기준으로 드롭 인덱스 계산 + /// + /// Content 내의 로컬 좌표 + /// 드롭될 인덱스 + private int CalculateDropIndexFromPosition(Vector2 localPoint) + { + if (itemUIList.Count == 0) return 0; + + // 드래그 중인 아이템을 제외한 아이템들과 비교 + float targetY = localPoint.y; + for (int i = 0; i < itemUIList.Count; i++) + { + var itemUI = itemUIList[i]; + if (itemUI == currentDraggingItem || itemUI?.RectTransform == null) + continue; + + //float itemY = itemUI.RectTransform.anchoredPosition.y; + //float itemHeight = itemUI.RectTransform.rect.height; + // 아이템의 월드 좌표를 contentParent의 로컬 좌표로 변환 + Vector3 itemWorldPos = itemUI.RectTransform.position; + Vector2 itemLocalPos = contentParent.InverseTransformPoint(itemWorldPos); + + float itemY = itemLocalPos.y; + float itemHeight = itemUI.RectTransform.rect.height; + Debug.Log($"targetY:{localPoint}, 아이템 {i} 위치 Y 좌표: {itemY}, 높이: {itemHeight}, {itemY - itemHeight / 2}"); + // 아이템의 중앙을 기준으로 위/아래 판단 + if (targetY > itemY - itemHeight / 2) + { + return i; // 현재 아이템 위에 드롭 + } + } + + // 모든 아이템보다 아래에 있으면 마지막 위치 + return itemUIList.Count; + } + + /// + /// 기존 드롭 위치 계산 (fallback용) + /// + /// 드롭될 인덱스 + private int CalculateDropIndex() + { + if (currentDraggingItem?.RectTransform == null || uiCamera == null) + return -1; + + Vector2 localPoint; + if (!RectTransformUtility.ScreenPointToLocalPointInRectangle( + contentParent, + Input.mousePosition, + uiCamera, + out localPoint)) + { + return -1; + } + + return CalculateDropIndexFromPosition(localPoint); + } + + /// + /// 지정된 인덱스 위치에 드롭 라인 표시 + /// + /// 드롭 라인을 표시할 인덱스 + private void ShowDropLineAtIndex(int index) + { + if (dropLineRectTransform == null || contentParent == null) return; + + Vector2 linePosition; + + if (index >= itemUIList.Count) + { + // 마지막 위치에 드롭하는 경우 + if (itemUIList.Count > 0) + { + var lastItem = itemUIList[itemUIList.Count - 1]; + if (lastItem?.RectTransform != null) + { + //드래그 하는 아이템이 동일한 경우 + if (dragStartIndex == itemUIList.Count - 1 && itemUIList.Count > 1) + { + lastItem = itemUIList[itemUIList.Count - 2]; + } + float lastItemY = lastItem.RectTransform.anchoredPosition.y; + float lastItemHeight = lastItem.RectTransform.rect.height; + linePosition = new Vector2(0, lastItemY - lastItemHeight);// - dropLineMargin); + } + else + { + linePosition = Vector2.zero; + } + } + else + { + linePosition = Vector2.zero; + } + } + else if (index <= 0) + { + // 첫 번째 위치에 드롭하는 경우 + if (itemUIList.Count > 0) + { + var firstItem = itemUIList[0]; + if (firstItem?.RectTransform != null) + { + //드래그 하는 아이템이 동일한 경우 + if (dragStartIndex == 0 && itemUIList.Count > 1) + { + firstItem = itemUIList[1]; + } + float firstItemY = firstItem.RectTransform.anchoredPosition.y; + linePosition = new Vector2(0, firstItemY);// + dropLineMargin); + } + else + { + linePosition = Vector2.zero; + } + } + else + { + linePosition = Vector2.zero; + } + } + else + { + // 중간 위치에 드롭하는 경우 + var upperItem = itemUIList[index - 1]; + var lowerItem = itemUIList[index]; + + if (upperItem?.RectTransform != null && lowerItem?.RectTransform != null) + { + + float upperItemY = upperItem.RectTransform.anchoredPosition.y; + float lowerItemY = lowerItem.RectTransform.anchoredPosition.y; + float upperItemHeight = upperItem.RectTransform.rect.height; + + //드래그 하는 아이템이 동일한 경우 + if (dragStartIndex == index - 1) + { + upperItemY = lowerItemY - upperItemHeight - layoutGroup.spacing; + }else if (dragStartIndex == index) + { + lowerItemY = upperItemY - upperItemHeight - layoutGroup.spacing; + } + + // 두 아이템 사이의 중간 지점에 라인 표시 + float middleY = (upperItemY - upperItemHeight + lowerItemY) / 2f; + linePosition = new Vector2(0, middleY); + } + else + { + linePosition = Vector2.zero; + } + } + + // 드롭 라인 위치 설정 + dropLineRectTransform.anchoredPosition = linePosition; + + // 드롭 라인 표시 + ShowDropLine(); + + Debug.Log($"드롭 라인 표시: 인덱스 {index}, 위치 {linePosition}"); + } + + /// + /// 드롭 라인 표시 + /// + private void ShowDropLine() + { + if (dropLineObject == null) return; + + if (!isDropLineVisible) + { + dropLineObject.SetActive(true); + isDropLineVisible = true; + } + } + + /// + /// 드롭 라인 숨기기 + /// + private void HideDropLine() + { + if (dropLineObject == null) return; + + if (isDropLineVisible) + { + dropLineObject.SetActive(false); + isDropLineVisible = false; + } + } + + /// + /// 드롭 라인 색상 설정 + /// + /// 설정할 색상 + public void SetDropLineColor(Color color) + { + dropLineColor = color; + if (dropLineImage != null) + { + dropLineImage.color = color; + } + } + + /// + /// 드롭 라인 높이 설정 + /// + /// 설정할 높이 + public void SetDropLineHeight(float height) + { + dropLineHeight = height; + if (dropLineRectTransform != null) + { + dropLineRectTransform.sizeDelta = new Vector2(dropLineRectTransform.sizeDelta.x, height); + } + } + + /// + /// 드롭 라인 스프라이트 변경 + /// + /// 새로운 스프라이트 (null일 경우 기본 스프라이트 사용) + public void SetDropLineSprite(Sprite? sprite) + { + dropLineSprite = sprite; + if (dropLineImage != null) + { + if (sprite != null) + { + dropLineImage.sprite = sprite; + dropLineImage.type = Image.Type.Sliced; + } + else + { + dropLineImage.sprite = CreateDefaultDropLineSprite(); + dropLineImage.type = Image.Type.Simple; + } + } + } + + /// + /// 드롭 라인 Material 설정 + /// + /// 적용할 Material + public void SetDropLineMaterial(Material? material) + { + dropLineMaterial = material; + if (dropLineImage != null) + { + dropLineImage.material = material; + } + } + + /// + /// 드롭 라인 재생성 (설정 변경 후 적용 시 사용) + /// + public void RecreateDropLine() + { + // 기존 드롭 라인 제거 + if (dropLineObject != null) + { + DestroyImmediate(dropLineObject); + dropLineObject = null; + dropLineImage = null; + dropLineRectTransform = null; + isDropLineVisible = false; + } + + // 새로운 드롭 라인 생성 + CreateDropLine(); + } + + + /// + /// 특정 위치로 스크롤 + /// + /// 스크롤할 아이템 ID + public void ScrollToItem(string itemId) + { + if (string.IsNullOrEmpty(itemId) || scrollRect == null) return; + + var itemUI = itemUIList.FirstOrDefault(ui => ui.Data?.Id == itemId); + if (itemUI?.RectTransform == null) return; + + // 아이템 위치 계산하여 스크롤 + Canvas.ForceUpdateCanvases(); + + var contentRect = scrollRect.content; + var itemRect = itemUI.RectTransform; + + if (contentRect != null && itemRect != null) + { + var itemPosition = (Vector2)scrollRect.transform.InverseTransformPoint(itemRect.position); + var contentPosition = (Vector2)scrollRect.transform.InverseTransformPoint(contentRect.position); + + var newY = itemPosition.y - contentPosition.y; + contentRect.anchoredPosition = new Vector2(contentRect.anchoredPosition.x, -newY); + } + } + + /// + /// 현재 목록 상태를 JSON으로 직렬화 + /// + /// 직렬화된 JSON 문자열 + public virtual string SerializeToJson() + { + try + { + var serializableData = itemDataList.Select(data => new + { + id = data.Id, + sortOrder = data.SortOrder + // 주의: Sprite는 직렬화되지 않음 (필요시 별도 처리) + }).ToArray(); + + return JsonUtility.ToJson(new { items = serializableData }, true); + } + catch (Exception ex) + { + Debug.LogError($"[{nameof(DraggableScrollList)}] JSON 직렬화 오류: {ex.Message}"); + return string.Empty; + } + } + + /// + /// 컴포넌트 정리 + /// + private void OnDestroy() + { + // 동적으로 생성한 텍스처 정리 (메모리 누수 방지) + if (dropLineImage?.sprite?.texture != null && + dropLineImage.sprite.name == "DefaultDropLineSprite") + { + DestroyImmediate(dropLineImage.sprite.texture); + } + } + } + +} diff --git a/Assets/Scripts/UVC/UI/List/DraggableScrollList.cs.meta b/Assets/Scripts/UVC/UI/List/DraggableScrollList.cs.meta new file mode 100644 index 00000000..97f50c5e --- /dev/null +++ b/Assets/Scripts/UVC/UI/List/DraggableScrollList.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 71e6121c6103b0a4c9aeadc24c891b86 \ No newline at end of file diff --git a/Assets/Scripts/UVC/UI/Loading/UILoading.cs b/Assets/Scripts/UVC/UI/Loading/UILoading.cs index 0edc30bc..c80adad8 100644 --- a/Assets/Scripts/UVC/UI/Loading/UILoading.cs +++ b/Assets/Scripts/UVC/UI/Loading/UILoading.cs @@ -2,101 +2,214 @@ using System.Collections; using UnityEngine; using UnityEngine.UI; +/* + * UILoading 스크립트 사용법 예시 + * + * 다른 스크립트에서 아래와 같이 간단하게 호출하여 로딩 화면을 표시하거나 숨길 수 있습니다. + * + * public class MyGameManager : MonoBehaviour + * { + * public void LoadNextScene() + * { + * // 로딩 화면 표시 + * UVC.UI.Loading.UILoading.Show(); + * + * // 코루틴을 사용하여 비동기 씬 로딩 시작 + * StartCoroutine(LoadSceneAsync()); + * } + * + * private IEnumerator LoadSceneAsync() + * { + * // 씬을 비동기로 로드합니다. + * AsyncOperation asyncLoad = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync("NextSceneName"); + * + * // 씬 로딩이 완료될 때까지 대기합니다. + * while (!asyncLoad.isDone) + * { + * yield return null; + * } + * + * // 씬 로딩이 완료되면 로딩 화면을 숨깁니다. + * UVC.UI.Loading.UILoading.Hide(); + * } + * } + */ namespace UVC.UI.Loading { + /// + /// 게임 전체에서 사용되는 로딩 UI를 제어하는 클래스입니다. + /// 싱글톤(Singleton)과 유사한 방식으로 구현되어 어디서든 쉽게 접근하고 사용할 수 있습니다. + /// [RequireComponent(typeof(CanvasGroup))] - public class UILoading : UnityEngine.MonoBehaviour + public class UILoading : MonoBehaviour { + // 로딩 UI 프리팹이 Resources 폴더 내에 위치하는 경로입니다. + // Resources.Load를 통해 동적으로 프리팹을 불러올 때 사용됩니다. public static string PrefabPath = "Prefabs/UI/Loading/UILoading"; + // UILoading 클래스의 유일한 인스턴스를 저장하는 정적(static) 변수입니다. + // 이 변수를 통해 다른 모든 스크립트에서 동일한 로딩 화면 인스턴스에 접근할 수 있습니다. private static UILoading instance; + /// + /// 로딩 화면을 표시합니다. + /// 만약 로딩 화면이 아직 생성되지 않았다면, 프리팹을 이용해 새로 생성합니다. + /// public static void Show() { - if (instance == null) { + // instance가 null일 경우, 아직 로딩 화면이 만들어지지 않았다는 의미입니다. + if (instance == null) + { + // Resources 폴더에서 프리팹을 불러옵니다. GameObject prefab = Resources.Load(PrefabPath); + // 불러온 프리팹을 씬에 인스턴스(복제)하여 생성합니다. GameObject go = Instantiate(prefab); + // 생성된 GameObject의 이름을 "UILoading"으로 설정하여 씬에서 쉽게 식별할 수 있도록 합니다. go.name = "UILoading"; + // 부모를 null로 설정하여 씬의 최상위 계층에 위치시킵니다. + // 이렇게 하면 다른 씬으로 전환될 때 함께 파괴되지 않도록 관리하기 용이합니다. (DontDestroyOnLoad와 함께 사용 가능) go.transform.SetParent(null, false); + // 생성된 GameObject에서 UILoading 컴포넌트를 찾아 instance 변수에 할당합니다. instance = go.GetComponent(); } + // 인스턴스의 ShowLoading 메서드를 호출하여 페이드인 애니메이션을 시작합니다. instance.ShowLoading(); } + /// + /// 현재 표시되고 있는 로딩 화면을 숨깁니다. + /// public static void Hide() { + // instance가 null이 아닐 경우에만 (즉, 로딩 화면이 존재할 때만) 실행합니다. if (instance != null) { + // 인스턴스의 HideLoading 메서드를 호출하여 페이드아웃 애니메이션을 시작합니다. instance.HideLoading(); } } + // --- 인스펙터(Inspector)에서 설정할 변수들 --- + [Header("Component References")] + [Tooltip("페이드 효과를 제어할 CanvasGroup 컴포넌트")] [SerializeField] private CanvasGroup canvasGroup; + + [Tooltip("채우기(Fill) 및 회전 효과를 적용할 Image 컴포넌트")] [SerializeField] private Image loadinImage; - private float duration = 0.25f; - private float target = 0; - private float alpha = 1; - private bool animatting = false; - private Transform loadingImageTransform; + // --- 내부 동작을 위한 변수들 --- + [Header("Animation Settings")] + [Tooltip("페이드인/아웃 애니메이션의 지속 시간 (초)")] + [SerializeField] + private float duration = 0.25f; + + [Tooltip("로딩 아이콘의 회전 속도")] + [SerializeField] private float loadingSpeed = -1.5f; + + [Tooltip("이미지 채우기(Fill) 효과의 속도")] + [SerializeField] private float rotationSpeed = -1.0f; + private float target = 0; // 애니메이션의 목표 알파 값 (0: 투명, 1: 불투명) + private bool animatting = false; // 현재 애니메이션이 진행 중인지 여부 + private Transform loadingImageTransform; // 회전 애니메이션을 적용할 이미지의 Transform + + /// + /// 스크립트 인스턴스가 처음 로드될 때 호출됩니다. + /// 변수 초기화에 사용됩니다. + /// private void Awake() - { + { + // Image 컴포넌트의 Transform을 미리 찾아 변수에 저장해두어, + // LateUpdate에서 매번 찾는 비용을 절약합니다. loadingImageTransform = loadinImage.transform; } - + /// + /// 로딩 화면을 나타나게 하는 애니메이션을 시작합니다. + /// public void ShowLoading() { + // 이미 애니메이션이 진행 중이고, 목표가 '나타나기(target=1)'라면 중복 실행을 방지합니다. if (animatting && target == 1) return; - target = 1; - animatting = true; - StopCoroutine("Animate"); - StartCoroutine(Animate()); + target = 1; // 목표 알파 값을 1(불투명)로 설정 + animatting = true; // 애니메이션 시작 상태로 변경 + StopCoroutine("Animate"); // 이전에 실행 중이던 Animate 코루틴이 있다면 중지 + StartCoroutine(Animate()); // Animate 코루틴을 새로 시작 } + /// + /// 로딩 화면을 사라지게 하는 애니메이션을 시작합니다. + /// public void HideLoading() { + // 이미 애니메이션이 진행 중이고, 목표가 '사라지기(target=0)'라면 중복 실행을 방지합니다. if (animatting && target == 0) return; - target = 0; - animatting = true; - StopCoroutine("Animate"); - StartCoroutine(Animate()); + target = 0; // 목표 알파 값을 0(투명)으로 설정 + animatting = true; // 애니메이션 시작 상태로 변경 + StopCoroutine("Animate"); // 이전에 실행 중이던 Animate 코루틴이 있다면 중지 + StartCoroutine(Animate()); // Animate 코루틴을 새로 시작 } + /// + /// CanvasGroup의 알파 값을 부드럽게 변경하여 페이드인/아웃 효과를 주는 코루틴입니다. + /// private IEnumerator Animate() { - float start = canvasGroup.alpha; + float start = canvasGroup.alpha; // 현재 알파 값을 시작 값으로 설정 float time = 0; + // 경과 시간이 duration에 도달할 때까지 반복합니다. while (time < duration) { - time += Time.deltaTime; + // Time.unscaledDeltaTime: Time.timeScale 값에 영향을 받지 않는 시간 간격입니다. + // 로딩 중 Time.timeScale이 0이 되어도 UI 애니메이션은 계속 실행되어야 하므로 사용합니다. + time += Time.unscaledDeltaTime; + // Mathf.Lerp(시작값, 목표값, 진행률): 두 값 사이를 선형 보간합니다. + // 진행률(time / duration)에 따라 부드럽게 알파 값이 변합니다. canvasGroup.alpha = Mathf.Lerp(start, target, time / duration); + // 다음 프레임까지 대기합니다. yield return null; } + // 애니메이션이 끝난 후 목표 알파 값으로 정확히 맞춰줍니다. canvasGroup.alpha = target; - animatting = false; - if(target == 0) + animatting = false; // 애니메이션 종료 상태로 변경 + + // 만약 목표가 '사라지기(target=0)'였다면, 애니메이션 종료 후 GameObject를 파괴합니다. + if (target == 0) { Destroy(gameObject); } } - private void Update() + /// + /// 모든 Update 함수가 호출된 후에 프레임마다 호출됩니다. + /// 주로 카메라 이동이나 다른 애니메이션이 끝난 후 최종적으로 UI를 업데이트할 때 사용되어, + /// 떨림(Jitter) 현상을 방지하는 데 도움이 됩니다. + /// + private void LateUpdate() { + // 로딩 화면이 완전히 불투명할 때(애니메이션이 진행 중일 때)만 실행합니다. if (canvasGroup.alpha == 1) { - loadingImageTransform.Rotate(Vector3.forward, loadingSpeed * Time.deltaTime * 360); - loadinImage.fillAmount = Mathf.PingPong(Time.time * rotationSpeed, 1); + // 1. 이미지 회전 애니메이션 + // Time.unscaledTime: Time.timeScale에 영향을 받지 않는 전체 게임 시간입니다. + // 시간에 비례하는 절대적인 회전 각도를 계산하여 매 프레임 설정합니다. + // 이렇게 하면 프레임 속도 변화에 관계없이 항상 일관되고 부드러운 회전을 보장할 수 있습니다. + float zRotation = Time.unscaledTime * loadingSpeed * 360; + loadingImageTransform.rotation = Quaternion.Euler(0, 0, zRotation); + + // 2. 이미지 채우기(Fill) 애니메이션 (필요 시 주석 해제하여 사용) + // Mathf.PingPong(시간, 길이): 0과 '길이' 사이를 왕복하는 값을 반환합니다. + // 여기서는 fillAmount가 0과 1 사이를 계속 오가도록 하여 채워졌다 비워지는 효과를 만듭니다. + loadinImage.fillAmount = Mathf.PingPong(Time.unscaledTime * rotationSpeed, 1); } } } diff --git a/Assets/Scripts/UVC/UI/Loading/UILoadingBar.cs b/Assets/Scripts/UVC/UI/Loading/UILoadingBar.cs index eed83331..59c0faf0 100644 --- a/Assets/Scripts/UVC/UI/Loading/UILoadingBar.cs +++ b/Assets/Scripts/UVC/UI/Loading/UILoadingBar.cs @@ -5,16 +5,36 @@ using UnityEngine.UI; namespace UVC.UI.Loading { + /// + /// 로딩 UI의 표시와 숨김, 진행 상태를 관리하는 클래스입니다. + /// CanvasGroup 컴포넌트를 사용하여 페이드 인/아웃 효과를 구현합니다. + /// 이 클래스가 게임 오브젝트에 추가되면 CanvasGroup 컴포넌트도 자동으로 추가됩니다. + /// [RequireComponent(typeof(CanvasGroup))] - public class UILoadingBar : UnityEngine.MonoBehaviour + public class UILoadingBar : MonoBehaviour { + /// + /// 로딩 바 UI 프리팹이 있는 Resources 폴더 내의 경로입니다. + /// Show() 메서드가 처음 호출될 때 이 경로를 사용하여 프리팹을 동적으로 생성합니다. + /// public static string PrefabPath = "Prefabs/UI/Loading/UILoadingBar"; + /// + /// UILoadingBar의 유일한 인스턴스(Singleton)입니다. + /// static으로 선언되어 어디서든 UILoadingBar.instance 형태로 접근할 수 있습니다. + /// private static UILoadingBar instance; /// - /// 0.0~1.0 + /// 로딩 진행률을 0.0에서 1.0 사이의 값으로 설정하거나 가져옵니다. + /// 이 값은 로딩 이미지의 채워지는 양(fillAmount)에 직접 반영됩니다. /// + /// + /// + /// // 로딩 진행률을 50%로 설정 + /// UILoadingBar.Percent = 0.5f; + /// + /// public static float Percent { get @@ -29,6 +49,15 @@ namespace UVC.UI.Loading } } + /// + /// 로딩 화면에 표시될 메시지를 설정하거나 가져옵니다. + /// + /// + /// + /// // 로딩 메시지 설정 + /// UILoadingBar.Message = "데이터를 불러오는 중입니다..."; + /// + /// public static string Message { get @@ -43,6 +72,20 @@ namespace UVC.UI.Loading } } + /// + /// 로딩 바를 화면에 표시합니다. + /// 만약 로딩 바 인스턴스가 없다면 PrefabPath에서 프리팹을 불러와 생성합니다. + /// + /// 로딩 화면에 표시할 메시지입니다. + /// + /// + /// // 기본 메시지로 로딩 바 표시 + /// UILoadingBar.Show(); + /// + /// // 특정 메시지와 함께 로딩 바 표시 + /// UILoadingBar.Show("플레이어 정보를 로딩 중입니다..."); + /// + /// public static void Show(string message = "") { if (instance == null) { @@ -56,6 +99,16 @@ namespace UVC.UI.Loading instance.ShowLoading(); } + /// + /// 로딩 바를 화면에서 숨깁니다. + /// 숨겨진 후에는 자동으로 파괴됩니다. + /// + /// + /// + /// // 로딩 완료 후 로딩 바 숨기기 + /// UILoadingBar.Hide(); + /// + /// public static void Hide() { if (instance != null) @@ -64,64 +117,74 @@ namespace UVC.UI.Loading } } + [Tooltip("페이드 인/아웃 효과를 제어하는 CanvasGroup 컴포넌트입니다. 알파 값을 조정하여 UI의 투명도를 변경합니다.")] + [SerializeField] + private CanvasGroup canvasGroup; // 페이드 효과를 제어하기 위한 CanvasGroup 컴포넌트 + [Tooltip("로딩 진행 상태를 표시하는 이미지 컴포넌트입니다. 로딩 중 진행률을 시각적으로 나타냅니다.")] + [SerializeField] + private Image loadinImage; // 로딩 진행 상태를 표시하는 이미지 + [Tooltip("로딩 메시지를 표시하는 텍스트 컴포넌트입니다. 로딩 중 사용자에게 정보를 제공합니다.")] + [SerializeField] + private TextMeshProUGUI text; // 로딩 메시지를 표시하는 텍스트 + private float target = 0; // 애니메이션의 목표 알파 값 (0: 투명, 1: 불투명) + private float duration = 0.25f; // 페이드 인/아웃 애니메이션 지속 시간 + private bool animatting = false; // 현재 애니메이션이 진행 중인지 여부 - - private CanvasGroup canvasGroup; - private float target = 0; - private float duration = 0.25f; - private float alpha = 1; - private bool animatting = false; - private Image loadinImage; - private Transform loadingImageTransform; - private TextMeshProUGUI text; - - private float loadingSpeed = 1.5f; - private float rotationSpeed = 1.0f; - - private void Awake() - { - canvasGroup = GetComponent(); - loadinImage = transform.Find("loadingImage").GetComponent(); - text = transform.Find("message").GetComponent(); - loadingImageTransform = loadinImage.transform; - } - - + /// + /// 로딩 바를 부드럽게 나타나게 하는 애니메이션을 시작합니다. + /// 이미 나타나는 중이면 다시 호출되지 않습니다. + /// public void ShowLoading() { + // 이미 애니메이션 중이고 목표 알파 값이 1(불투명)이면 중복 실행 방지 if (animatting && target == 1) return; target = 1; animatting = true; - StopCoroutine("Animate"); - StartCoroutine(Animate()); + StopCoroutine("Animate"); // 이전에 실행 중이던 Animate 코루틴이 있다면 중지 + StartCoroutine(Animate()); // Animate 코루틴 시작 } + /// + /// 로딩 바를 부드럽게 사라지게 하는 애니메이션을 시작합니다. + /// 이미 사라지는 중이면 다시 호출되지 않습니다. + /// public void HideLoading() { + // 이미 애니메이션 중이고 목표 알파 값이 0(투명)이면 중복 실행 방지 if (animatting && target == 0) return; target = 0; animatting = true; - StopCoroutine("Animate"); - StartCoroutine(Animate()); + StopCoroutine("Animate"); // 이전에 실행 중이던 Animate 코루틴이 있다면 중지 + StartCoroutine(Animate()); // Animate 코루틴 시작 } + /// + /// CanvasGroup의 알파 값을 조절하여 페이드 인/아웃 효과를 주는 코루틴입니다. + /// 코루틴은 특정 시간 동안 또는 특정 조건이 만족될 때까지 함수의 실행을 잠시 멈출 수 있는 특별한 함수입니다. + /// private IEnumerator Animate() { - float start = canvasGroup.alpha; - float time = 0; + float start = canvasGroup.alpha; // 애니메이션 시작 시점의 알파 값 + float time = 0; // 애니메이션 경과 시간 + // 경과 시간이 duration에 도달할 때까지 반복 while (time < duration) { - time += Time.deltaTime; + time += Time.deltaTime; // 한 프레임 동안의 시간을 더해줌 + // Mathf.Lerp를 사용하여 시작 알파 값과 목표 알파 값 사이를 부드럽게 보간 canvasGroup.alpha = Mathf.Lerp(start, target, time / duration); + // 다음 프레임까지 대기 yield return null; } + // 애니메이션이 끝난 후 목표 알파 값으로 정확히 설정 canvasGroup.alpha = target; animatting = false; - if(target == 0) + + // 만약 목표 알파 값이 0(사라지는 애니메이션)이었다면, 게임 오브젝트를 파괴 + if (target == 0) { Destroy(gameObject); } diff --git a/Assets/Scripts/UVC/UI/Tab.meta b/Assets/Scripts/UVC/UI/Tab.meta new file mode 100644 index 00000000..caa5169c --- /dev/null +++ b/Assets/Scripts/UVC/UI/Tab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 87d7308ca55b2a34e818090493d0b897 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UVC/UI/Tab/ITabContent.cs b/Assets/Scripts/UVC/UI/Tab/ITabContent.cs new file mode 100644 index 00000000..fc3a4dab --- /dev/null +++ b/Assets/Scripts/UVC/UI/Tab/ITabContent.cs @@ -0,0 +1,16 @@ +#nullable enable +namespace UVC.UI.Tab +{ + /// + /// 모든 탭 콘텐츠 클래스가 구현해야 하는 인터페이스입니다. + /// 데이터를 받을 수 있는 공통 메서드를 정의합니다. + /// + public interface ITabContent + { + /// + /// 탭 콘텐츠에 데이터를 전달합니다. + /// + /// 전달할 데이터 객체 + void SetContentData(object? data); + } +} diff --git a/Assets/Scripts/UVC/UI/Tab/ITabContent.cs.meta b/Assets/Scripts/UVC/UI/Tab/ITabContent.cs.meta new file mode 100644 index 00000000..c90f83be --- /dev/null +++ b/Assets/Scripts/UVC/UI/Tab/ITabContent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2226fb1b6c4b11a4a9f899ab5e456a21 \ No newline at end of file diff --git a/Assets/Scripts/UVC/UI/Tab/TabButtonView.cs b/Assets/Scripts/UVC/UI/Tab/TabButtonView.cs new file mode 100644 index 00000000..6a4b05ee --- /dev/null +++ b/Assets/Scripts/UVC/UI/Tab/TabButtonView.cs @@ -0,0 +1,113 @@ +#nullable enable +using System; +using TMPro; +using UnityEngine; +using UnityEngine.UI; + +namespace UVC.UI.Tab +{ + /// + /// 단일 탭 버튼의 UI를 관리하는 컴포넌트입니다. + /// + public class TabButtonView : MonoBehaviour + { + [Tooltip("탭 버튼 컴포넌트")] + [SerializeField] private Button? button; + + [Tooltip("탭 이름을 표시할 Text 컴포넌트")] + [SerializeField] private TextMeshProUGUI? tabText; + + [Tooltip("탭 아이콘을 표시할 Image 컴포넌트")] + [SerializeField] private Image? tabIcon; + + [Tooltip("탭 배경 이미지 컴포넌트")] + [SerializeField] private Image? background; + + [Tooltip("탭이 활성화되었을 때의 색상")] + [SerializeField] private Color? activeColor;// = Color.white; + + [Tooltip("탭이 비활성화되었을 때의 색상")] + [SerializeField] private Color? inactiveColor;// = new Color(0.8f, 0.8f, 0.8f); + + private int _tabIndex; + private Action? _onTabSelected; + + private void Awake() + { + // Button 컴포넌트가 할당되지 않은 경우 자동으로 찾기 + if (button == null) + button = GetComponent