From 4d29143d47b6b30f69d1dc63b4539298f85d07f3 Mon Sep 17 00:00:00 2001 From: logonkhi Date: Tue, 22 Jul 2025 19:58:14 +0900 Subject: [PATCH] =?UTF-8?q?playback=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UI/Buttons/{assets.meta => images.meta} | 0 .../{assets => images}/image_down_arrow.png | Bin .../image_down_arrow.png.meta | 0 .../image_topmenubar_search.png | Bin .../image_topmenubar_search.png.meta | 0 .../Prefabs/UI/Factory/Playback.meta | 8 + .../UI/Factory/Playback/UIDropdown.prefab | 1267 +++++++ .../Factory/Playback/UIDropdown.prefab.meta | 7 + .../UI/Factory/Playback/UIPlayback.prefab | 3288 +++++++++++++++++ .../Factory/Playback/UIPlayback.prefab.meta | 7 + .../Playback/UIPlaybackListItem.prefab | 868 +++++ .../Playback/UIPlaybackListItem.prefab.meta | 7 + .../Playback/UIPlaybackListModal.prefab | 2271 ++++++++++++ .../Playback/UIPlaybackListModal.prefab.meta | 7 + .../Prefabs/UI/Factory/Playback/images.meta | 8 + .../images/UIDropdown_menu_bottom.png | Bin 0 -> 1735 bytes .../images/UIDropdown_menu_bottom.png.meta | 143 + .../images/UIDropdown_menu_middle.png | Bin 0 -> 1634 bytes .../images/UIDropdown_menu_middle.png.meta | 143 + .../Playback/images/UIDropdown_menu_one.png | Bin 0 -> 1632 bytes .../images/UIDropdown_menu_one.png.meta | 143 + .../Playback/images/UIDropdown_menu_top.png | Bin 0 -> 1558 bytes .../images/UIDropdown_menu_top.png.meta | 143 + .../UIPlaybackListItem_deleteButton.png | Bin 0 -> 340 bytes .../UIPlaybackListItem_deleteButton.png.meta | 143 + .../UIPlaybackListItem_downloadButton.png | Bin 0 -> 261 bytes ...UIPlaybackListItem_downloadButton.png.meta | 143 + .../UIPlaybackListItem_loadingImage.png | Bin 0 -> 295 bytes .../UIPlaybackListItem_loadingImage.png.meta | 143 + .../UIPlaybackListItem_selectedImage.png | Bin 0 -> 249 bytes .../UIPlaybackListItem_selectedImage.png.meta | 143 + .../images/UIPlaybackListItem_stopButton.png | Bin 0 -> 226 bytes .../UIPlaybackListItem_stopButton.png.meta | 143 + .../images/UIPlaybackListModal_arrow.png | Bin 0 -> 173 bytes .../images/UIPlaybackListModal_arrow.png.meta | 143 + .../Playback/images/UIPlayback_pause.png | Bin 0 -> 216 bytes .../Playback/images/UIPlayback_pause.png.meta | 143 + .../Playback/images/UIPlayback_play.png | Bin 0 -> 304 bytes .../Playback/images/UIPlayback_play.png.meta | 143 + Assets/Resources/Prefabs/UI/Loading.meta | 8 + .../Prefabs/UI/Loading/UILoading.png | Bin 0 -> 1974 bytes .../Prefabs/UI/Loading/UILoading.png.meta | 143 + .../Prefabs/UI/Loading/UILoading.prefab | 269 ++ .../Prefabs/UI/Loading/UILoading.prefab.meta | 7 + .../Prefabs/UI/Loading/UILoadingBar.png | Bin 0 -> 138 bytes .../Prefabs/UI/Loading/UILoadingBar.png.meta | 143 + .../Prefabs/UI/Loading/UILoadingBar.prefab | 482 +++ .../UI/Loading/UILoadingBar.prefab.meta | 7 + Assets/Resources/Prefabs/UI/UIDragger.prefab | 93 + .../Prefabs/UI/UIDragger.prefab.meta | 7 + .../Prefabs/UI/images/Image_Cancel.png | Bin 0 -> 286 bytes .../Prefabs/UI/images/Image_Cancel.png.meta | 143 + .../Prefabs/UI/images/Image_dragger_h.png | Bin 0 -> 163 bytes .../UI/images/Image_dragger_h.png.meta | 143 + .../Prefabs/UI/images/Image_dragger_v.png | Bin 0 -> 154 bytes .../UI/images/Image_dragger_v.png.meta | 143 + .../UI/images/circle_fill_10_shadow.png.meta | 4 +- .../Prefabs/UI/images/image_panel_shadow.png | Bin 0 -> 2085 bytes .../UI/images/image_panel_shadow.png.meta | 143 + .../Prefabs/UI/images/image_radial_shadow.png | Bin 0 -> 30029 bytes .../UI/images/image_radial_shadow.png.meta | 143 + .../rectangle_fill_10_radius_4.png.meta | 10 +- ...rectangle_fill_10_radius_4_shadow.png.meta | 4 +- ...ectangle_fill_outline_10_radius_4.png.meta | 8 +- ...e_fill_outline_10_radius_4_shadow.png.meta | 4 +- .../Prefabs/UI/images/shadow_40.png.meta | 8 +- Assets/Scenes/SampleProject.unity | 4 + Assets/Scripts/SampleProject/AppMain.cs | 88 +- .../Scripts/SampleProject/Config/Constants.cs | 1 + Assets/Scripts/SampleProject/SceneMain.cs | 31 +- .../UI/Menu/SampleProjectTopMenuController.cs | 7 +- Assets/Scripts/UVC/Data/Core/DataArray.cs | 29 +- Assets/Scripts/UVC/Data/Core/DataArrayPool.cs | 4 +- .../UVC/Data/Core/DataMapperValidator.cs | 83 + .../UVC/Data/Core/DataMapperValidator.cs.meta | 2 + Assets/Scripts/UVC/Data/Core/DataObject.cs | 34 +- .../Scripts/UVC/Data/Core/DataObjectPool.cs | 4 +- Assets/Scripts/UVC/Data/DataRepository.cs | 122 +- .../Scripts/UVC/Data/Http/HttpDataFetcher.cs | 254 +- .../UVC/Data/Http/HttpDataProcessor.cs | 395 ++ .../UVC/Data/Http/HttpDataProcessor.cs.meta | 2 + .../UVC/Data/Http/HttpRequestConfig.cs | 55 +- .../Scripts/UVC/Data/Mqtt/MqttDataReceiver.cs | 42 +- Assets/Scripts/UVC/Data/Mqtt/MqttWorker.cs | 1 + Assets/Scripts/UVC/Data/URLList.cs | 52 +- .../Scripts/UVC/Factory/Alarm/AlarmManager.cs | 50 +- .../UVC/Factory/Component/AGVManager.cs | 43 +- Assets/Scripts/UVC/Factory/Playback.meta | 8 + .../UVC/Factory/Playback/PlaybackCommand.cs | 43 + .../Factory/Playback/PlaybackCommand.cs.meta | 2 + .../Factory/Playback/PlaybackRepository.cs | 107 + .../Playback/PlaybackRepository.cs.meta | 2 + .../Factory/Playback/PlaybackSQLiteService.cs | 164 + .../Playback/PlaybackSQLiteService.cs.meta | 2 + .../UVC/Factory/Playback/PlaybackService.cs | 207 ++ .../Factory/Playback/PlaybackService.cs.meta | 2 + Assets/Scripts/UVC/Factory/Playback/UI.meta | 8 + .../UVC/Factory/Playback/UI/UIPlayback.cs | 265 ++ .../Factory/Playback/UI/UIPlayback.cs.meta | 2 + .../Factory/Playback/UI/UIPlaybackListItem.cs | 311 ++ .../Playback/UI/UIPlaybackListItem.cs.meta | 2 + .../Playback/UI/UIPlaybackListModal.cs | 319 ++ .../Playback/UI/UIPlaybackListModal.cs.meta | 2 + .../Playback/UI/UIPlaybackProgressBar.cs | 142 + .../Playback/UI/UIPlaybackProgressBar.cs.meta | 2 + Assets/Scripts/UVC/Network/HttpRequester.cs | 288 +- .../Scripts/UVC/Network/HttpResponseModel.cs | 51 + .../UVC/Network/HttpResponseModel.cs.meta | 2 + Assets/Scripts/UVC/Pool/GameObjectPool.cs | 28 +- Assets/Scripts/UVC/Pool/ItemPool.cs | 322 ++ Assets/Scripts/UVC/Pool/ItemPool.cs.meta | 2 + Assets/Scripts/UVC/UI/Loading.meta | 8 + Assets/Scripts/UVC/UI/Loading/UILoading.cs | 104 + .../Scripts/UVC/UI/Loading/UILoading.cs.meta | 2 + Assets/Scripts/UVC/UI/Loading/UILoadingBar.cs | 131 + .../UVC/UI/Loading/UILoadingBar.cs.meta | 2 + Assets/Scripts/UVC/UI/SliderWithEvent.cs | 100 + Assets/Scripts/UVC/UI/SliderWithEvent.cs.meta | 2 + Assets/Scripts/UVC/UI/UIDragger.cs | 175 + Assets/Scripts/UVC/UI/UIDragger.cs.meta | 2 + Assets/Scripts/UVC/UI/UISliderWithLabel.cs | 81 + .../Scripts/UVC/UI/UISliderWithLabel.cs.meta | 2 + Assets/Scripts/UVC/Util/DateTimeUtil.cs | 124 + Assets/Scripts/UVC/Util/DateTimeUtil.cs.meta | 2 + 124 files changed, 15059 insertions(+), 628 deletions(-) rename Assets/Resources/Prefabs/UI/Buttons/{assets.meta => images.meta} (100%) rename Assets/Resources/Prefabs/UI/Buttons/{assets => images}/image_down_arrow.png (100%) rename Assets/Resources/Prefabs/UI/Buttons/{assets => images}/image_down_arrow.png.meta (100%) rename Assets/Resources/Prefabs/UI/Buttons/{assets => images}/image_topmenubar_search.png (100%) rename Assets/Resources/Prefabs/UI/Buttons/{assets => images}/image_topmenubar_search.png.meta (100%) create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback.meta create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/UIDropdown.prefab create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/UIDropdown.prefab.meta create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/UIPlayback.prefab create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/UIPlayback.prefab.meta create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/UIPlaybackListItem.prefab create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/UIPlaybackListItem.prefab.meta create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/UIPlaybackListModal.prefab create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/UIPlaybackListModal.prefab.meta create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images.meta create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_bottom.png create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_bottom.png.meta create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_middle.png create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_middle.png.meta create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_one.png create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_one.png.meta create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_top.png create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_top.png.meta create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_deleteButton.png create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_deleteButton.png.meta create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_downloadButton.png create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_downloadButton.png.meta create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_loadingImage.png create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_loadingImage.png.meta create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_selectedImage.png create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_selectedImage.png.meta create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_stopButton.png create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_stopButton.png.meta create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListModal_arrow.png create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListModal_arrow.png.meta create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlayback_pause.png create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlayback_pause.png.meta create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlayback_play.png create mode 100644 Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlayback_play.png.meta create mode 100644 Assets/Resources/Prefabs/UI/Loading.meta create mode 100644 Assets/Resources/Prefabs/UI/Loading/UILoading.png create mode 100644 Assets/Resources/Prefabs/UI/Loading/UILoading.png.meta create mode 100644 Assets/Resources/Prefabs/UI/Loading/UILoading.prefab create mode 100644 Assets/Resources/Prefabs/UI/Loading/UILoading.prefab.meta create mode 100644 Assets/Resources/Prefabs/UI/Loading/UILoadingBar.png create mode 100644 Assets/Resources/Prefabs/UI/Loading/UILoadingBar.png.meta create mode 100644 Assets/Resources/Prefabs/UI/Loading/UILoadingBar.prefab create mode 100644 Assets/Resources/Prefabs/UI/Loading/UILoadingBar.prefab.meta create mode 100644 Assets/Resources/Prefabs/UI/UIDragger.prefab create mode 100644 Assets/Resources/Prefabs/UI/UIDragger.prefab.meta create mode 100644 Assets/Resources/Prefabs/UI/images/Image_Cancel.png create mode 100644 Assets/Resources/Prefabs/UI/images/Image_Cancel.png.meta create mode 100644 Assets/Resources/Prefabs/UI/images/Image_dragger_h.png create mode 100644 Assets/Resources/Prefabs/UI/images/Image_dragger_h.png.meta create mode 100644 Assets/Resources/Prefabs/UI/images/Image_dragger_v.png create mode 100644 Assets/Resources/Prefabs/UI/images/Image_dragger_v.png.meta create mode 100644 Assets/Resources/Prefabs/UI/images/image_panel_shadow.png create mode 100644 Assets/Resources/Prefabs/UI/images/image_panel_shadow.png.meta create mode 100644 Assets/Resources/Prefabs/UI/images/image_radial_shadow.png create mode 100644 Assets/Resources/Prefabs/UI/images/image_radial_shadow.png.meta create mode 100644 Assets/Scripts/UVC/Data/Core/DataMapperValidator.cs create mode 100644 Assets/Scripts/UVC/Data/Core/DataMapperValidator.cs.meta create mode 100644 Assets/Scripts/UVC/Data/Http/HttpDataProcessor.cs create mode 100644 Assets/Scripts/UVC/Data/Http/HttpDataProcessor.cs.meta create mode 100644 Assets/Scripts/UVC/Factory/Playback.meta create mode 100644 Assets/Scripts/UVC/Factory/Playback/PlaybackCommand.cs create mode 100644 Assets/Scripts/UVC/Factory/Playback/PlaybackCommand.cs.meta create mode 100644 Assets/Scripts/UVC/Factory/Playback/PlaybackRepository.cs create mode 100644 Assets/Scripts/UVC/Factory/Playback/PlaybackRepository.cs.meta create mode 100644 Assets/Scripts/UVC/Factory/Playback/PlaybackSQLiteService.cs create mode 100644 Assets/Scripts/UVC/Factory/Playback/PlaybackSQLiteService.cs.meta create mode 100644 Assets/Scripts/UVC/Factory/Playback/PlaybackService.cs create mode 100644 Assets/Scripts/UVC/Factory/Playback/PlaybackService.cs.meta create mode 100644 Assets/Scripts/UVC/Factory/Playback/UI.meta create mode 100644 Assets/Scripts/UVC/Factory/Playback/UI/UIPlayback.cs create mode 100644 Assets/Scripts/UVC/Factory/Playback/UI/UIPlayback.cs.meta create mode 100644 Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListItem.cs create mode 100644 Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListItem.cs.meta create mode 100644 Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListModal.cs create mode 100644 Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListModal.cs.meta create mode 100644 Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackProgressBar.cs create mode 100644 Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackProgressBar.cs.meta create mode 100644 Assets/Scripts/UVC/Network/HttpResponseModel.cs create mode 100644 Assets/Scripts/UVC/Network/HttpResponseModel.cs.meta create mode 100644 Assets/Scripts/UVC/Pool/ItemPool.cs create mode 100644 Assets/Scripts/UVC/Pool/ItemPool.cs.meta create mode 100644 Assets/Scripts/UVC/UI/Loading.meta create mode 100644 Assets/Scripts/UVC/UI/Loading/UILoading.cs create mode 100644 Assets/Scripts/UVC/UI/Loading/UILoading.cs.meta create mode 100644 Assets/Scripts/UVC/UI/Loading/UILoadingBar.cs create mode 100644 Assets/Scripts/UVC/UI/Loading/UILoadingBar.cs.meta create mode 100644 Assets/Scripts/UVC/UI/SliderWithEvent.cs create mode 100644 Assets/Scripts/UVC/UI/SliderWithEvent.cs.meta create mode 100644 Assets/Scripts/UVC/UI/UIDragger.cs create mode 100644 Assets/Scripts/UVC/UI/UIDragger.cs.meta create mode 100644 Assets/Scripts/UVC/UI/UISliderWithLabel.cs create mode 100644 Assets/Scripts/UVC/UI/UISliderWithLabel.cs.meta create mode 100644 Assets/Scripts/UVC/Util/DateTimeUtil.cs create mode 100644 Assets/Scripts/UVC/Util/DateTimeUtil.cs.meta diff --git a/Assets/Resources/Prefabs/UI/Buttons/assets.meta b/Assets/Resources/Prefabs/UI/Buttons/images.meta similarity index 100% rename from Assets/Resources/Prefabs/UI/Buttons/assets.meta rename to Assets/Resources/Prefabs/UI/Buttons/images.meta diff --git a/Assets/Resources/Prefabs/UI/Buttons/assets/image_down_arrow.png b/Assets/Resources/Prefabs/UI/Buttons/images/image_down_arrow.png similarity index 100% rename from Assets/Resources/Prefabs/UI/Buttons/assets/image_down_arrow.png rename to Assets/Resources/Prefabs/UI/Buttons/images/image_down_arrow.png diff --git a/Assets/Resources/Prefabs/UI/Buttons/assets/image_down_arrow.png.meta b/Assets/Resources/Prefabs/UI/Buttons/images/image_down_arrow.png.meta similarity index 100% rename from Assets/Resources/Prefabs/UI/Buttons/assets/image_down_arrow.png.meta rename to Assets/Resources/Prefabs/UI/Buttons/images/image_down_arrow.png.meta diff --git a/Assets/Resources/Prefabs/UI/Buttons/assets/image_topmenubar_search.png b/Assets/Resources/Prefabs/UI/Buttons/images/image_topmenubar_search.png similarity index 100% rename from Assets/Resources/Prefabs/UI/Buttons/assets/image_topmenubar_search.png rename to Assets/Resources/Prefabs/UI/Buttons/images/image_topmenubar_search.png diff --git a/Assets/Resources/Prefabs/UI/Buttons/assets/image_topmenubar_search.png.meta b/Assets/Resources/Prefabs/UI/Buttons/images/image_topmenubar_search.png.meta similarity index 100% rename from Assets/Resources/Prefabs/UI/Buttons/assets/image_topmenubar_search.png.meta rename to Assets/Resources/Prefabs/UI/Buttons/images/image_topmenubar_search.png.meta diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback.meta b/Assets/Resources/Prefabs/UI/Factory/Playback.meta new file mode 100644 index 00000000..e454d62f --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 18b663b0bcf22b542afd793095cc7697 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/UIDropdown.prefab b/Assets/Resources/Prefabs/UI/Factory/Playback/UIDropdown.prefab new file mode 100644 index 00000000..b11a63d8 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/UIDropdown.prefab @@ -0,0 +1,1267 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &425355307982283010 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9081918296522201023} + - component: {fileID: 3124138225548905265} + - component: {fileID: 6780062751029073204} + - component: {fileID: 2810948481382973266} + m_Layer: 5 + m_Name: UIDropdown + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &9081918296522201023 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 425355307982283010} + 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: 2383323461575607440} + - {fileID: 5975325996574463744} + - {fileID: 4678200209926945194} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: -132} + m_SizeDelta: {x: 376, y: 40} + m_Pivot: {x: 0.5, y: 1} +--- !u!222 &3124138225548905265 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 425355307982283010} + m_CullTransparentMesh: 1 +--- !u!114 &6780062751029073204 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 425355307982283010} + 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.6509434, g: 0.6509434, b: 0.6509434, 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: -27720893, 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!114 &2810948481382973266 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 425355307982283010} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, 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: 6780062751029073204} + m_Template: {fileID: 4678200209926945194} + m_CaptionText: {fileID: 1229913133539173580} + m_CaptionImage: {fileID: 0} + m_Placeholder: {fileID: 0} + m_ItemText: {fileID: 7882090932785452085} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_MultiSelect: 0 + m_Options: + m_Options: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_AlphaFadeSpeed: 0.15 +--- !u!1 &2169887938020525499 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1522917607942473075} + - component: {fileID: 1914307746083459508} + m_Layer: 5 + m_Name: Item + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1522917607942473075 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2169887938020525499} + 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: 2209825287686097652} + - {fileID: 2608502109265874852} + - {fileID: 1237437616584040584} + m_Father: {fileID: 9026767380930594782} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 28} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1914307746083459508 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2169887938020525499} + 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: 2551974674807730881} + toggleTransition: 1 + graphic: {fileID: 8487919243871948774} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &2975984822865623939 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5975325996574463744} + - component: {fileID: 2155579936465604437} + - component: {fileID: 4277838591605861812} + m_Layer: 5 + m_Name: Arrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5975325996574463744 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2975984822865623939} + 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: 9081918296522201023} + 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: -15, y: 0} + m_SizeDelta: {x: 16, y: 16} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2155579936465604437 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2975984822865623939} + m_CullTransparentMesh: 1 +--- !u!114 &4277838591605861812 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2975984822865623939} + 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: 53cb7a6d381e31e4fb3ab38f05378abe, 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!1 &3087781342826560048 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2209825287686097652} + - component: {fileID: 7102877138349071239} + - component: {fileID: 2551974674807730881} + m_Layer: 5 + m_Name: Item Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2209825287686097652 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3087781342826560048} + 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: 1522917607942473075} + 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 &7102877138349071239 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3087781342826560048} + m_CullTransparentMesh: 1 +--- !u!114 &2551974674807730881 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3087781342826560048} + 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.9607843, g: 0.9607843, b: 0.9607843, a: 0} + 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: ef17ab8643b67aa4ba86a434f405f8b1, 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 &3405034621613081027 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4306098995628391313} + - component: {fileID: 7897493695162819909} + - component: {fileID: 7335177874837611122} + - component: {fileID: 5475545323621524545} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4306098995628391313 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3405034621613081027} + 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: 9026767380930594782} + m_Father: {fileID: 4678200209926945194} + 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 &7897493695162819909 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3405034621613081027} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!222 &7335177874837611122 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3405034621613081027} + m_CullTransparentMesh: 1 +--- !u!114 &5475545323621524545 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3405034621613081027} + 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!1 &3834855117685822222 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9026767380930594782} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &9026767380930594782 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3834855117685822222} + 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: 1522917607942473075} + m_Father: {fileID: 4306098995628391313} + 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: 28} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &4223237804917492082 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6676577973829957464} + - component: {fileID: 7496657396361150020} + - component: {fileID: 4318917623076826784} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6676577973829957464 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4223237804917492082} + 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: 5012119678434389537} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7496657396361150020 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4223237804917492082} + m_CullTransparentMesh: 1 +--- !u!114 &4318917623076826784 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4223237804917492082} + 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 &4310989430805407702 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1078862609327386245} + - component: {fileID: 1778205714662932601} + - component: {fileID: 5882368313568759463} + - component: {fileID: 6574286917972824584} + m_Layer: 5 + m_Name: Scrollbar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1078862609327386245 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4310989430805407702} + 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: 5012119678434389537} + m_Father: {fileID: 4678200209926945194} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 8, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!222 &1778205714662932601 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4310989430805407702} + m_CullTransparentMesh: 1 +--- !u!114 &5882368313568759463 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4310989430805407702} + 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.7294118, g: 0.7294118, b: 0.7294118, 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!114 &6574286917972824584 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4310989430805407702} + 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: 4318917623076826784} + m_HandleRect: {fileID: 6676577973829957464} + m_Direction: 2 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &5822372028909603867 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2383323461575607440} + - component: {fileID: 2423427195018517770} + - component: {fileID: 1229913133539173580} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2383323461575607440 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5822372028909603867} + 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: 9081918296522201023} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -7.5, y: -0.5} + m_SizeDelta: {x: -35, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2423427195018517770 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5822372028909603867} + m_CullTransparentMesh: 1 +--- !u!114 &1229913133539173580 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5822372028909603867} + 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: 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: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 0 + m_fontSizeMax: 0 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: -1 + 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: + 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 &5949032360650574405 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2677473076674448674} + - component: {fileID: 7337786480717136048} + - component: {fileID: 3160592805432345965} + m_Layer: 5 + m_Name: shadow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2677473076674448674 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5949032360650574405} + 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: 4678200209926945194} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 10, y: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7337786480717136048 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5949032360650574405} + m_CullTransparentMesh: 1 +--- !u!114 &3160592805432345965 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5949032360650574405} + 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: c6b2729b906e71c42a5f0417601e5cd0, 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!1 &7944014036575889102 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2608502109265874852} + - component: {fileID: 789714312990069693} + - component: {fileID: 8487919243871948774} + m_Layer: 5 + m_Name: Item Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &2608502109265874852 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7944014036575889102} + 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: 1522917607942473075} + 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 &789714312990069693 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7944014036575889102} + m_CullTransparentMesh: 1 +--- !u!114 &8487919243871948774 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7944014036575889102} + 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 +--- !u!1 &7949712810277442677 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5012119678434389537} + 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 &5012119678434389537 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7949712810277442677} + 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: 6676577973829957464} + m_Father: {fileID: 1078862609327386245} + 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 &8243029616380815177 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1237437616584040584} + - component: {fileID: 1941935767234938162} + - component: {fileID: 7882090932785452085} + m_Layer: 5 + m_Name: Item Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1237437616584040584 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8243029616380815177} + 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: 1522917607942473075} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 1, y: 0} + m_SizeDelta: {x: -22, y: -8} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1941935767234938162 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8243029616380815177} + m_CullTransparentMesh: 1 +--- !u!114 &7882090932785452085 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8243029616380815177} + 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: Option A + 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: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 0 + m_fontSizeMax: 0 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: -1 + 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: + 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 &8646133066887709434 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4678200209926945194} + - component: {fileID: 1934543991648058929} + - component: {fileID: 7075373062403712149} + - component: {fileID: 7564296231177376128} + m_Layer: 5 + m_Name: Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4678200209926945194 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8646133066887709434} + 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: 2677473076674448674} + - {fileID: 4306098995628391313} + - {fileID: 1078862609327386245} + m_Father: {fileID: 9081918296522201023} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 2} + m_SizeDelta: {x: 0, y: 150} + m_Pivot: {x: 0.5, y: 1} +--- !u!222 &1934543991648058929 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8646133066887709434} + m_CullTransparentMesh: 1 +--- !u!114 &7075373062403712149 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8646133066887709434} + 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.05660377, b: 0.2735849, 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: -27720893, 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!114 &7564296231177376128 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8646133066887709434} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 9026767380930594782} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 2 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 4306098995628391313} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 6574286917972824584} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/UIDropdown.prefab.meta b/Assets/Resources/Prefabs/UI/Factory/Playback/UIDropdown.prefab.meta new file mode 100644 index 00000000..52129f67 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/UIDropdown.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9d27b83545b00b6409d27c5becea5c87 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/UIPlayback.prefab b/Assets/Resources/Prefabs/UI/Factory/Playback/UIPlayback.prefab new file mode 100644 index 00000000..a991c7d1 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/UIPlayback.prefab @@ -0,0 +1,3288 @@ +%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 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2950104462517668944} + - component: {fileID: 7173284576092275986} + - component: {fileID: 6456130289407198373} + m_Layer: 5 + m_Name: titleTxt + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2950104462517668944 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 524629217329646727} + 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: 7298685830589997354} + 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: 206, y: 24} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7173284576092275986 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 524629217329646727} + m_CullTransparentMesh: 1 +--- !u!114 &6456130289407198373 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 524629217329646727} + 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: Playback Mode + 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: 4289769472 + m_fontColor: {r: 0, g: 0.6901961, b: 0.6901961, 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: 2 + 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 &684460924507297797 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6435190705207939364} + - component: {fileID: 1826040402068431245} + - component: {fileID: 879923929597536053} + m_Layer: 5 + m_Name: Fill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6435190705207939364 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 684460924507297797} + 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: 3093129208473779095} + 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: 10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1826040402068431245 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 684460924507297797} + m_CullTransparentMesh: 1 +--- !u!114 &879923929597536053 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 684460924507297797} + 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} + 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 &708118076672675938 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2985284779945075815} + m_Layer: 5 + m_Name: PlayBar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2985284779945075815 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 708118076672675938} + 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: 6006018629857398586} + - {fileID: 1355571794369558167} + - {fileID: 4652755497126993482} + m_Father: {fileID: 8565117407018255600} + 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: 528, y: 20} + m_Pivot: {x: 0, y: 1} +--- !u!1 &1251026010612388254 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6006018629857398586} + - component: {fileID: 1613100573448511135} + - component: {fileID: 6158633726408402869} + m_Layer: 5 + m_Name: dayTxt0 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6006018629857398586 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1251026010612388254} + 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: 2985284779945075815} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 26, y: -10} + m_SizeDelta: {x: 52, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1613100573448511135 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1251026010612388254} + m_CullTransparentMesh: 1 +--- !u!114 &6158633726408402869 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1251026010612388254} + 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: 24.11.26 + 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: 4288782753 + m_fontColor: {r: 0.6313726, g: 0.6313726, b: 0.6313726, 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: 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 &1647034237099107615 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3853899656668261898} + - component: {fileID: 7937416967300928619} + - component: {fileID: 1863098519746749812} + 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 &3853899656668261898 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1647034237099107615} + 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: 7096162121856398579} + 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!222 &7937416967300928619 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1647034237099107615} + m_CullTransparentMesh: 1 +--- !u!114 &1863098519746749812 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1647034237099107615} + 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!1 &2113369690765401555 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2543547444167745800} + - component: {fileID: 3063583698807767330} + - component: {fileID: 4280367653799193910} + m_Layer: 5 + m_Name: Fill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2543547444167745800 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2113369690765401555} + 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: 8328888389098500807} + 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: 10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3063583698807767330 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2113369690765401555} + m_CullTransparentMesh: 1 +--- !u!114 &4280367653799193910 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2113369690765401555} + 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} + 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 &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: 14 + m_fontSizeBase: 14 + 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 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2409061747141505902} + - component: {fileID: 4254908133387884904} + m_Layer: 5 + m_Name: opacitySlider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2409061747141505902 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3243958776734417420} + 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: 1240409011205210171} + - {fileID: 3093129208473779095} + - {fileID: 4195598165599364464} + m_Father: {fileID: 7298685830589997354} + 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: 85, y: 0} + m_SizeDelta: {x: 60, y: 40} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &4254908133387884904 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3243958776734417420} + 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: 7259469890092678465} + m_FillRect: {fileID: 6435190705207939364} + m_HandleRect: {fileID: 6326999618638631949} + m_Direction: 0 + m_MinValue: 0.2 + m_MaxValue: 1 + m_WholeNumbers: 0 + m_Value: 1 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &3422839910417541499 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1106793165530546313} + - component: {fileID: 3646917223373220029} + - component: {fileID: 1706223257231552631} + - component: {fileID: 4427580995337624553} + m_Layer: 5 + m_Name: PlayButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1106793165530546313 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3422839910417541499} + 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: 450544741838404995} + 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: 32, y: 32} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3646917223373220029 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3422839910417541499} + m_CullTransparentMesh: 1 +--- !u!114 &1706223257231552631 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3422839910417541499} + 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: 12921a2649b18f74696785bfe95b9470, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4427580995337624553 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3422839910417541499} + 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: 0 + 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: 1706223257231552631} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &3551948802505409755 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6767625352919134912} + - component: {fileID: 358869663560247574} + - component: {fileID: 5132694047660244511} + m_Layer: 5 + m_Name: opacityTxt + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6767625352919134912 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3551948802505409755} + 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: 7298685830589997354} + 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: 36, y: 0} + m_SizeDelta: {x: 42, y: 24} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &358869663560247574 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3551948802505409755} + m_CullTransparentMesh: 1 +--- !u!114 &5132694047660244511 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3551948802505409755} + 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: Opacity + 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: 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: 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 &3753850315503403316 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6326999618638631949} + - component: {fileID: 7801811500224626340} + - component: {fileID: 7259469890092678465} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6326999618638631949 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3753850315503403316} + 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: 4195598165599364464} + 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 &7801811500224626340 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3753850315503403316} + m_CullTransparentMesh: 1 +--- !u!114 &7259469890092678465 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3753850315503403316} + 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 &3898991659943282543 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240409011205210171} + - component: {fileID: 3448799985347701243} + - component: {fileID: 5413230708423916710} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240409011205210171 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3898991659943282543} + 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: 2409061747141505902} + 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: -14} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3448799985347701243 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3898991659943282543} + m_CullTransparentMesh: 1 +--- !u!114 &5413230708423916710 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3898991659943282543} + 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 &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 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1772582241787108090} + - component: {fileID: 5351322691742296489} + - component: {fileID: 5376035964741484593} + - component: {fileID: 627758170466984783} + m_Layer: 5 + m_Name: UIPlaybackPlayer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1772582241787108090 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4548019106164848943} + 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: 1995545819642775386} + - {fileID: 3463373943457463519} + - {fileID: 7298685830589997354} + - {fileID: 8565117407018255600} + m_Father: {fileID: 1668326421313938406} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: -60} + m_SizeDelta: {x: 560, y: 144} + m_Pivot: {x: 0.5, y: 1} +--- !u!222 &5351322691742296489 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4548019106164848943} + m_CullTransparentMesh: 1 +--- !u!225 &5376035964741484593 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4548019106164848943} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &627758170466984783 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4548019106164848943} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 16 + m_Right: 16 + m_Top: 8 + m_Bottom: 16 + m_ChildAlignment: 0 + m_Spacing: 24 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &5011544746000313092 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1995545819642775386} + - component: {fileID: 131802384415363172} + - component: {fileID: 7517843252503530716} + - component: {fileID: 9039100852440779311} + m_Layer: 5 + m_Name: Shadow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1995545819642775386 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5011544746000313092} + 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: 1772582241787108090} + 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: 24, y: 24} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &131802384415363172 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5011544746000313092} + m_CullTransparentMesh: 0 +--- !u!114 &7517843252503530716 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5011544746000313092} + 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, b: 0, a: 0.39215687} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 311db692c780ea74f9605477fb85f448, 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: 5 +--- !u!114 &9039100852440779311 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5011544746000313092} + 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 &5135065035957222301 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4195598165599364464} + 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 &4195598165599364464 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5135065035957222301} + 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: 6326999618638631949} + m_Father: {fileID: 2409061747141505902} + 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: -28} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &5283381470149077047 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6035001143067260080} + - component: {fileID: 5524712506939260210} + - component: {fileID: 2909131069762126532} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6035001143067260080 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5283381470149077047} + 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: 2120304119556048079} + 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: 0, y: 0} + m_SizeDelta: {x: 30, y: 20} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &5524712506939260210 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5283381470149077047} + m_CullTransparentMesh: 1 +--- !u!114 &2909131069762126532 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5283381470149077047} + 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: 1x + 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: 14 + m_fontSizeBase: 14 + 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: 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: 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 &5335161411832936085 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8988622228856496252} + - component: {fileID: 275146279639142948} + - component: {fileID: 8041663471734333405} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8988622228856496252 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5335161411832936085} + 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: 9164838024467178797} + 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 &275146279639142948 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5335161411832936085} + m_CullTransparentMesh: 1 +--- !u!114 &8041663471734333405 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5335161411832936085} + 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 &5459519465863795983 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3463373943457463519} + - component: {fileID: 1400395151368949943} + - component: {fileID: 5019240100422805224} + - component: {fileID: 6233793736527299375} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3463373943457463519 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5459519465863795983} + 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: 1772582241787108090} + 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 &1400395151368949943 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5459519465863795983} + m_CullTransparentMesh: 0 +--- !u!114 &5019240100422805224 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5459519465863795983} + 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.1509434, g: 0.1509434, b: 0.1509434, 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: 6 +--- !u!114 &6233793736527299375 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5459519465863795983} + 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 &5842636379417192733 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1668326421313938406} + - component: {fileID: 6819057462102420478} + - component: {fileID: 1131523558636582765} + m_Layer: 5 + m_Name: UIPlayback + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1668326421313938406 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5842636379417192733} + 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: 1772582241787108090} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &6819057462102420478 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5842636379417192733} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6ca072637b87cb24eba398b90a1d49e9, type: 3} + m_Name: + m_EditorClassIdentifier: + exitButton: {fileID: 4107563127601229386} + dateTimeTxt0: {fileID: 6158633726408402869} + dateTimeTxt1: {fileID: 2165109842532351019} + playButton: {fileID: 4427580995337624553} + playButtonImage: {fileID: 1706223257231552631} + playButtonImagePlay: {fileID: 21300000, guid: 12921a2649b18f74696785bfe95b9470, type: 3} + playButtonImagePause: {fileID: 21300000, guid: d7d629e94d507194f90f70f9b86686f2, type: 3} + sliderSpeed: {fileID: 504841312006990894} + opacitySlider: {fileID: 4254908133387884904} + progressBar: {fileID: 1875730371384184921} + canvasGroup: {fileID: 5376035964741484593} + dragger: {fileID: 2595405855187090975} +--- !u!222 &1131523558636582765 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + 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 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8328888389098500807} + 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 &8328888389098500807 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6095878340803605202} + 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: 2543547444167745800} + m_Father: {fileID: 2900006795320450571} + 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: -14} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &6144300122654147269 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7298685830589997354} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7298685830589997354 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6144300122654147269} + 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: 8756137422816002785} + - {fileID: 6767625352919134912} + - {fileID: 2950104462517668944} + - {fileID: 2409061747141505902} + - {fileID: 7096162121856398579} + m_Father: {fileID: 1772582241787108090} + 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: 528, y: 32} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &6254099316578717640 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8565117407018255600} + - component: {fileID: 6242810786154438662} + - component: {fileID: 1771370296227513723} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8565117407018255600 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6254099316578717640} + 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: 450544741838404995} + - {fileID: 2985284779945075815} + m_Father: {fileID: 1772582241787108090} + 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: 528, y: 64} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6242810786154438662 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6254099316578717640} + m_CullTransparentMesh: 1 +--- !u!114 &1771370296227513723 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6254099316578717640} + 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: 12 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &6302513352981628665 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2900006795320450571} + - component: {fileID: 4507967223818189975} + m_Layer: 5 + m_Name: UISlider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2900006795320450571 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6302513352981628665} + 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: 7126104494218375036} + - {fileID: 8328888389098500807} + - {fileID: 9164838024467178797} + m_Father: {fileID: 2120304119556048079} + 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: 40, y: 0} + m_SizeDelta: {x: 100, y: 40} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &4507967223818189975 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6302513352981628665} + 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: 8041663471734333405} + m_FillRect: {fileID: 2543547444167745800} + m_HandleRect: {fileID: 8988622228856496252} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 1 + m_WholeNumbers: 0 + m_Value: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &6740465002727194894 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3093129208473779095} + 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 &3093129208473779095 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6740465002727194894} + 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: 6435190705207939364} + m_Father: {fileID: 2409061747141505902} + 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: -14} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &6793976636585266810 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2120304119556048079} + - component: {fileID: 504841312006990894} + m_Layer: 5 + m_Name: SpeedUISliderWithLabel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2120304119556048079 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6793976636585266810} + 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: 6035001143067260080} + - {fileID: 2900006795320450571} + m_Father: {fileID: 450544741838404995} + 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: 140, y: 32} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &504841312006990894 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6793976636585266810} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c522490ef2b479444a65008dd03a24e9, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &7062229308165016848 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9164838024467178797} + 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 &9164838024467178797 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7062229308165016848} + 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: 8988622228856496252} + m_Father: {fileID: 2900006795320450571} + 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: -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: 14 + m_fontSizeBase: 14 + 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: 1 + m_WholeNumbers: 0 + m_Value: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &8010062772174439758 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7126104494218375036} + - component: {fileID: 473910237943446768} + - component: {fileID: 8518451474798630734} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7126104494218375036 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8010062772174439758} + 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: 2900006795320450571} + 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: -14} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &473910237943446768 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8010062772174439758} + m_CullTransparentMesh: 1 +--- !u!114 &8518451474798630734 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8010062772174439758} + 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 &8418370188768070246 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7096162121856398579} + - component: {fileID: 1814166679161102018} + - component: {fileID: 3277574063331644366} + - component: {fileID: 4107563127601229386} + m_Layer: 5 + m_Name: CloseButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7096162121856398579 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8418370188768070246} + 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: 3853899656668261898} + m_Father: {fileID: 7298685830589997354} + 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: 16} + m_SizeDelta: {x: 32, y: 32} + m_Pivot: {x: 1, y: 1} +--- !u!222 &1814166679161102018 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8418370188768070246} + m_CullTransparentMesh: 1 +--- !u!114 &3277574063331644366 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8418370188768070246} + 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!114 &4107563127601229386 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8418370188768070246} + 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: 3277574063331644366} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &8442963890748925925 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4652755497126993482} + - component: {fileID: 536563329285618565} + - component: {fileID: 2165109842532351019} + m_Layer: 5 + m_Name: dayTxt1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4652755497126993482 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8442963890748925925} + 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: 2985284779945075815} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -82, y: -10} + m_SizeDelta: {x: 52, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &536563329285618565 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8442963890748925925} + m_CullTransparentMesh: 1 +--- !u!114 &2165109842532351019 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8442963890748925925} + 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: 24.11.26 + 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: 4288782753 + m_fontColor: {r: 0.6313726, g: 0.6313726, b: 0.6313726, 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: 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 &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 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 450544741838404995} + m_Layer: 5 + m_Name: group + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &450544741838404995 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9120583007845979077} + 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: 1106793165530546313} + - {fileID: 2120304119556048079} + m_Father: {fileID: 8565117407018255600} + 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: 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 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 7298685830589997354} + m_Modifications: + - target: {fileID: 3526452672395979179, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_Name + value: UIDragger + objectReference: {fileID: 0} + - target: {fileID: 4336813538161482815, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: dragObject + value: + objectReference: {fileID: 1772582241787108090} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_Pivot.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_AnchorMin.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_SizeDelta.x + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_SizeDelta.y + value: 11 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_AnchoredPosition.y + value: -10 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} +--- !u!114 &2595405855187090975 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 4336813538161482815, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + m_PrefabInstance: {fileID: 1741713488949895712} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31446b5c56e405741ac8a38fe5a42443, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!224 &8756137422816002785 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 7039059871646261441, guid: 530e5bfd9a80cce4a99696a1442657e7, type: 3} + m_PrefabInstance: {fileID: 1741713488949895712} + m_PrefabAsset: {fileID: 0} diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/UIPlayback.prefab.meta b/Assets/Resources/Prefabs/UI/Factory/Playback/UIPlayback.prefab.meta new file mode 100644 index 00000000..2d09ecd4 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/UIPlayback.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 200e456b3431bac438319d1b703714d4 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/UIPlaybackListItem.prefab b/Assets/Resources/Prefabs/UI/Factory/Playback/UIPlaybackListItem.prefab new file mode 100644 index 00000000..05667b58 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/UIPlaybackListItem.prefab @@ -0,0 +1,868 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2133175076139784403 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5796655878833709733} + - component: {fileID: 484196154209350674} + - component: {fileID: 7184156021851962383} + m_Layer: 0 + m_Name: selectedImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5796655878833709733 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2133175076139784403} + 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: 2125078545845614351} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0.5, y: 0} + m_SizeDelta: {x: -3, y: -4} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &484196154209350674 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2133175076139784403} + m_CullTransparentMesh: 1 +--- !u!114 &7184156021851962383 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2133175076139784403} + 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: b7d31521a9c251446bd203fe7d09d878, 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 &2916604940895479352 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6418761242116767989} + - component: {fileID: 1193707551150000701} + - component: {fileID: 1024787892698960882} + m_Layer: 0 + m_Name: text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6418761242116767989 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2916604940895479352} + 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: 2125078545845614351} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 8, y: 0} + m_SizeDelta: {x: -38, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1193707551150000701 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2916604940895479352} + m_CullTransparentMesh: 1 +--- !u!114 &1024787892698960882 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2916604940895479352} + 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: 23 ~ 24 Hour + 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: 14 + m_fontSizeBase: 14 + 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: 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 &3935166504402937896 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2886414022211784798} + - component: {fileID: 8522294738835095969} + - component: {fileID: 3454851384508751239} + - component: {fileID: 5323088521370621725} + m_Layer: 0 + m_Name: downloadButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2886414022211784798 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3935166504402937896} + 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: 2125078545845614351} + 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!222 &8522294738835095969 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3935166504402937896} + m_CullTransparentMesh: 1 +--- !u!114 &3454851384508751239 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3935166504402937896} + 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: d04f8d9db8a4a384295fab0e8eb6307b, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &5323088521370621725 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3935166504402937896} + 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: 3454851384508751239} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &5142099578135948653 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5634356056514378184} + - component: {fileID: 1307972099341557597} + - component: {fileID: 113339388759867921} + m_Layer: 0 + m_Name: loadingImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5634356056514378184 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5142099578135948653} + 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: 2125078545845614351} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0.5, y: 0} + m_SizeDelta: {x: -3, y: -4} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1307972099341557597 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5142099578135948653} + m_CullTransparentMesh: 1 +--- !u!114 &113339388759867921 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5142099578135948653} + 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: 0.02064565, b: 0, 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: 21300000, guid: e42c26fe0bafbfc4fb9da2e0fecfdbb7, type: 3} + m_Type: 3 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 0 + m_FillAmount: 0 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5257302254587163552 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4425131499129391613} + - component: {fileID: 6083050972200396223} + - component: {fileID: 5208913841818591071} + - component: {fileID: 677456697784395592} + m_Layer: 0 + m_Name: stopButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4425131499129391613 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5257302254587163552} + 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: 2125078545845614351} + 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!222 &6083050972200396223 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5257302254587163552} + m_CullTransparentMesh: 1 +--- !u!114 &5208913841818591071 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5257302254587163552} + 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: b8f01b5e3ac8c1e4db9758c0f44716c5, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &677456697784395592 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5257302254587163552} + 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: 5208913841818591071} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &5609613257243525174 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2125078545845614351} + - component: {fileID: 1443206361432930337} + - component: {fileID: 2593060779757277299} + - component: {fileID: 6998636532636839170} + m_Layer: 0 + m_Name: UIPlaybackListItem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2125078545845614351 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5609613257243525174} + 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: 5634356056514378184} + - {fileID: 5796655878833709733} + - {fileID: 2886414022211784798} + - {fileID: 4425131499129391613} + - {fileID: 1758947466629551347} + - {fileID: 5052245942240762746} + - {fileID: 6418761242116767989} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 258, y: 32} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1443206361432930337 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5609613257243525174} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e157d53f2eb114b4b94e5b0d1c7eeaa9, type: 3} + m_Name: + m_EditorClassIdentifier: + loadingImage: {fileID: 113339388759867921} + selectedImage: {fileID: 7184156021851962383} + downloadButton: {fileID: 5323088521370621725} + stopButton: {fileID: 677456697784395592} + deleteButton: {fileID: 1593740195264588535} + text: {fileID: 1024787892698960882} + downloadText: {fileID: 1799854006817858880} +--- !u!222 &2593060779757277299 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5609613257243525174} + m_CullTransparentMesh: 1 +--- !u!225 &6998636532636839170 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5609613257243525174} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &7535657093799106716 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1758947466629551347} + - component: {fileID: 547830227119712359} + - component: {fileID: 3801952530268951881} + - component: {fileID: 1593740195264588535} + m_Layer: 0 + m_Name: deleteButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1758947466629551347 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7535657093799106716} + 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: 2125078545845614351} + 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!222 &547830227119712359 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7535657093799106716} + m_CullTransparentMesh: 1 +--- !u!114 &3801952530268951881 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7535657093799106716} + 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: 4018c8210d6abd748af6f6c0a9471e7b, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1593740195264588535 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7535657093799106716} + 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: 3801952530268951881} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &7702447792393672735 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5052245942240762746} + - component: {fileID: 8050799054193385437} + - component: {fileID: 1799854006817858880} + m_Layer: 0 + m_Name: downloadText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5052245942240762746 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7702447792393672735} + 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: 2125078545845614351} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 95, y: -1} + m_SizeDelta: {x: -125, y: -2} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &8050799054193385437 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7702447792393672735} + m_CullTransparentMesh: 1 +--- !u!114 &1799854006817858880 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7702447792393672735} + 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: 00MB/22MB(0%) + 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: 10 + m_fontSizeBase: 10 + 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: 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} diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/UIPlaybackListItem.prefab.meta b/Assets/Resources/Prefabs/UI/Factory/Playback/UIPlaybackListItem.prefab.meta new file mode 100644 index 00000000..e3142304 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/UIPlaybackListItem.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5a2ac474d7140274ebf6828a73a32986 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/UIPlaybackListModal.prefab b/Assets/Resources/Prefabs/UI/Factory/Playback/UIPlaybackListModal.prefab new file mode 100644 index 00000000..8014e06f --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/UIPlaybackListModal.prefab @@ -0,0 +1,2271 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &8271295099630325 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5274820413013076108} + - component: {fileID: 71019378058243087} + - component: {fileID: 6293977600022133480} + - component: {fileID: 2555393470515011687} + m_Layer: 5 + m_Name: OkButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5274820413013076108 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8271295099630325} + 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: 7953172251271919858} + m_Father: {fileID: 1082724633838762814} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 152, y: 0} + m_SizeDelta: {x: 84, y: 40} + m_Pivot: {x: 0, y: 1} +--- !u!222 &71019378058243087 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8271295099630325} + m_CullTransparentMesh: 1 +--- !u!114 &6293977600022133480 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8271295099630325} + 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.003921569, g: 0.003921569, b: 0.18039216, 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: -27720893, 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!114 &2555393470515011687 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8271295099630325} + 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: 6293977600022133480} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &282683695465345288 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9130455285853129916} + - component: {fileID: 1984237252251090665} + - component: {fileID: 8037343060965328358} + - component: {fileID: 8614222555048679271} + m_Layer: 5 + m_Name: UIPlaybackListModal + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &9130455285853129916 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 282683695465345288} + 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: 4775004486978012513} + - {fileID: 8649318704463539378} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1984237252251090665 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 282683695465345288} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f7fd94cb2e9eab84ea0e85244ba1a656, type: 3} + m_Name: + m_EditorClassIdentifier: + titleText: {fileID: 1116904848063546824} + messageText: {fileID: 0} + confirmButton: {fileID: 2555393470515011687} + confirmButtonText: {fileID: 6298128242398714290} + cancelButton: {fileID: 0} + cancelButtonText: {fileID: 0} + closeButton: {fileID: 4184386084218879623} + dropdownDate: {fileID: 0} + scrollRectTime: {fileID: 0} +--- !u!225 &8037343060965328358 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 282683695465345288} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &8614222555048679271 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 282683695465345288} + 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: 4 + m_Spacing: 20 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &306294687991465702 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7643311920924236421} + - component: {fileID: 3890474839808176320} + - component: {fileID: 334946957206596824} + - component: {fileID: 8124101808023108973} + - component: {fileID: 1884351836193933140} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7643311920924236421 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 306294687991465702} + 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: 4833613228960064740} + - {fileID: 4604758579776314759} + m_Father: {fileID: 8649318704463539378} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 16, y: -64} + m_SizeDelta: {x: 268, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &3890474839808176320 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 306294687991465702} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f7fd94cb2e9eab84ea0e85244ba1a656, type: 3} + m_Name: + m_EditorClassIdentifier: + titleText: {fileID: 1116904848063546824} + messageText: {fileID: 0} + confirmButton: {fileID: 2555393470515011687} + confirmButtonText: {fileID: 6298128242398714290} + cancelButton: {fileID: 0} + cancelButtonText: {fileID: 0} + closeButton: {fileID: 4184386084218879623} + dropdownDate: {fileID: 1882359293426650121} + scrollRectTime: {fileID: 3875984881599523570} +--- !u!114 &334946957206596824 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 306294687991465702} + 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: 4 + m_Spacing: 10 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &8124101808023108973 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 306294687991465702} + 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!225 &1884351836193933140 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 306294687991465702} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &769115365910150953 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7252643290017956772} + - component: {fileID: 104579237844294259} + - component: {fileID: 1361363879683527143} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7252643290017956772 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 769115365910150953} + 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: 7351639660705231236} + 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.5, y: 0.5} +--- !u!222 &104579237844294259 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 769115365910150953} + m_CullTransparentMesh: 1 +--- !u!114 &1361363879683527143 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 769115365910150953} + 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 &1564500901850813411 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7953172251271919858} + - component: {fileID: 9139508871644876119} + - component: {fileID: 6298128242398714290} + 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 &7953172251271919858 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1564500901850813411} + 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: 5274820413013076108} + 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 &9139508871644876119 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1564500901850813411} + m_CullTransparentMesh: 1 +--- !u!114 &6298128242398714290 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1564500901850813411} + 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: Play + 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: 16 + m_fontSizeBase: 16 + 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!1 &4140454597156883553 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7351639660705231236} + 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 &7351639660705231236 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4140454597156883553} + 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: 7252643290017956772} + m_Father: {fileID: 8956676045254328225} + 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!1 &4850619896182892376 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1874065235486541238} + - component: {fileID: 4785110137114315235} + - component: {fileID: 1116904848063546824} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1874065235486541238 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4850619896182892376} + 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: 6689613555123435939} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 16, y: 0} + m_SizeDelta: {x: -66, y: 30} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &4785110137114315235 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4850619896182892376} + m_CullTransparentMesh: 1 +--- !u!114 &1116904848063546824 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4850619896182892376} + 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: Playback List + 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: 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: 20 + m_fontSizeBase: 20 + 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: 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 &4967277458558437785 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6335727954844453757} + - component: {fileID: 22833910440520768} + - component: {fileID: 3407312157212708141} + 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 &6335727954844453757 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967277458558437785} + 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: 1495334635677803767} + 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 &22833910440520768 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967277458558437785} + m_CullTransparentMesh: 1 +--- !u!114 &3407312157212708141 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967277458558437785} + 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: 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 &4998972642387120996 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7068376860411482407} + - component: {fileID: 4996228150515579573} + - component: {fileID: 9032374166154867991} + - component: {fileID: 2335409936895873116} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7068376860411482407 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4998972642387120996} + 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: 8649318704463539378} + 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 &4996228150515579573 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4998972642387120996} + m_CullTransparentMesh: 0 +--- !u!114 &9032374166154867991 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4998972642387120996} + 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: 52234b789dc53b34ebb1178caac4e374, 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: 6 +--- !u!114 &2335409936895873116 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4998972642387120996} + 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 &5150421316720484168 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1082724633838762814} + - component: {fileID: 7867860708325265489} + m_Layer: 5 + m_Name: Buttons + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1082724633838762814 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5150421316720484168} + 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: 5274820413013076108} + m_Father: {fileID: 8649318704463539378} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -16, y: 20} + m_SizeDelta: {x: 236, y: 40} + m_Pivot: {x: 1, y: 0} +--- !u!114 &7867860708325265489 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5150421316720484168} + 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: 8 + m_Spacing: 8 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &5432186017767331042 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4524542058509615081} + - component: {fileID: 7743087057397091247} + - component: {fileID: 2056923290176742490} + - component: {fileID: 6146012831739491950} + m_Layer: 5 + m_Name: Shadow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4524542058509615081 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5432186017767331042} + 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: 8649318704463539378} + 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: 24, y: 24} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7743087057397091247 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5432186017767331042} + m_CullTransparentMesh: 0 +--- !u!114 &2056923290176742490 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5432186017767331042} + 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, b: 0, a: 0.39215687} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: cb736801828cba84e9b9a60f2bd51203, 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: 5 +--- !u!114 &6146012831739491950 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5432186017767331042} + 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 &5533827678751420015 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4000252192478309780} + - component: {fileID: 7823338378280951717} + - component: {fileID: 772078486248635525} + - component: {fileID: 2007040679896118516} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4000252192478309780 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5533827678751420015} + 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: 6134469891104677209} + m_Father: {fileID: 4604758579776314759} + 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!222 &7823338378280951717 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5533827678751420015} + m_CullTransparentMesh: 1 +--- !u!114 &772078486248635525 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5533827678751420015} + 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!114 &2007040679896118516 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5533827678751420015} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!1 &5590754167853597384 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7543997316271611535} + - component: {fileID: 2449351397303790187} + - component: {fileID: 4287080673333616174} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7543997316271611535 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5590754167853597384} + 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: 2442082208715277292} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: -533.5, y: 90} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2449351397303790187 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5590754167853597384} + m_CullTransparentMesh: 1 +--- !u!114 &4287080673333616174 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5590754167853597384} + 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 &6776819266274870767 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8956676045254328225} + - component: {fileID: 2583105220554999850} + - component: {fileID: 4070350914042328398} + - component: {fileID: 6763137842127544193} + 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 &8956676045254328225 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6776819266274870767} + 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: 7351639660705231236} + m_Father: {fileID: 4604758579776314759} + 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: 10, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!222 &2583105220554999850 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6776819266274870767} + m_CullTransparentMesh: 1 +--- !u!114 &4070350914042328398 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6776819266274870767} + 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.5019608} + 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!114 &6763137842127544193 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6776819266274870767} + 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: 1361363879683527143} + m_HandleRect: {fileID: 7252643290017956772} + m_Direction: 2 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &6846795476721163339 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1495334635677803767} + - component: {fileID: 5311515974998299610} + - component: {fileID: 3176164110195810037} + - component: {fileID: 4184386084218879623} + m_Layer: 5 + m_Name: ButtonClose + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1495334635677803767 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6846795476721163339} + 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: 6335727954844453757} + m_Father: {fileID: 6689613555123435939} + 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: -5, y: 0} + m_SizeDelta: {x: 32, y: 32} + m_Pivot: {x: 1, y: 0.5} +--- !u!222 &5311515974998299610 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6846795476721163339} + m_CullTransparentMesh: 1 +--- !u!114 &3176164110195810037 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6846795476721163339} + 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!114 &4184386084218879623 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6846795476721163339} + 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: 3176164110195810037} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &7397462968240549551 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 643012246793699626} + - component: {fileID: 7084579824308699619} + - component: {fileID: 7590557871061163067} + - component: {fileID: 2793131049927913990} + 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 &643012246793699626 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7397462968240549551} + 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: 2442082208715277292} + m_Father: {fileID: 4604758579776314759} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -7, y: 10} + m_Pivot: {x: 0, y: 0} +--- !u!222 &7084579824308699619 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7397462968240549551} + m_CullTransparentMesh: 1 +--- !u!114 &7590557871061163067 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7397462968240549551} + 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!114 &2793131049927913990 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7397462968240549551} + 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: 4287080673333616174} + m_HandleRect: {fileID: 7543997316271611535} + m_Direction: 0 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &7725551093215056958 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6134469891104677209} + - component: {fileID: 554247523126262517} + - component: {fileID: 5215301528173793054} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6134469891104677209 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7725551093215056958} + 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: 4000252192478309780} + 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 &554247523126262517 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7725551093215056958} + 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: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &5215301528173793054 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7725551093215056958} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 1 +--- !u!1 &8267305486951944470 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4775004486978012513} + - component: {fileID: 1143870432340084949} + - component: {fileID: 7447264326150876533} + - component: {fileID: 8486878369224408612} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4775004486978012513 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8267305486951944470} + 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: 10} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 9130455285853129916} + 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 &1143870432340084949 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8267305486951944470} + m_CullTransparentMesh: 0 +--- !u!114 &7447264326150876533 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8267305486951944470} + 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, b: 0, a: 0.69803923} + 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 &8486878369224408612 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8267305486951944470} + 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 &8762871326535246216 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8649318704463539378} + - component: {fileID: 487824784350913023} + - component: {fileID: 4253245539634921190} + - component: {fileID: 3625206439853182051} + m_Layer: 5 + m_Name: Modal + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8649318704463539378 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8762871326535246216} + 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: 4524542058509615081} + - {fileID: 7068376860411482407} + - {fileID: 6689613555123435939} + - {fileID: 7643311920924236421} + - {fileID: 1082724633838762814} + m_Father: {fileID: 9130455285853129916} + 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: 300, y: 440} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &487824784350913023 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8762871326535246216} + m_CullTransparentMesh: 0 +--- !u!114 &4253245539634921190 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8762871326535246216} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 32 + m_Right: 32 + m_Top: 32 + m_Bottom: 24 + m_ChildAlignment: 0 + m_Spacing: 10 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &3625206439853182051 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8762871326535246216} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &8878430131355867891 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2442082208715277292} + 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 &2442082208715277292 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8878430131355867891} + 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: 7543997316271611535} + m_Father: {fileID: 643012246793699626} + 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 &8931961311307287257 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6689613555123435939} + - component: {fileID: 797248495370781757} + - component: {fileID: 184688169156650209} + m_Layer: 5 + m_Name: Title Bar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6689613555123435939 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8931961311307287257} + 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: 1874065235486541238} + - {fileID: 1495334635677803767} + m_Father: {fileID: 8649318704463539378} + 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: 48} + m_Pivot: {x: 0.5, y: 1} +--- !u!222 &797248495370781757 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8931961311307287257} + m_CullTransparentMesh: 1 +--- !u!114 &184688169156650209 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8931961311307287257} + 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.011764706, b: 0.1764706, 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 &9176468621117447830 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4604758579776314759} + - component: {fileID: 5404198649624180781} + - component: {fileID: 144423319818731036} + - component: {fileID: 3875984881599523570} + m_Layer: 5 + m_Name: Scroll View + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4604758579776314759 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9176468621117447830} + 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: 4000252192478309780} + - {fileID: 643012246793699626} + - {fileID: 8956676045254328225} + m_Father: {fileID: 7643311920924236421} + 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: 260} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5404198649624180781 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9176468621117447830} + m_CullTransparentMesh: 1 +--- !u!114 &144423319818731036 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9176468621117447830} + 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.11764706, g: 0.20392157, b: 0.4, 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: 21300000, guid: 96604656ca6224348929ee3d5a225403, 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!114 &3875984881599523570 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9176468621117447830} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 6134469891104677209} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 1 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 32 + m_Viewport: {fileID: 4000252192478309780} + m_HorizontalScrollbar: {fileID: 2793131049927913990} + m_VerticalScrollbar: {fileID: 6763137842127544193} + m_HorizontalScrollbarVisibility: 2 + m_VerticalScrollbarVisibility: 1 + m_HorizontalScrollbarSpacing: -3 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!1001 &4403681567564149595 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 7643311920924236421} + m_Modifications: + - target: {fileID: 425355307982283010, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_Name + value: UIDropdownDate + objectReference: {fileID: 0} + - target: {fileID: 4306098995628391313, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4306098995628391313, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4306098995628391313, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_SizeDelta.x + value: -5 + objectReference: {fileID: 0} + - target: {fileID: 6676577973829957464, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6676577973829957464, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8646133066887709434, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_Pivot.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_SizeDelta.y + value: 40 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} +--- !u!114 &1882359293426650121 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 2810948481382973266, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + m_PrefabInstance: {fileID: 4403681567564149595} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!224 &4833613228960064740 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 9081918296522201023, guid: 9d27b83545b00b6409d27c5becea5c87, type: 3} + m_PrefabInstance: {fileID: 4403681567564149595} + m_PrefabAsset: {fileID: 0} diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/UIPlaybackListModal.prefab.meta b/Assets/Resources/Prefabs/UI/Factory/Playback/UIPlaybackListModal.prefab.meta new file mode 100644 index 00000000..098d28eb --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/UIPlaybackListModal.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4ff2a62beb448fb47835f26249ea2b83 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images.meta b/Assets/Resources/Prefabs/UI/Factory/Playback/images.meta new file mode 100644 index 00000000..6970f2bd --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/images.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0b3746cd8e054ae48ba586368ee6fcd2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_bottom.png b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..96ba0d1a16437ca5b78ef90d94d1a30d6c058a22 GIT binary patch literal 1735 zcmbVNUx?g97>~4W_3Y6W6+~2q92Q$I$z+nvZic4ix_j*{nCta!p(iNqY%1BcoXaTaI_YP9Z$mU!cLpv(b zhCj6&)4Ap8sx#L zv|25>rO7O=E2?Rl3PcJ*5=Tf$Crn9O3X`z`LzyN{>_@53LXa_%8e2>)k$c(;A&7>w zVbYh03#PP5q^L5?Lh1rtXNZdy<7U^m>nOBI0~)3Y$ErhY)LrBs%m20#H#i(G%uiRa5=2$iz^H&V z^$sX68JDEwzF^nE9*YCQ1NH+_r%DvoMKF{Rmspd<+%We}+dN+>m1bh*`Axo%%pN@q zDw8EcH4Q^Tvf6dmws9p)QW83}Qno}cj_ms`F4j;{HFYB8b?8YoRW~G3GYgWgs#>Au znK~r-!TvIH7PAr3G)P#dyr(K+7L1a0pI%aw z|K_W^wy9GM;Jp21!(rd$AH&W~Lrxv@zD!Q__kkNFt+X69p2unKTz+T3*W4N{MOo;FLoHUBlhftT51%^oFNV-2)Bpeg literal 0 HcmV?d00001 diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_bottom.png.meta b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_bottom.png.meta new file mode 100644 index 00000000..c6e79427 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_bottom.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: b433290e6b9d4d441b69c0e11fbb48a7 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 4, y: 4, z: 4, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 1537655665 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_middle.png b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_middle.png new file mode 100644 index 0000000000000000000000000000000000000000..6bc5382e9658d728e6277ac3c2e831d7924bbcc7 GIT binary patch literal 1634 zcmbVNO^@6(7!Kt_P}&n5s-E0bNL0nK^Rbz+)ljxG+wMqYS$3z|g%ghBnTd81huFI_ zv*N_9Nc7ZRD#RIa;15()e*u32BqYRv16+}C<|Ep|_Cp;h6DNM&=Y8G}zqzx$b?f}u zi)Ss%I^Wyu?wI?#_4Vc%^MB@#Z$3A-x5~}Wlx4mBPJO*%J^1c|Wxf7u*5B9r@yC?Q z++nFqgfq=cgSM<|*QX`p2SS5H46`D#|9tq^23Z=}duuU{%Z?ajo5z*dJ>Kf`;{#4o z`}&9A+LRiCTxbTS`M6MY8rgGRYS#5@WP>?GA4K+g?GWt8+n^&W0YV2uj7$LS8nsg<7V`Bn(YiiChQQAfdzn2xMoTw`&3`Cb{5!t3{ z0mNf8OKJQfAW2=)7h@%ARC(vwR7tR=xuaDmxLko9Ct1^j%lw@niX91 zx{+;?<78P%MTiGU8u+l4xB`YEz>u(n!?ev?*l!CT`)p<3mHe=7ft7t~?AO91@O&OZ zmjna~5qK~$Rxk|LNaBY9Nt5=<{*x**N05zQnx{UPb??y4Oqr_AmPcn-e7RhWGca!# z%6NSYBAeIs7pc8`ot=__7mHv)I~fT>`i#Co5fXzvOm;ORwoEzi^}}X*3O|IY!f#J!{J}*2E}g9Kc*r>U+zcfWI9~n<-NT3 zd7tm^Z^kqI>)YFIYaMm z+Frv=*kNo%b6Ac6fk`!>p@%qU#4Xi?8#)V1(1Nz_VJsJ7ogw5SZwUPhb$EP*0PI>- z4P{(a7t0Docz$XWo6&H{RncCq>OeLNJv8F#Fg1$R><+APq=XAKAGtY%O3grJnkth# z&j9kijizm&vUmTY3oxnqP^NIyqBMxpyqM!eDJn`_GR#7CF;t`hpW_6H zkKq7c0mUg}Xuft$u%Sx@P*JCkS z1BFOL7b7Bwhxe069|=;RdEfY-_aAdjT!LEZx_N@a401Ul% zcDAUvn{eDQf@RpM@JHC}pp846i(A<@qkRas!C#bQZ!SKu@by9U$isK+xOndT&Fy!K zJCjS_-nHVxeZKPQuH7rMpB!B_^=98!UB>okdgbS5=iYelnZNe$>wV#dGuC9wvtwIZ zcOQRWS%A}>Cs(|CVD;SD)43OqU3T9(kr&M5_vd2uVhcD$9Qx_l?5|shch1w7=ZU-K zmi*3UwnaXj9X|Te)RGdrqj>Oe#d-9(iAx_$ZhdL`_Ak!)`KJ!7y7h^fmrpC3>CU-@ s&B8d9Z%uut?d{$^jpqOO;fVWNYv0F@&!^y)ZNWc4N%bdZ);;DQ2+n{ literal 0 HcmV?d00001 diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_one.png.meta b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_one.png.meta new file mode 100644 index 00000000..e8a85821 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_one.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: c72a6eec7f9887848aa5830772d552db +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 4, y: 4, z: 4, w: 4} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 1537655665 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_top.png b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_top.png new file mode 100644 index 0000000000000000000000000000000000000000..bfc381011b29dafedd9d6e85c01afa85e951eaeb GIT binary patch literal 1558 zcmbVMU1;4@98brzvr-1m$xu2%T8Cpxa&mf`dvjdex|?>5n69*UwiN_(laqTxlbo33 z?%rP6kP42f1yMoJy(qIU;_yDK4^tS-J;?AA=A+=m7j;7s6a^7a?nmfkI$Yr7eErVv z|NUQ`nLaW&aQ^_qFoXJ(HcRJw)3NPN`d?ce8l=-*;nZTxFn8}rM<4UX>0JzS$9-;T zAz3gULl*G`(JC&;@Nr*(TUat%F zQGrAiQBo8|1W<&KrwBe?4idA$2k~%^LBp{XxnbgxfK3_AGN~mhM>Xx3;D;G)5O>`~ z9VRx+P?Q9an$!l`R)z~}k=GV(TO#(bkAozpSSiDXRg#dnO8$j9yS_mHb**7!GH$Ai z?`I<7Wa2nAqwA2HqT|wXh{ahPlUiiqiQ`nw;nbQC6(ejWBq|Z&^#V21Q<;TO0PI8a zZeWvoym!+BteFW`IU2Pb4+=a~N|J(d3X(?m0R;ijff~eio#o9?g$J-C$q44rSndWW zO&Qxv%v*wO3pph6O=_^~n-wgEL4{*8H=-i(NJIrw?M64B>&4$+n7xCm40 zlqE%$c_>J2bqxdQL7bR@g>_BksB;9@wb59i4Dyf~nTHnUp`DX?#VVJ1t6)P%f|3no z*n6)LtCprf@4fv$-ye-!T7sr`+dOGurn!Tr+?Ymnxm!AO`04J-bJ=#fAk#|AK;^77 z{@CWa$L?)=phH`)VoLfSdC`Hz#7XLAgvTq?Ter+Rkt#2y1>3Ph{HKZSyG_O2gVTc2|$m1_P`zF}3 zuduT7o#Ah`1>X+HdoF#vdd~yjo%GgP<2&AcroZvaiM~UxIA4CG@7{Xp$y0AthOSMX zU%bBYWAWuPi&tK__Tn7=Y-3Vunvd>XcRt}xA1i*nzyG~gKW)9g{^6Aqr}|j#wT;Oo z|KcAb^Ft$F{rcC=-=1&@)7lcM_ZvTDj+gDM|JX(4%?cDmr Lw08FJQ!9T1{v-6c literal 0 HcmV?d00001 diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_top.png.meta b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_top.png.meta new file mode 100644 index 00000000..18f2a7ab --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIDropdown_menu_top.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: a8021fa275e23ce479f1e85f35cdb52d +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 4, y: 0, z: 4, w: 4} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 1537655665 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_deleteButton.png b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_deleteButton.png new file mode 100644 index 0000000000000000000000000000000000000000..dead080ca68dee0c40ae2f11196bd22afde37f57 GIT binary patch literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{!336$B+ufw^QHqHW>&UU4M+xib;7xV^4$f zjz(#Vrk)3EI~sw+CdRyg_h(FZx||3sIx+p{~x{4GNqt)VZ*~~avwKNPM+Y=wNc!y z+^|kM@;6(nW%S*`=<^ZP5594VJ-B98qa3SoQu*_|=N)W1g3p3^G?#hqcU@=Z<&^Ga hKD%n$OrK+O_{CdZMy@ax4Fh_b!PC{xWt~$(69C~JgsT7m literal 0 HcmV?d00001 diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_deleteButton.png.meta b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_deleteButton.png.meta new file mode 100644 index 00000000..c01a912a --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_deleteButton.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 4018c8210d6abd748af6f6c0a9471e7b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_downloadButton.png b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_downloadButton.png new file mode 100644 index 0000000000000000000000000000000000000000..7159fdc43b44298a323925d297a1642e7ac2e23a GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{wz-y$B+ufx0haXwipPoJUCg%8sTJR>Aj&j z`y`*vK_MUZZ3&!Z8~hX&>_2muz2o=6hPDSAHZ=sjy6Und@t?+rgND4piw|6UloTa% zGwx*~&`em*~;Oohi`)}`_ zyesBkIM*fD_s?@mWoIWnK5j85;LQZ{jm}FVG{4qx_lHJn9>`_P0=kmH)78&qol`;+ E0MK4ysQ>@~ literal 0 HcmV?d00001 diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_downloadButton.png.meta b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_downloadButton.png.meta new file mode 100644 index 00000000..2c05b943 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_downloadButton.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: d04f8d9db8a4a384295fab0e8eb6307b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_loadingImage.png b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_loadingImage.png new file mode 100644 index 0000000000000000000000000000000000000000..d76ef1fe606a29a1c7bd6ca8023fb077957cb786 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0y~yU}OTa6*$;{VM%xNb!1@J*w6hZkrl|_ASVA^ZQ!+d8c_Geh+lAm zE=zX9r8JIvj9R;;9b0eJDX%y^$7SC99O07=yv7XY&!|4R*r2~DLRGk6b)6m19}J$Z KelF{r5}E+M@mKHw literal 0 HcmV?d00001 diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_loadingImage.png.meta b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_loadingImage.png.meta new file mode 100644 index 00000000..5d1f0788 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_loadingImage.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: e42c26fe0bafbfc4fb9da2e0fecfdbb7 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_selectedImage.png b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_selectedImage.png new file mode 100644 index 0000000000000000000000000000000000000000..47d6c64633db887ea025f5cfd58ff7d438ede2b7 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG zRu)hn4`CU|Zm zzxoZ&UH|{MJLpf0XXNSHq|U>~s^P%M70|#WvVZ}^6y4#@J6Ws1^X~GQDHG-1TJ-ik nF8OgTe~DWM4fwarhD literal 0 HcmV?d00001 diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_selectedImage.png.meta b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_selectedImage.png.meta new file mode 100644 index 00000000..4a332ca2 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_selectedImage.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: b7d31521a9c251446bd203fe7d09d878 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 4, y: 4, z: 4, w: 4} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 1537655665 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_stopButton.png b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_stopButton.png new file mode 100644 index 0000000000000000000000000000000000000000..3ec5e1ba79e1af9db093739f18ad24dd73ade227 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBez~WMV@L(#+bOp>8w_|{n}thQ+zXWN9>`lE z{X(rzV10n&lCRFQem#)e5#K1|;pD=h_+DDQ literal 0 HcmV?d00001 diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_stopButton.png.meta b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_stopButton.png.meta new file mode 100644 index 00000000..8e0d4b96 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListItem_stopButton.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: b8f01b5e3ac8c1e4db9758c0f44716c5 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListModal_arrow.png b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListModal_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..292ebd7dd881a945300f987669d8bb1b278667d8 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBzLTemV@L(#+rERG3<^BV-NHL7-HWDlJaAU& zcd7ZdVEz_MslY$14)KrQNbmGkyBXQ`TM2K{58Qlk#oTtF OX$+pOelF{r5}E)Ot}~_p literal 0 HcmV?d00001 diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListModal_arrow.png.meta b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListModal_arrow.png.meta new file mode 100644 index 00000000..0bfefb01 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlaybackListModal_arrow.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 53cb7a6d381e31e4fb3ab38f05378abe +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlayback_pause.png b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlayback_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a20eb3a5f8726d01d5eba5d2d4d7a5b1a06eb5 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG zkHm9+IDVT%Av^cZr{<3&rP=VPc!`=6#37iL6y7rX}OrdgO^Ji9+qD- zl4R9zVB`vDU3YVrH^;RfZIb6wFVdQ I&MBb@0LY+74k$6QK4>Xr z;B#Q&(`sD6!0Dl(!N7hv+v!m2vbW##75`2;DfjI|+I=Cf3|QUT0&=S@=fT0DPZP5{^8mrDCv3wu)f=UDWf+{U}?;yxvRB z^b={ZjEDny4;tNA{U(V970jBQ(kmlzT<*N}6A{B0?`J1;6E>XO_U;5z*={daiRbK literal 0 HcmV?d00001 diff --git a/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlayback_play.png.meta b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlayback_play.png.meta new file mode 100644 index 00000000..7f96d985 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Factory/Playback/images/UIPlayback_play.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 12921a2649b18f74696785bfe95b9470 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/Loading.meta b/Assets/Resources/Prefabs/UI/Loading.meta new file mode 100644 index 00000000..ddd2a093 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/Loading.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bcd5ac696b93f8b4f924c828674427be +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/Loading/UILoading.png b/Assets/Resources/Prefabs/UI/Loading/UILoading.png new file mode 100644 index 0000000000000000000000000000000000000000..fe847afcc682c7c9eacd8dc855631b6c83b2ed34 GIT binary patch literal 1974 zcmV;n2TAyeP)Px+a7jc#RCr$PosD%IH4w+84sZvg0&oSy6@V*9TmeZ1Bo*LPfKvfZ1%wK4D!?7! z4u<=mrF&X=X7sVzy}gt4UY-r!59z1T%t)HmShKN0MBf=>zBk7FXpH&67=!=D@A&Ee zg|&V%#^B#$@bho{Zms>gvE~_j>TKv9BSp~S0=HGS=Y^^R@LAqND z{Gz~#2*&S^nV`KfgdRqTr4jG&#?%|v+KyNp{35^u)d8t4DPG3{EXeksUO1sr@BZNSedw@$wojWp@OO@KRH{a1$cpwei-rzM7K z4n2R3t25lv9I1!2U$yXNW&=27Y_0bHplC1J8inL?UY7&AEq&036^oqhAfZ3U~(WlaOk~ zumbj<&ZU$ttAbt(JOeiT*Y|UzY%BK?5hPtxAH~p%fM>vdXRZCT6<{su(HeR-aOaI+ zm`UYr>q$ZjU@e~E^g28-sa)rJFIm8y>-3M}`kgK8z>9$~m7v2xxXkgylEB>z60jw! zefF?3p~LM3bah6W0~|9$Ooh3EwFWHobW?~3>-oP64Nf`?D)5Bv>JD}w=>QJ!T)`56 zxR)vdPpFayYwcw>V$C#^h_H6VZK$ZKMFTEP+nX)qoN|XH90_ssv%uZM{uO|9V`UgD6x?J!KuTTf0trB_iDuhmvqliC;6=RS1Q80 zU%K_cxs|V>P6}cB%ZZ3n&-+P`2Tshh5%+gp`OdCyBO=KGxv)cjx0j8bgky&cJ7saX z1aQO#a=Y=b*N$v$-}K`=(M9OOTZzjJfJ+8*vIcORs-Nat-K-OOJTA8Y4(W!JPyEJk zI(nMTK5ngvh+8JP18~kmVHeMj+l144yD$NI0C27+hKDkx?OKU0v_yE2Tft4StN%%0D3v`CyrRpIO}?Oeptm zA-6-(eX!;%+Ry9a{De|;(8t!=Eat-e=6)<*&BDsxoLan+zFisHYn7d`Qzt*U(}vnZiXxg~G2`yR?_o5+(8t;%Mq9;JbRf$xo(U0B zqGl)anHab<2^vza08bnvIQd+M`)pA9hI~l506kZ_aXSZGGM?Fou=J$BOFtx*KK+)Y zd_-hL(xiAM>{?XK;Re~~JDt0v@77Fklq$~9}guP(MYTW@fPRb<%ia&Qd15KP|h;w!&HIq&&qXg^&`g?0F_i4r1s_z7B9MdhG zg|%mrbE+FAL*p2|XT7Z%$u`I6In@FK(fdJ>8tiOGA}QfsH*|g!ss2dKpI_{37?8#XL%_~rBa8P z12!rp`lMS_Cz(k^s$kCoo+;_LZ1HqkEjlh!s;ksUSidTj5+ZcPf{(@F0bNjr3VPP#44(ZEnfCxqF(!|VOQ zmOgoDZdyt1or@=YT13L*mN=JdF8CJSpY#l$8@Z|a;9j;0@W`9-xsm5cVhi{fF))aW zWQLV0xGHeQe@8C+8Xa2;+@}DBTe`S3A6>#FO75UD!1sBKYk^9788+YxY(c3JZdnmL z>u3_LHNf4aTa()7Bet#3xhBt!>l*8o|0J>k`SPAFjv*C{Z%=JxWMJT7GNC eM)!=3!mOFISOi|l<>msFGI+ZBxvX``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{$@`X$B+ufx7WP64jb^e25!}Ub#9jI7VG-n zmAp-Vlp{Yqh~-ET`spB)EO<;JSx1Fo{m)-r8!L~6q;-~;8t9z(lr#6^M7gO4%O~C~ z%vyN*gu$Gs4<<%3%f;+mmOT_n5T4l=Jb|@HBF0;}{qRqnSst{@O1TaS?83{1OUXqYcl`< literal 0 HcmV?d00001 diff --git a/Assets/Resources/Prefabs/UI/images/Image_Cancel.png.meta b/Assets/Resources/Prefabs/UI/images/Image_Cancel.png.meta new file mode 100644 index 00000000..9276dbeb --- /dev/null +++ b/Assets/Resources/Prefabs/UI/images/Image_Cancel.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: a458a60f90f95e74292928ca17721b8f +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/images/Image_dragger_h.png b/Assets/Resources/Prefabs/UI/images/Image_dragger_h.png new file mode 100644 index 0000000000000000000000000000000000000000..00371d61e84f9cbfa2169fd94bd63854de586049 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^xu+?AZRdyiG)8<^$GC z@##B%p4uASmQ}p}%leuV8C@4e7Hhf%_bij}HJnw%u>7%v%xSfaCxB)!c)I$ztaD0e F0sxh%GZp{< literal 0 HcmV?d00001 diff --git a/Assets/Resources/Prefabs/UI/images/Image_dragger_h.png.meta b/Assets/Resources/Prefabs/UI/images/Image_dragger_h.png.meta new file mode 100644 index 00000000..f2802ca3 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/images/Image_dragger_h.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 342176064d9f8604e8a752c0cecf4183 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/images/Image_dragger_v.png b/Assets/Resources/Prefabs/UI/images/Image_dragger_v.png new file mode 100644 index 0000000000000000000000000000000000000000..c844599e37dbb093f55494be20824f28e68f87c7 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<8!3HFAye+l^Db50q$YP+FHwZH>wVk#SD9BhG zU%HZkh=d#Wzp$Py_IVlDJ literal 0 HcmV?d00001 diff --git a/Assets/Resources/Prefabs/UI/images/Image_dragger_v.png.meta b/Assets/Resources/Prefabs/UI/images/Image_dragger_v.png.meta new file mode 100644 index 00000000..553c7270 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/images/Image_dragger_v.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 6360f4fc98f4ac2438593da79131077a +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/images/circle_fill_10_shadow.png.meta b/Assets/Resources/Prefabs/UI/images/circle_fill_10_shadow.png.meta index 67fdba66..43a38c87 100644 --- a/Assets/Resources/Prefabs/UI/images/circle_fill_10_shadow.png.meta +++ b/Assets/Resources/Prefabs/UI/images/circle_fill_10_shadow.png.meta @@ -49,7 +49,7 @@ TextureImporter: alignment: 0 spritePivot: {x: 0.5, y: 0.5} spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteBorder: {x: 6, y: 10, z: 10, w: 6} spriteGenerateFallbackPhysicsShape: 1 alphaUsage: 1 alphaIsTransparency: 1 @@ -127,7 +127,7 @@ TextureImporter: physicsShape: [] bones: [] spriteID: 5e97eb03825dee720800000000000000 - internalID: 0 + internalID: 1537655665 vertices: [] indices: edges: [] diff --git a/Assets/Resources/Prefabs/UI/images/image_panel_shadow.png b/Assets/Resources/Prefabs/UI/images/image_panel_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..69a26c160278caa3e2b2f804faaeec8f758d8de6 GIT binary patch literal 2085 zcmaJ?c~ld39*+y?3gNKIeT7gttjUCcNeD!ag!@vY0^;stNQMwXG9ejEIO?O+a#T){ zKygJ~DcAxkqTqp`A_zs$ik6#lh>L(A0j+>6J6N&%$FlR@%_UNO4pBW@wc0XPzof?^2c!hs_ooR-jd&c7!@vjc@gw<( zm{1hYGeHa;NbnD0C-B+!9K6$BoTH463J4$s#K{CPLJ3{Qz<( zA4!Gy?ZYu)F@&QKNdz{DM8;9=i8d5FI~r{_j!Ytx01_3jArZ)AI*CHxV~hLv;L&Je zP9!~$<^C}idSc+C5JW@=0I5_;l-d$uF&D70x3>pKWPnU2pa_B_UWkA)f>2_nm8gvdIV^Cy?KA$QFS0udUS1&Mh_Adb5j7T`YAOy_N!%bpGOK5{u5 z=R(<#3!upWYm@!2Nv~g__F3D0@-2G!&SlM>f3H&CZgaTCuoD#DuWfmdn_amp6mTfobM{d6&hCJmQcv%) zlYz1T5A5u;Oq%>-y+|V2UfWN2)~DX&T=|zvOTz}H)=oZ_7YkoaCuHWmi$BLRaFj;# zA6ZRZ`|X~d6W8cLz53+Xi0H!Pu1&)$D=W&sPWFZm56pdIrk=M7KIfJcVC}|qozIkh zRbDexLm5vlo4)zxR7u8fO9OqY`8C4CVaTHmjkbp-#7i+kZb^RJGr%PjP|pv6B846t;L_Cs%KJH zjt2b1K7RVr>zT}RBjV=p?emu1vokXmc@`=;Pef_2o>bWwR_Pw>(0)zI%V=-K6I#-) z;FB4?P8H8~S?labkr#U&pHM7dm;)zMV@5nG^t`gjZU-Yl9m(!59LkJyl2uHx!B^vT zH88@%#cbV4FV!Ye%aN~dUQ|^ed=L?lU zSfHx#v%rk>yF%J0>VCDhn^E4(}PN_v#s zum4ijxxaJ~P?R-VRA=rdj^kf-hCh2M5j$39F`0~jsmQKC1&xrQSEI{2^0S^r9AR*& z;4v63$O7XCZTUp*2w3D;^Spxr&H6I6y}%wwBiy?i z)$Hy4`SnP{(BuJnVuuX*TiUpM2lZ6P)urLA!NZ61zHb)$yf2)6c|R(&#oVpq&8N#cUqs2%!<5(EjLopENk+}qkQY%DJ}Nr_1Si2Y%wm`W;NAxp=aqb^#p%& zNZC%qt!I3EByvKz+fZ4lZ>gp4XPR8KQOeHv`SS9FhQqtMP7JYHCm`xjdCK@?NoC$Q z~>*o$aU*?;!61a&mGS)px)B=hh}H4QjZGeK0>i zZ!Ue;Y}^QR_}heB z3OX0VragavtB%gxc=<39r>$1Ft@ZU*OlFr_p>h5VZp;;jhK{6{rKVBXzG}_+`Z$69 zi_azyGc90KU|xDUH~EZVk%VD@MCcPe$>d<}HsF-mhz!sJQu+vbO)S^8uZE zFIEkI$DPZ)zb!h0&bGfSFz6xWSoMs}1t)L9$dBE;bq5|*Tl;Z)x%sm$x`wCx2XrA| A1^@s6 literal 0 HcmV?d00001 diff --git a/Assets/Resources/Prefabs/UI/images/image_panel_shadow.png.meta b/Assets/Resources/Prefabs/UI/images/image_panel_shadow.png.meta new file mode 100644 index 00000000..229cb068 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/images/image_panel_shadow.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: c6b2729b906e71c42a5f0417601e5cd0 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 9, y: 9, z: 9, w: 9} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 1537655665 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/images/image_radial_shadow.png b/Assets/Resources/Prefabs/UI/images/image_radial_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..0ecbab5d1717d4654fff3cd77647c50895d8b589 GIT binary patch literal 30029 zcmeIb3pkY9`#=0Vb28&hNQl88GC2!j#-Sn=NhKYOkh2j&Im|O6wL6$3>`ta)OD78H zfEm?}cI~JwI?#+#L@|kGFf-5lXdl16->>WUzVH8k{jc}Ea;cg1taaaOtCYH7`e?cAV!6`7;Lax zWw|QBBRn$7YjIIXYO|niH)pt?Vr<9WAVE z$(B}5mX1!AR>VJk3|wWAZ_bHf+nxM9m;KQlQgShfOioU4vam=^O5l&T z`D0#j34e7IpY#WI2#OYIAqf^%i!3ev6H!>`Uo;6j6Jx&(EiBX`JT^QoJU%%Ip|kpr zbP194WO`C0{l9eiSM`7G7?H`URe$yUAIBRP_aD1XN?w|RK=22o|B*5&U{^x8g@1Sw zeP?25_|g<)Du(}Q_Q_G({}#@_aGI|9uVW8Si~28Q(>1@7eN%Q?w8=~UF=&4Dj&K5IC{+9RO+`>IWlEYmQN(Zu~9ogC@ zz}m*icCnMKYJuHdB-Ouhs1}5dwaSf4;Dp5g*jP;I)ph|+gp*h*;v_-Z5G>xkV9<3 z?8(-SVWHa`LqhEqZ*%wt;;L2uB>y+op7hY2)7FBp{@t;J(L)jTe-F#v#$lUHc(^q= zbbDwx*~%*1f$Xr&0dXzXp&?e=x7&nT+c^H&(Lb2|TSvZ$QHb9QiTy{L>A8dkxaJ@G!^4e|GU7*!){pUQtPiw(k0e79+a+ z&9kiy-|??c|E!3O`sSe$LK2h0r|r+h;7PX_gDmRb#rZ#j;CKH2Aph@uq(+9v&t_h~v-;NRzcWdqZ%(MvmgMlo z+iVvvwy|Ek%_{s)G5_BegN^LdI;?O){4e4QLcaMuD`$&;d-k`^{N6rr z+Kva9tUz0G+1531?d=l6wq zEfS`OyV~2?+1NQ-%zQkP!Y?Wi%8mb(@*g#SQ2s8g ze}vTE{O9jak$@d}SFrf&W#Qjk>t8F-|H?0aPw9Up*BQLNcQONz*^A%dnjN1Rwcp{I z0m$sd?{LkI&y3pdaLoW@_TqQAX2)kn?RU6l05W^=J6yBlGo$u9Tr&Wfz4#rj+3}fC z`yH+sfXrU}4%h7X%&7ei*9<^rFMfw>c6?^keurxYAhQ?0!!ZQf;&-@a$7e?EcerK%GJEkmT(jddqxL&oGXR;r z_#Lj<@tINk9j+OG%wGHs*X;PrsQnJt3_xZteuryzd}h>shie8PvlqX^H9I~tYQMuZ z1CZH^-{G1apBc5^;hF)+?8WbJ&5qBE+V6190A%*!cerN9XGZOJxMlz{dvR8{WdFW? z8y=6`xlKhb*ZPwwY~*4tG1SX{6#(ou0sv?a08GHh=LZ1TX$b&>Gyrfa0f4#mg5aN* z0f3{Px2Ib`+RKkyCb|Ni9UEV(qa~wy2$#pcs<3+Blg`?G9#pl1N9@lWT2?;a@0@`_ z+(}idvzXtm6Zc3PpK-cx?~bTSdhC*#R<(6qkKW^_%|fv|Q0 z&7Z9&`|&3Kc0!-l4?6dab5;ZMMSGY{>g_(j?lo_ge4nI(H>=%8!l4%$wZJ$!Sg3f@8Z+=Pht9BdTP3;v9cr-`AC2ia7-sw~zZcXGPUlftj)bjaDN| zxOPW5-otROntlh%?TT6Ck1FQ5S_6E#T!#0XbZRN80hfXqSa#-0T)@*hyTo>{W&@1U zyg-dJMk<%o2<8|2szB*d0)Nx%*P~-v17xlbtscla<=3^LD0$TZqPc%H-pz2&LV4@z zk4#U@++TmhJAsctv5_lBLv)iJ!Sy+{1?`kQjysdJe&bU+yKI)1o4@Qz{LQfT0({~Z zX1M`#DFzNqTw< z2fwNgRIQ^{fm=~ddmKACvO5pdl=Y8}8zD69csG9;)p=eQ*jSam=h^yXM1rycr6=Q? zPO&tWg6#wF+;p?q`8-a_rfqA-gU^^taj`0a z>V?Y8FuA?{XgLqmMVwUYX0U9=@K^JZd1Izrn|3=tp2GOUJ9lCt!}L`=eo!V^Q%?{p zvsDew*I|8pQ4eLas``YKYr8SYiE>A-R7l| zy$pA9UP4-l0qQY6EuS5r&=;7UYsd`8F)F)?`&{$CICD8`fF{z2U3<**nE6dggIO1X zjegL}?<(-h-jAr^A^9wQ7BgJQ-;B+@Q6EH)r@5Q0m68V4hyGB>NO7RqnX!myaJ` zaBNJo;l2kdgotQ?rM}l7KmHoQ(UVV*v$IPGXKIz05X^1CM{;7_2Np(RyDg>6QuJiH zTKgtwIopRV-Fbe#`=@{vyJH&;duk}nF%8T~;H;e&8OGPoR<+|E%`P+wG*d0H7Og#9 zdQ`f;0I|FiHn$sby9>X(s=P>Xr$*2yxVi&_pFKan{T#GXjbrRjt*hQrt)MY4Z66K! z7Z)PK36}_NLn~=#@HBHlmq-%OZo>R#k@eKJ0$nhF%lziY{49fx_zNzGgnu5g^0qW( z2c_k-(w0=B_sctb@~`3?NknW;-A(Qt7S|b1)8%*hOP^k;+LfUoIvo$Q!O8g@FH%jZ zJew20p3a$6=vez>Zrjf>!)x}1%r(uOkDKQ_5P;QEiJa#qXGeU8TC2~@B|_c96r6|= z0A^htO1jaH%_0n_2;@_6BD#mm{OBq__)Ov0^R!cGTa5Ah)pSjASsu8p2K?&kT&?Ov z=2b6RfO_>oe({|q9gf9LNnx8WhYzp~;`Z|WS=_=hj>)IC`CrPHWfb-GU!gz99202>Zob-tSgJGXG*g#( z+oFTv?jkpy=h++jS?lvHFJ&+JmH11_=GL@zG!<|=rie_lqisaBowrO~SyE$eyLh4H zvEfpi!G$1a!|0~1!AGZpZp>xoTbJH$?D$Z+63|^T>5AHg`J8m-blzm>_THqo<17+O zGs`#H%`nGAJ)C<1_{0oTur%+8Wgb%~e2?0ydgBI2ICvKI{+Yz?L+Q&;ZO0^A1)B#q6(3)gP}quX+`A z9Z`i@sKOUnzC?K|1QxN?371k?P;v_UzU;~$01b8VN8!1?;)bS<@pIkzl}$3Dp!zO^ zE#oi%qnH_Rto>A#pM^&wYCQU^;A+~Tv>u74qJ^@)^YR?_5#~>_&YsE@xL7%o9rS`) ziz&a!eR_mjn8}E~TZI!J=M|GUo#QY1lWtUidX1SMznZrDKs;aS@&t~?AoYA#F4b9zGwi&wHTzP~WMqrnZwSjQ>F@CYQ$#`N%t;x>J!YR$+a;UB6wcI4S z;{lJv;<%jn^)+FqWykG+yuvpvKlir`HLmIt7@Ovy=Y?@Ea6K>%cGOM8O7OH=wGk_k zsik`3QUT`uHthQzi5;)%(9{YpBTiqmW;AAt-n%TF{!a$^`N-Hyr^k+wTy)P{&gCdf zqcV3e;k>Z&@PeQ7547cXE%EGw%D6cRKnGX=zQnA@KGC&Qp#^HTo>QBl=cbNjQVWRi~F4O!>J&p&N^&2eLQ0SpX;Xw8C-mNTx*N!vA|=OS@hqtbpI zmKw>OYMtg$O*k)WZosYfyM`^$Vwr>QQ65LR<%UPO=P~UoCj0kh)twGTQTAq@9OYS% z#NFc?hbiQ=3^~!&SIc)w>xejW*lD4w>$Hr$--H@q_ajT&K6`K- z5`1t>4BBJC?Pv$n8^I;22@V7L%tN^(zY{X@7f?TSNL={Ecs52{GRE`fb2b2Q%9)`N z)mzf7UgIy``f&T>_1| z$6Uu;hG|n#arU@QQzEN=VtY5+8_wk>D4Sqzl2}eFVvlgU*Ks>;ar&m#zHRE{M?Bzc zIf4Mklc{t~&mf4NbaCWHx1tg4Z372XxWSLN*HpRB&zrnmBXIoe6s+nty|_e%DaYNp z&6*qODNt2uuE{2+{csK3k9n?IYs@_PnRZxRb1C*c3rXe zRh&hxaCAc6j<^wZ2s8W(3EZk-_5i)N7IoAR(s;@nmDuq)OXi3jw=gINNBz0^O;Qh* z@c9RoF?rD(U<}WvZ?Aa)@14{bEc-SSo-#5MqCRmR8v(7?qgBq|Q+fHmDVt|hMMC!$ zZxneH$X74HfCtGEmoufcukw?!6vfVbp;s2Yi!uLBW2!1QzsL2LbcHdzh>jmHiKux| z`6Bk~mh->)Mf^U6rHG{{6Oh0)a*m%mf|O!TZdJs2FyE+EAC$-K3bou>=&%&!v5EOW z8S0dfKhS@j%EQ3+cSm9hc!QHS5xFzW!QBcUBanf=@auQa)EktE__?J8vGh|`NCdqn zG~2Az2<4*?S;XIAsH0PWX_x{F)HT;(AJt41uVBP==F6lf+_g{_ZS=MsL^gEUK& zZKsi1*eYjk;D9ppypBDtMf2g_gzWUauzMP;7R)#Lx;MLgJYZO&+!4fF zXzN%$m;xvqUsJKOfVY2OUb^WdpTQ+$$xof- zEq{`W$`bb9p(yQD8k!_PTQ83H+Ub^cWjTpgTRDdrIN(CggvkXe z@XG+Q+aqjQLc0M|<|HZMfIBKkmlcC;VA5>V+Y5liTZ}7X#Tgup$v6$guW3)E_$<>8 z`5}6fnck!4x{7Z#;ly+`zMkCvuX_o5wq8`|t)Ths@}ViVVKH{;o5Q|WWF%s*7+X03mtmpZkU&wC3{D#X($g?25!$iyJBfYCSF=xr_RXY?($*(0Rxh(|&fU z7{hqks+7r5n~dUfN{ceeYI!Jz{M7Rip90=*swF;(S$02ayhj1WOZtfP|PFm5fAk1UR_dpPSS(=#Z#ADa~@N}|$KNUtS* z4T44g6$=pV5x6sJ12Ez+&8I;K*X7$Z+hkbs!nf z-YFD%F&+vlwo7(278hqYpDLYJk^&^$%1?x2MG5qc`uwCg!btPRYuHOTTOZ;PuJ&pp z?nCz-aSnBctY6Un>uIs-eoFzzQQq;X{uD<37{^gxQnw?x`x9ex$(QuzHp8a;sD`;l zl--#hCo9~A8|&}z^XnEh%&qWJpxG;v!NYPCjb*u8RYgin%$pZroO9$x=8045+3T@o zUs2cMxb35qh>sOyao|%9Y3%MEmm9r#=UgpB6q2B(Z+Vs8ZE3II_NlI+(!t~Wp>v2( zATn6M&HIrArK5I)Dk~`;%gNSV$R}VfU*!|+X$vNTUrIK4Gad*--{>iQ6&Kly9X=Iv zVOI!Q&IW`=5A>G2dTiwVHSeV6M^gE{A|MHrm)YTt%-hEkb;JH(1>R9@>^KhnuO=`5$Eyhy!at#}JwgO4D6hoD2sH(!CjD63xkw zH=KMf9BkR&6-F_ZXnwuQqiDNk%uV%+==!<0amm6y#7f`fP;1atzg_bqF*EOk0UmCz z)e0{`5oUhpP`Emf{EqRUv$SH$M~<@fL)Ao9RJZUfN}6iJ&Ci09ML%vC?b?{VMUeI8 ze7gr~#Ec|3Ypq*53T<8p$+;VuackxW#-aBXz~w!`vQm4;Y);`=iye>W|0cgix`Eax zjKhi<`hvF^uv&)S$S@GUJ{5iS^w~^imHd(f&7$1bIW_2~hk^It4b#AAY*`IT2d`L; z!s$Z=0{X$>kt5O@A8R(?CFTOXGi!on#U|@xD}h@K{)n( zIV$lk*Blj?Gu$Re@gLOdmzYb0re}ECA?wCzn%*1v@De7xQgdD0N80?cfzLZilp|9h zZ+@d-ai&j+yw@&jEh>MHI=>RIz>~{lHGcs7&r#^YuKQU!;?H;TH%xLObFxO{d|Vv{ zLj`(r93Pp%>YeM-s*I+`A-%K`SL@8ZhH4;&VY8nGRtI1OUI_&l_91EXEspKi-?Ay2 zMZIy9{ILi@OOMod4xcjrR@<}rC(k{5*6Tt!MP&N+eguv}U9y5AqMqg(YP*))bw993 zLGvIG^pHUp_P^R4Gt{JsjKp^ZVkw*(uiBENnkzDU!r|_Z+%Dx?qo=w3_rriM$P&!Q z>MLS)dHCJBd}BFQJ`TN1A0Uf;ewD24DQ(F*&2KYAqS<^tMWexF4;-c>ey=NkTFr~^ zaB@CXl{E@fse56woi)bJ12Gmvb)4cdAhZ?UJi>@sCM?dTteULIpqNNuw02g-UA;#1 zj;6YuUtyu1SmUu`NyK-E=Pj#*%2B$eexS1o{}Yw2dHw|urSm)ohmqnOz!3N+2fQ*#^{qWY(#)mGv&UkY!f-wS5(>2 z>`UJ?98X*>t+>TW>8`Jx@@dvvB#wL<{6+Ga=F9t3`u+to4f1-3ww+dJe`4STlz&UE zow{Y2f@TijKT5HiJR1M?%&!ukTNE7QhG0)6Wd-A_#H2am>)OoUT$hUG=VVWJ%&i0# z;X{al7g4pJxZ3jSPzbvV_b3afYA$&q9QjB*k@1P` zOszrPFj|1kzG+5%DOVk@l`WJLY~#V7HX&e9_BrXIbn%uqp|9K~vU z`G@=_I6)|pJ1Wz#d>0VJbWrDF&uHS`98Wkb%iRye%e+3~2iAqKO=MaPpt_YPfrybW zZh2Cg{Kleg+{6g>7v_gjOhrfi8P3ek#S)E}wSvNJ*f#-GSqxd7_6ZyLiuu&rEs7Kv zjdpf~90{6F;jUj8AMWW5i@)sPIS74sF@~i&;*deTa(K@C0J#mm&@==x*~ewuuK}+W z@4dZ~v5c!lc>fY|ON2V56cY)jQy-papzuE4wGsO6WGG4<#$jji>-hl(*3He~%=g7Q zD34u$cuN9+Qnj%h=F{!8VOzF?jOI(Yzm>62{M$0d%g2;9N%^o|OIE{Bz8t0hj^0&t z^bSrcUx$qUyb;uqi#8(;VdB=n!*`Nqt5s zbrbyr_|0QDM1P{|7W|Xq$@0oo1a)W*^KSAo#4dL)Mw7LRjN z4R-o6q5vyC>C}5Hc`?P|xz!|(Hx*#{TdCcO&YmXN%a(q(H&FL0aLd`pb!f^c0S?lI z+it_{O0Ide%%jB4_~&x_UNKva zSytc21^xzXm5n}y4qJuVdmKo64;R5LJ&c%%mW8m=QG`y3(=_#iVqy8^h1+5A_*;L? zeamwj?TK}2_ae~#j?i_b_6$|z)i(hsISy}HRHHze#Y^mEiJI+k8ym5YLZMV0kvEoh(obtfx0Pax|nhpP80HK#77I@h&wXd zGG$tyc1;TEUEfxNr^|`1+WdJk+Z1V;bVwcZ{xIqyo*M*i9XSacddKWVr1i#l&gB`YX~!=GgK?pdpx@s>gMj z%aTRa9pY--27V>5lTln5s0?UN8nTF!R!uM(-gU*yS6;ZG>R0JRQOIc>NC^7Z%l?+l z?PzAd^yU&Vem1B=W1thq=gh-EQ}EMYDT!i+4m|!Uvuf)n+xyH?qpzUISikco(6sS< zgdxiW^f-t*q004}0~G))y7bHhOmBvH-Qd;4@hTQNBc=~{y2^dU9&YDRs2th3RG@z7 z=1%O#D#PdsCY!=L>WyQll}g3%M^b#0a#d3E-@q z5iD~rx^qLV5?=w;sLkvo0UNSi&T%^`xohzJvluYakb7vq4bX{izXg}3qG(ts6Xul4 zwP$m?y{XYg&$Y1cyLIjvKnL!Vpn~~88{Y3W%!$A{M4%EDIdk@e*bVJ+(miQIs9v9a zc|^|Z5XvV7TxJB_NGZ9EDXc;B=YylN)ysgF82%Lhg_Gv`8r=#aGJ7pBa$)o7HM9qd zpon>1K{C1r0q0H7X(M*Qe5hj{bW(*c)Iar!7WnI}#cn|58rtI@p{HAb4}sOG+6e)u z8)vhDVRIs+u>|1B=yf(%AKw{c1bW>DwxVv-WCK?Maj3|fm|BV(@DeY`F9MaoL#OD=`AJ#A2bslm~uN5xk@!za@FguC=gJrB4$Gc>T+mvIY#hysUZ|& zji3=-qh!@o*BP-vuQR_-_<*j$J+= zV+?ig&8=vn#8CQ^52IDyE%Gt%?VcgHz?|4N71-{&@@3IH_5k4^A2QRW;!| z<}!<-)JsNi-5Z!wW|pt#->5Eo}mg~+c3?!z;VW>_ajvy5RE zSS5W%t5Khbu0F%jv5lB_p5Yi-wN#quH=^2J)})iXk)tb)Wo6A*yC@vz8-Z+lFz}Zu z84Ben&~O_#u@8wdxh3c{6A*Eyk3jnrze_9Q)Yd~TAUhSMEa9YLL`kFYO&_WTc#?ue zE%*`Bfnhp2Qa9swUqXk54_XBRzkG)6K-vQgEgn<-o(RNgSC5m}V=EyO8LD=|`RPW= z4;cBdg$vrU0|V6qYcbX9J%GwM>c|4i{y<9^rj^X|cbf@c`+yrt2~J|&`NW4?hVJsT z`e9voWFz<*E9K1rqFW%J<9pFtLL)PeX1 zcpy&)M54yiQ>efQRH8lVvJUs94C_9#V)7<*>=jHYKL|T71|NKeU*gy)$S=w=71ipZ zcF&D=K!=L7j0Jqrj~`Ex?-bp<0^H8~z#+kxCm5GuUo2!d2XaH4kt%Y&eEJae5t#TD z6wp{LIR0mT&-?{Gn{Iy)RV|mk1=%MjI4$s79L)?c{}BjNp?=6y95aP6;2X!`qgNkRawPA?HXFVa;rA; z^|ZIDO#)4kRTtPS`^GZCN9NJfXBztAyYKW?!;Pb*LfGXC;{lv*4_pQ;(`AUoz@h|I zNDZ?)3FwybI)wI#11zwgS95=C2c05|F21f9MgrQc(g(-j3>jjKxc^5uMoLi!f(*Iu zG3^F2f^JfPmdyL-z)76IpQVO7EBm~|t;V))|1FN1^z*2%nMByih=PNc03CPW#YWIe zZ)%hx>l*kv3c9YA6GFTQ=n$G-Fl%hbf3luD&@&x8PnaB&_P4@XFfR<{w*q*%qPkWk z@*PlaPuy8b-6~rUubO?a`M9iuw$x!h^}rU29K#0*S_Z3bOy_c7O0QtNn=}J(WsczeQP^^0_^~V(QBS3KAx!Oa~O@ zqnxDx^5SqQml&nTy$0U&amzradC}4bEARw_C_zz(Z!(qKS1&zTewpJS?C;|ZN;8Hm z6ye$)#>lsKmM@GEl%G1-@g5+@0;LLGxy+1*3Hh@7(!m?^_eEe<=TcV7bZ+Z-)=N)0 zepq~enu{<6&fGt2(IY;Z3g;ETH>Erh^aV!*bY!k6JRhhAU#><*k4!b(11m`3@6eJv zP0%Z7GHB3T$Qf}H%x%ePi5hAflv-%_P}HSSHH@}VrC%5$qACaAkr6;wWFtxx3*<3h zlJ8!g!bF-O^AMdE6xSN)T;?8DtbWj?$dcX|ohnc06XK2FAYs>I31wR{!&lUQ40e#l zyoX~5#5yHb4B9z_9btoDSc1LR2p|CulemdFawp~!^~ClqbT5XyRM2YiShDst!}tFC zU^DT>WAHO6#|Z3LiN16SXbP>iQ$^knyQhP*yh!tXO#Y6L#rztLoAb&DVi9<_gSCsqm?O z*H9%gIs?17B+dXjlVdD#6x}uCI18&jNMF7$-8sSum@Hia)7=4o<@4`=%Xg?Tq>_uM zGz)(D3krkT`ih2iB`)Ny1s|a&`QEe=V8 zav4Q%sxPnt&(2k7ze9~8E$CVFXo(8)#`tC)XsTRziMvK$X&(u3hs{fX{!N?oODEO~ zB+C^(v^DeO+=cm@7_a++Z+$A>+0P3QAxEmW@ie?P7l{?*YwgiV>!{I71RD*NoxLis z6sBFsWAtkG_T;rPz1@SxlbgJnkT)ik0;#`1cqw$qqJFBv9(E8PO@U85gwNoKCh|Hf zrr%(`64vt}8rFXoP{8e~k=AYda=vu0P`9~s6xr8M!arq{Uj0G|6AJe-lJp_{Sjb+r zHURL&T>8WfAnyA{TINiZ#rn$Je6bkYa zIP^ra{0MxRK-_6hl|!#JBi7C3Mqor`>=xOE!AIyz54dxCQ$GOnuV0ZJsXHdB8KD@6 zq#I5>E%g<9FM&I|d9NgEdxI~F^^O5S7l5`DVyRjO%I%?SLpD{?re8z5u1z7X;I$4n6us9U%<#8V$M3!j70Lu21+Sw`?!*j3ahn$J z6@E>|iR^gDR?umFzOPu}iKKCq@(S)p!ag(pFS6=fp&Xyu9)oozDSNmn5l+hM9aij4 zIoEV_wV=YCg5hkK^l3(R-}ngB!H#XiydQwFa(1T~ZLK>tkjW0mI`4w)=e2*NirJ?X z_0B5tZ@t8h^n0VlL2pJrONz#X7)E_~tfX#0I(K^tyavx+r@?nIWMi|7koR4vNCw&V zD8{_mXBjWw)Y+z}Hu9B&)6Q}p^kD|eNo;xfm53r==37McbLxb8$VNsSWUGoOeP^I$ zi!47|xgYdjuwWI=b_sWSOH!~>1a0kd`*daKPI@}dUYz#0>Oof2Z@#jU=fbyld=HHk zuNJ>cfyWOI2b1AVs#G)iOY6YbRMus{7n|UQ{{kptcUklGK^>JWg_ye)#Jbl{lvIo; z^d$o>2ZkDh7oKyK6Q2|%4dgWi2Z@?Hcnc*~qKluT}bQ8e>Z2?mhnMnO3!az6hE94p|aq64}k1zej-*)zJ@9jHOm%N3ToLdi!5vMD!Fd zhU@1Ize$q%80w(B3hw-iFPcy9wW~4{jo?Sr zQ;WgIo}v1IuDC}%IQcRi?sFItVYRN_hidF)z};G`RB$HoB{2Wn0)aT6*4 zt*X*sw`rJe^ja;er3NLqIaJe^9}?{R{EM#nL?oZ_7&%IjB)mqnQuo7%f;1=;wugvb`{Q9xWU9?r#nfZBg`S zS$-2f)IM(Xpv@b0doDPTl(l-wNbu#SQnksRVt{j9u;(dHTm0+gsV-IO71w4=K=!E&O{Lxw}I&xJ}cTp(#2f@qyd0ZqDX&U2nxz6+*4=S*t zCqmu_frMPfc-+nL7SdM%Th;mV<=zK^bX_i~+GP)7JIaf3Z(o3lGA~rwS`Npnv8pO3 z30+ylhTyeW$)rGwcc$wwx4uuh<_rSJHEnq`fX5JI6_BG75G)xr;sRU zv$o$He9(HJ0#)hE^+3InSLLn*gqSz?`3Dl9eM!tcch0k(0WVRjRPG%lu2y)Q%b=)< zhtv-1(tkhW>L)&f7d`pBW*9kpU!Ea@@__U>{=j$H%LH$9bYvNbhMXLBtJnuWcetMZh- zl6xiEvLB1{O0U|8A93=!5)`u=pMMIyG1nz)(Kn&@m%&Q4(?=QJU(@ert{>`kjzQIxu^L073OyVc^X%stn!kGRPz z+4(ytApC#BB;%&)iAc)Y^eh?|jH`$kDM)hRB*XGfQ;)2uu9jmY+T;bVxy2wLF$^YX z6Ek3erU}|X_mMs`j~16^a>^j%heT#3!H)O>bpXF@8TSI!V9y*+yqBz({1F}JaWXi+ z`7lHYfpl*piAL*Niu&Zx%BOkLe6lgumyns| zIMOD_6Y4}xAa_Iy&bZ@BO>>ab^!>dKDxMbvj=?I=jkt`TAl>jRd7w#q^?#atf@EG4_cc`vRorQsl0k7&?$wu%=^?Uo11?{tdM_9-0%Lsn zx=f6@4;x8ILD+i6AV}28Od}y+y5Wzg8CZEHQnS6DMF69mJL9f)01Pr+50Co2Z%MG& zo$*nG&nTJ->Z&Kf_D;`IeYZUhMoG1J6yb2N2jEc&{3=_>;@0JoxE1*F&D3j{OStD6 zWz$Epmt;%iU)$h8Z+%q{Ql9TVQth3VEP3kk>KKUO3%X2WT@K|Z@?MP_aq=rBS2R!O z`S_HmMqTsOGH%wSM25y1l5vU27 zghoR_5{b+4U^C`WkqjZ1CJZw0f$?dFUSA-+@p=hKWT8Dzj6`ll>$$(6_Zon&HM`AO zP?20@G_~e;?$~MWA}v$&0c92f4AGJ3?e%m1lIdY@f*5I}D~f<;z;<*2nP$MBc71{B9~T!gr*-^@ zCQFA!Dtps1AIZK#)FkFq7N`AF=!G`jQlZ_Ij9$LIW zSpNAmlCIVl!D(B*d)Hn1R(`3Euv7+I$;4bSQhiREMng~tJp*1LCh1_FvCI#<5@)dh zQEKiz=!f2&2C|E?x zm$GT@%^IYHQ|`!d=!zohTJ#Qo?sX(>S6=R|D52`8Jd)hxPet67K=w$^deQS@!Z*gc z?IXE6Uej9<)$ZzRdWI~RNOr*<_||>CZ*EpnvGg*5U8k;j6eCz*)sHGLLNXLjsMC7UjiH|hBD?760T+0@R$lUp$px?>>ENGATh4 z(c5ppC%60bWX;V@m(LiRDCq9Gh2T(E#)uTuf0Z0XcGkW?9cjoRZsoaqUD`!J1?J>* zhD97W2QKmie|1 zeL=lje6N(1P5)dH+Wc{Y>>v<$A5yE z_tDrrZ3Pj*W2HRDFk8?$a{eL(-Njo7NKH}VVa$M@5uf7aU&_os=dxP#VkoA7V)9X2 zPMkC(^-$&pcu|8i%&uab%?hu94>Te@6F5}NE4fx${n>9T4KECbVKX$cEOs?ynTi&Z?8SRg@I+`fV=KneLbd%)vqm(3?k}~_ ze(0|I0lcksJ6?ZUEb;ydr{DDJx6k`1pQbRT%jbC@ro_075+A?9IQG_SM2*Yw!&n*< zHg9%Akvphnde!^5=VSxt5%t;b`^unuP#>3cMx7$HLQSp~?c(h1`iyUI{W$hIz7*9| zILzxlKUACzzgdcd+cE9gn9lIS`0_(;3w1io-Q)~z*zLjlhp{Ws0f=c|(zuagX5{j< z3p2L7x8Fs+%42ZUv^}37_UDwo6!SxB+^F9L7pKt{n`wzih0^eNVK9Q;A<98Of0+|J3 zNHoNdsEPdDUZ7pq9%OC4jY;#ZumH36chgNLT5zzxGIgQq4Ymp)?HQ!5yc;3HH-r%@ z(Z<;Qh$p&neN9yUR4R5rKBe+uy4%PHkuJaf<0O)+MpNNZj6wNTsJR*i)Wcfsu}Gd^ zksT`lJc{I1BDsU#y8WgEj8foRw}nFa-IcF4`SVas#zLQ4S>8`M)qK4ZzhzV7V`3i}=`Lk% z3CS;%aLF5dg;G)}`-sr$y5Bgk4}8ER7*q^vP@9frZI=}|vLk*R0kc*haU>_VFE~xm zb^v(43S}3~-itR+N0M&yl!yKHxf$ROnP1n+e>kHXHf+eAbS(LRQoP4*Ly-2sMqj1y4Lz$Wo(r_p306tcO8Kq)4G5* zHpdOjjNuojNOT@>So~61u!F@diDnn#N$JE&)OrLPm+ zjkb@qQ6i6>l3V~T#Ix-PwSH*wKI%)u_Ey?C_iw^L{{KQpuW~Tx!U;7t&#P)Fx}oB? zr269fyXv@l=Y}lgMHR~cB=I!RlXytUZXL@2nVUBvLrW`5$BqtT>;UCl*Bx5_q7iJP zZA;gk#xqP#Ex*(NO!H3dGil?`CSA#2vEF?GCRbWvnJ?i9peJjBbP=PI~_lAY%;V}l8b{o2(*=|k*hET zW`Y7{nPQ2uxj(D*%+f8PfF!zid`o!puFBth5U?bET)hiJRjcNOt~G(y7qLAR0;ezD z#5|xHVx~=|M5pZ5eK4{zs{pvw*;}_L7`5B?#)hFU#kYnm48U4{1X^iLlzv3Id@>P31KI)^5zYWDUQNUU%+hNM0D{tk! z!|^vkt{dLRaD#7N;mBi<%QdwI*;>{#cL6KgQ(nWZqws6eqBhJ_`JIt1vXhknBW}%( z+E$FEok6S79@S~ZG2E+jO#r<_k3B5xI*Askw%2=&Z;%x|^aMgx-F&PC%7~BBvWo1p z^xQItncV#@bp_aDH?Tyo0RmQdA(j^1%JsoJmhtuXy<8#Ltn|DQLhiTeL!9d?OE%i0 zG?BYbNbWDLE{CS#v1m=&!!I?Lx`NOmxkJKwwXuat;&2m4%Ruu7`9vfq6|3Y}$XdGS zybH0OyA>tc1!cwkXm#x)2Ej@*TiN-ZpO3~?zkVPS&rRj0qBIX7F3nO+zmMfX-q@G@ zQf|}=WMsYL?GCrR8jZ}*+DpY<(W*mrsT{2z=#djCP9hibjIwpCTlKLPRviVNtKKy= z$!YCr#13?=mwe$7*yMSI%I=D$g#~v5k4>eYq{wiq#@lw8Kv!GYd(~F#3%RgUs?+@1 zjfY$S4D<7mU2C|1J*P!^WXJSA<-X{*s%uWhCTUCE&euwdWOg HTK4}1c1d_e literal 0 HcmV?d00001 diff --git a/Assets/Resources/Prefabs/UI/images/image_radial_shadow.png.meta b/Assets/Resources/Prefabs/UI/images/image_radial_shadow.png.meta new file mode 100644 index 00000000..50beb3b1 --- /dev/null +++ b/Assets/Resources/Prefabs/UI/images/image_radial_shadow.png.meta @@ -0,0 +1,143 @@ +fileFormatVersion: 2 +guid: 311db692c780ea74f9605477fb85f448 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 126, y: 126, z: 126, w: 126} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 256 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 1537655665 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/UI/images/rectangle_fill_10_radius_4.png.meta b/Assets/Resources/Prefabs/UI/images/rectangle_fill_10_radius_4.png.meta index 8dc76e49..57901347 100644 --- a/Assets/Resources/Prefabs/UI/images/rectangle_fill_10_radius_4.png.meta +++ b/Assets/Resources/Prefabs/UI/images/rectangle_fill_10_radius_4.png.meta @@ -43,13 +43,13 @@ TextureImporter: nPOTScale: 0 lightmap: 0 compressionQuality: 50 - spriteMode: 2 + spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 alignment: 0 spritePivot: {x: 0.5, y: 0.5} spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteBorder: {x: 4, y: 4, z: 4, w: 4} spriteGenerateFallbackPhysicsShape: 1 alphaUsage: 1 alphaIsTransparency: 1 @@ -69,7 +69,7 @@ TextureImporter: platformSettings: - serializedVersion: 4 buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 + maxTextureSize: 32 resizeAlgorithm: 0 textureFormat: -1 textureCompression: 1 @@ -131,7 +131,7 @@ TextureImporter: width: 10 height: 10 alignment: 0 - pivot: {x: 0, y: 0} + pivot: {x: 0.5, y: 0.5} border: {x: 4, y: 4, z: 4, w: 4} customData: outline: [] @@ -149,7 +149,7 @@ TextureImporter: physicsShape: [] bones: [] spriteID: fe0eaa9c51e45554c9d875af89df8972 - internalID: 0 + internalID: 164722594 vertices: [] indices: edges: [] diff --git a/Assets/Resources/Prefabs/UI/images/rectangle_fill_10_radius_4_shadow.png.meta b/Assets/Resources/Prefabs/UI/images/rectangle_fill_10_radius_4_shadow.png.meta index 97af0d67..8aa80d96 100644 --- a/Assets/Resources/Prefabs/UI/images/rectangle_fill_10_radius_4_shadow.png.meta +++ b/Assets/Resources/Prefabs/UI/images/rectangle_fill_10_radius_4_shadow.png.meta @@ -49,7 +49,7 @@ TextureImporter: alignment: 0 spritePivot: {x: 0.5, y: 0.5} spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteBorder: {x: 6, y: 10, z: 10, w: 6} spriteGenerateFallbackPhysicsShape: 1 alphaUsage: 1 alphaIsTransparency: 1 @@ -127,7 +127,7 @@ TextureImporter: physicsShape: [] bones: [] spriteID: 5e97eb03825dee720800000000000000 - internalID: 0 + internalID: 1537655665 vertices: [] indices: edges: [] diff --git a/Assets/Resources/Prefabs/UI/images/rectangle_fill_outline_10_radius_4.png.meta b/Assets/Resources/Prefabs/UI/images/rectangle_fill_outline_10_radius_4.png.meta index 51d54d14..71389909 100644 --- a/Assets/Resources/Prefabs/UI/images/rectangle_fill_outline_10_radius_4.png.meta +++ b/Assets/Resources/Prefabs/UI/images/rectangle_fill_outline_10_radius_4.png.meta @@ -43,13 +43,13 @@ TextureImporter: nPOTScale: 0 lightmap: 0 compressionQuality: 50 - spriteMode: 2 + spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 alignment: 0 spritePivot: {x: 0.5, y: 0.5} spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteBorder: {x: 4, y: 4, z: 4, w: 4} spriteGenerateFallbackPhysicsShape: 1 alphaUsage: 1 alphaIsTransparency: 1 @@ -131,7 +131,7 @@ TextureImporter: width: 10 height: 10 alignment: 0 - pivot: {x: 0, y: 0} + pivot: {x: 0.5, y: 0.5} border: {x: 4, y: 4, z: 4, w: 4} customData: outline: [] @@ -149,7 +149,7 @@ TextureImporter: physicsShape: [] bones: [] spriteID: dc5e3c8013eed1640be9600cd7909c79 - internalID: 0 + internalID: 79660757 vertices: [] indices: edges: [] diff --git a/Assets/Resources/Prefabs/UI/images/rectangle_fill_outline_10_radius_4_shadow.png.meta b/Assets/Resources/Prefabs/UI/images/rectangle_fill_outline_10_radius_4_shadow.png.meta index 3690a481..6fd0e41c 100644 --- a/Assets/Resources/Prefabs/UI/images/rectangle_fill_outline_10_radius_4_shadow.png.meta +++ b/Assets/Resources/Prefabs/UI/images/rectangle_fill_outline_10_radius_4_shadow.png.meta @@ -49,7 +49,7 @@ TextureImporter: alignment: 0 spritePivot: {x: 0.5, y: 0.5} spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteBorder: {x: 6, y: 10, z: 10, w: 6} spriteGenerateFallbackPhysicsShape: 1 alphaUsage: 1 alphaIsTransparency: 1 @@ -127,7 +127,7 @@ TextureImporter: physicsShape: [] bones: [] spriteID: 5e97eb03825dee720800000000000000 - internalID: 0 + internalID: 1537655665 vertices: [] indices: edges: [] diff --git a/Assets/Resources/Prefabs/UI/images/shadow_40.png.meta b/Assets/Resources/Prefabs/UI/images/shadow_40.png.meta index 00c5fdaa..f4b3d1d3 100644 --- a/Assets/Resources/Prefabs/UI/images/shadow_40.png.meta +++ b/Assets/Resources/Prefabs/UI/images/shadow_40.png.meta @@ -43,13 +43,13 @@ TextureImporter: nPOTScale: 0 lightmap: 0 compressionQuality: 50 - spriteMode: 2 + spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 alignment: 0 spritePivot: {x: 0.5, y: 0.5} spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteBorder: {x: 19, y: 19, z: 19, w: 19} spriteGenerateFallbackPhysicsShape: 1 alphaUsage: 1 alphaIsTransparency: 1 @@ -131,7 +131,7 @@ TextureImporter: width: 40 height: 40 alignment: 0 - pivot: {x: 0, y: 0} + pivot: {x: 0.5, y: 0.5} border: {x: 19, y: 19, z: 19, w: 19} customData: outline: [] @@ -149,7 +149,7 @@ TextureImporter: physicsShape: [] bones: [] spriteID: 95be9487ffa51de4c9e0c40e64a95511 - internalID: 0 + internalID: -1447681776 vertices: [] indices: edges: [] diff --git a/Assets/Scenes/SampleProject.unity b/Assets/Scenes/SampleProject.unity index ca6d5202..34f5f711 100644 --- a/Assets/Scenes/SampleProject.unity +++ b/Assets/Scenes/SampleProject.unity @@ -1296,6 +1296,10 @@ PrefabInstance: propertyPath: m_Options.m_Options.Array.size value: 0 objectReference: {fileID: 0} + - target: {fileID: 8819539204293308730, guid: 12db500810bde2f42b6cc1aa17543fb5, type: 3} + propertyPath: m_text + value: + objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] diff --git a/Assets/Scripts/SampleProject/AppMain.cs b/Assets/Scripts/SampleProject/AppMain.cs index 5d8f5dee..1f945857 100644 --- a/Assets/Scripts/SampleProject/AppMain.cs +++ b/Assets/Scripts/SampleProject/AppMain.cs @@ -3,6 +3,7 @@ using System; using UnityEngine; using UVC.Core; using UVC.Data; +using UVC.Data.Core; using UVC.Locale; using UVC.Util; @@ -16,13 +17,13 @@ namespace SampleProject /// - /// ʱ ȭ ޼Դϴ. - /// Awake ޼忡 ȣǸ, MonoBehaviour ˴ϴ. + /// 초기 화 메서드입니다. + /// Awake 메서드에서 호출되며, MonoBehaviour가 생성될 때 한 번만 실행됩니다. /// protected override void Init() { SettupConfig(); - SetNetworkInfo(); + SetNetworkConfig(); if (Initialized != null) { Initialized.Invoke(); @@ -38,12 +39,12 @@ namespace SampleProject { if (AppConfig.LoadConfig()) { - //⺻ + //기본 언어 설정 bool success = LocalizationManager.Instance.LoadDefaultLocalizationData(AppConfig.Config.Language); Debug.Log($"LocalizationManager: LoadDefaultLocalizationData success: {success}"); if (!Application.isEditor && Application.platform == RuntimePlatform.WindowsPlayer) { - //â + //창 설정 if (AppConfig.Config.Window != null) { WindowTools.Instance.Init(AppConfig.Config.Window); @@ -52,29 +53,76 @@ namespace SampleProject } } - private void SetNetworkInfo() + private void SetNetworkConfig() { URLList.Add("baseinfo", "http://localhost:8888/baseinfo/00:00"); - URLList.Add("AGV", "http://localhost:8888/AGV/00:00"); - URLList.Add("STOCKER_STACK", "http://localhost:8888/STOCKER_STACK/00:00"); - URLList.Add("CARRIER", "http://localhost:8888/CARRIER/00:00"); - URLList.Add("EQUIPMENT", "http://localhost:8888/EQUIPMENT/00:00"); - URLList.Add("PORT", "http://localhost:8888/PORT/00:00"); - URLList.Add("RACK", "http://localhost:8888/RACK/00:00"); - URLList.Add("TWIN_FORK", "http://localhost:8888/TWIN_FORK/00:00"); - URLList.Add("HVC_PLC", "http://localhost:8888/HVC_PLC/00:00"); - URLList.Add("HVC_CRANE", "http://localhost:8888/HVC_CRANE/00:00"); - URLList.Add("ALARM", "http://localhost:8888/ALARM/00:00"); - URLList.Add("Dashboard", "http://localhost:8888/Dashboard/00:00"); - URLList.Add("SIMULATION_RANK", "http://localhost:8888/SIMULATION_RANK/00:00"); + + var agvDataMask = new DataMask(); + agvDataMask.ObjectName = "AGV"; // AGV 객체의 이름을 설정합니다. + agvDataMask.ObjectIdKey = "VHL_NAME"; // AGV의 고유 식별자로 사용할 키를 설정합니다. + agvDataMask["VHL_NAME"] = ""; + agvDataMask["AGV_IDX"] = ""; + agvDataMask["B_INSTALL"] = ""; + agvDataMask["NODE_ID"] = ""; + agvDataMask["REAL_ID"] = ""; + agvDataMask["VHL_STATE"] = ""; + agvDataMask["BAY_LIST"] = ""; + agvDataMask["X"] = 0; + agvDataMask["Y"] = 0; + agvDataMask["DEGREE"] = 0.0; + agvDataMask["MODE"] = ""; + agvDataMask["BATT"] = ""; + agvDataMask["SUB_GOAL"] = ""; + agvDataMask["FINAL_GOAL"] = ""; + agvDataMask["JOB_ID"] = ""; + agvDataMask["TIMESTAMP"] = DateTime.Now; + + DataMapperValidator.Add("AGV", new DataMapperValidator( + new DataMapper(agvDataMask) + )); + + // 데이터 마스크(DataMask) 정의: + // 수신할 데이터의 구조를 미리 정의합니다. 여기서 정의된 키(Key)들을 기준으로 데이터를 파싱합니다. + var alarmDataMask = new DataMask(); + alarmDataMask.ObjectName = "Alarm"; // Alarm 객체의 이름을 설정합니다. + alarmDataMask.ObjectIdKey = "ID"; // Alarm의 고유 식별자로 사용할 키를 설정합니다. + alarmDataMask["ID"] = ""; + alarmDataMask["ALARM_TYPE"] = ""; + alarmDataMask["LEVEL"] = ""; + alarmDataMask["LOGISTIC"] = ""; + alarmDataMask["STATE"] = ""; + alarmDataMask["MESSAGE"] = ""; + alarmDataMask["CODE"] = ""; + alarmDataMask["ICON"] = ""; + alarmDataMask["MACHINENAME"] = ""; + alarmDataMask["SHOPNAME"] = ""; + alarmDataMask["TRANSPORT_EQP_NAME"] = ""; + alarmDataMask["TRANSPORT_UNIT_NAME"] = ""; + alarmDataMask["TRANSPORT_EQP_ID"] = ""; + alarmDataMask["TRANSPORT_UNIT_ID"] = ""; + alarmDataMask["CLEAR_TIME"] = DateTime.Now; + alarmDataMask["SET_TIME"] = DateTime.Now; + alarmDataMask["UPDATE_TIME"] = DateTime.Now; + alarmDataMask["TIMESTAMP"] = DateTime.Now; + + // 데이터 유효성 검사기(DataValidator) 설정: + // 수신된 데이터가 유효한지 검사하는 규칙을 추가합니다. + // 여기서는 "MACHINENAME" 필드가 null이 아닌지 확인합니다. + DataValidator alarmValidator = new DataValidator(); + alarmValidator.AddValidator("MACHINENAME", value => value != null); + + DataMapperValidator.Add("ALARM", new DataMapperValidator( + new DataMapper(alarmDataMask), + alarmValidator + )); DataRepository.Instance.MqttReceiver.SetDomainPort("localhost", 1883); DataRepository.Instance.MqttReceiver.AddTopic("AGV"); DataRepository.Instance.MqttReceiver.AddTopic("ALARM"); - DataRepository.Instance.MqttReceiver.Start(); + - //10 + //10초 후 정지 //UniTask.Delay(TimeSpan.FromSeconds(10)).ContinueWith(() => //{ // DataRepository.Instance.MqttReceiver.Stop(); diff --git a/Assets/Scripts/SampleProject/Config/Constants.cs b/Assets/Scripts/SampleProject/Config/Constants.cs index 8ca5b0d4..56b21eae 100644 --- a/Assets/Scripts/SampleProject/Config/Constants.cs +++ b/Assets/Scripts/SampleProject/Config/Constants.cs @@ -4,5 +4,6 @@ { public static string MQTT_DOMAIN = "localhost"; public static int MQTT_PORT = 1883; + public static string PlaybackDomain = "http://localhost"; } } diff --git a/Assets/Scripts/SampleProject/SceneMain.cs b/Assets/Scripts/SampleProject/SceneMain.cs index 75341f79..dc3df6a2 100644 --- a/Assets/Scripts/SampleProject/SceneMain.cs +++ b/Assets/Scripts/SampleProject/SceneMain.cs @@ -1,7 +1,12 @@ using System; +using System.Threading.Tasks; using UnityEngine; using UVC.Core; +using UVC.Data; +using UVC.Data.Core; +using UVC.Data.Http; using UVC.Factory.Alarm; +using UVC.Factory.Playback; using UVC.UI.Tooltip; namespace SampleProject @@ -33,12 +38,36 @@ namespace SampleProject AlarmManager.Instance.Run(); } - private void OnAppInitialized() + private async void OnAppInitialized() { + await requestDataAsync(); + if (Initialized != null) { Initialized.Invoke(); } + + PlaybackService.Instance.OnStopPlayback += OnStopPlayback; } + + private async Task requestDataAsync() + { + var httpFetcher = DataRepository.Instance.HttpFetcher; + var splitRequest = new HttpRequestConfig(URLList.Get("baseinfo")) + .setSplitResponseByKey(true) // 응답을 키별로 분할 + .AddSplitConfig("AGV", DataMapperValidator.Get("AGV")) // "AGV" 키에 대한 매퍼, Validator 설정 + .AddSplitConfig("ALARM", DataMapperValidator.Get("ALARM")); // "ALARM" 키에 대한 매퍼, Validator 설정 + httpFetcher.Add("baseInfo", splitRequest); + await httpFetcher.Excute("baseInfo"); + + //MqttReceiver 시작 + DataRepository.Instance.MqttReceiver.Start(); + } + + private async void OnStopPlayback() + { + await requestDataAsync(); + } + } } diff --git a/Assets/Scripts/SampleProject/UI/Menu/SampleProjectTopMenuController.cs b/Assets/Scripts/SampleProject/UI/Menu/SampleProjectTopMenuController.cs index c3e2680f..2c18f428 100644 --- a/Assets/Scripts/SampleProject/UI/Menu/SampleProjectTopMenuController.cs +++ b/Assets/Scripts/SampleProject/UI/Menu/SampleProjectTopMenuController.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using UVC.Factory.Playback; using UVC.Log; // 필요에 따라 UVC.Log 또는 프로젝트별 로깅 시스템 사용 using UVC.UI.Commands; using UVC.UI.Menu; @@ -50,11 +51,7 @@ namespace SampleProject.UI.Menu MenuItemData.CreateSeparator("file_sep_sample2"), new MenuItemData("file_exit", "menu_file_exit", new QuitApplicationCommand()) }), - new MenuItemData("edit", "menu_edit", subMenuItems: new List - { - new MenuItemData("edit_undo", "menu_edit_undo", new DebugLogCommand("[SampleProject] 실행 취소 선택됨")), - new MenuItemData("edit_redo", "menu_edit_redo", new DebugLogCommand("[SampleProject] 다시 실행 선택됨")) - }), + new MenuItemData("Playback", "Playback", new PlaybackCommand()), new MenuItemData("modal", "모달", subMenuItems: new List { new MenuItemData("alert", "Alert", new ActionCommand(async () => { diff --git a/Assets/Scripts/UVC/Data/Core/DataArray.cs b/Assets/Scripts/UVC/Data/Core/DataArray.cs index 65e83064..b925abe8 100644 --- a/Assets/Scripts/UVC/Data/Core/DataArray.cs +++ b/Assets/Scripts/UVC/Data/Core/DataArray.cs @@ -28,6 +28,24 @@ namespace UVC.Data.Core } } + private bool createdFromPool = false; + + /// + /// 객체가 풀에서 생성되었는지 여부를 나타냅니다. + /// + internal bool CreatedFromPool + { + get => createdFromPool; + set + { + createdFromPool = value; + foreach (var item in this) + { + item.CreatedFromPool = value; // 내부 DataObject도 풀에서 생성되었음을 표시합니다. + } + } + } + // 추가 된 항목 목록 protected List addedList = new List(); // 제거 된 항목 목록 @@ -376,8 +394,15 @@ namespace UVC.Data.Core public void ReturnToPool() { - // 포함된 DataObject들을 먼저 풀에 반환합니다. - DataArrayPool.Return(this); + if (CreatedFromPool) + { + Reset(); + } + else + { + // 포함된 DataObject들을 먼저 풀에 반환합니다. + DataArrayPool.Return(this); + } } /// diff --git a/Assets/Scripts/UVC/Data/Core/DataArrayPool.cs b/Assets/Scripts/UVC/Data/Core/DataArrayPool.cs index 38fadabb..fa50d2af 100644 --- a/Assets/Scripts/UVC/Data/Core/DataArrayPool.cs +++ b/Assets/Scripts/UVC/Data/Core/DataArrayPool.cs @@ -23,7 +23,7 @@ namespace UVC.Data.Core // maxPoolSize만큼의 DataObject 인스턴스를 미리 생성하여 풀에 추가합니다. for (int i = 0; i < _maxPoolSize; i++) { - _pool.Enqueue(new DataArray() { IsInPool = true }); + _pool.Enqueue(new DataArray() { IsInPool = true, CreatedFromPool = true }); } } @@ -62,7 +62,7 @@ namespace UVC.Data.Core { array.IsInPool = false; } - return fromPool ? array : new DataArray(); + return fromPool ? array : new DataArray() { CreatedFromPool = true }; } /// diff --git a/Assets/Scripts/UVC/Data/Core/DataMapperValidator.cs b/Assets/Scripts/UVC/Data/Core/DataMapperValidator.cs new file mode 100644 index 00000000..bb214f3f --- /dev/null +++ b/Assets/Scripts/UVC/Data/Core/DataMapperValidator.cs @@ -0,0 +1,83 @@ +#nullable enable + +using System.Collections.Generic; + +namespace UVC.Data.Core +{ + /// + /// 각 분할 응답 키에 대한 데이터 매퍼 및 유효성 검사기 구성을 캡슐화합니다. + /// + public class DataMapperValidator + { + + private static Dictionary _dataMapperValidators = new Dictionary(); + + /// + /// 컬렉션에 새 데이터 매퍼 유효성 검사기를 추가하거나 지정된 키로 기존 데이터 매퍼 유효성 검사기를 업데이트합니다. + /// + /// 지정된 키가 컬렉션에 이미 있는 경우 기존 데이터 매퍼 유효성 검사기는 새 데이터 매퍼 유효성 검사기로 대체됩니다. + /// 데이터 매퍼 유효성 검사기와 연결된 고유 키입니다. null이거나 비어 있을 수 없습니다. + /// 추가하거나 업데이트할 인스턴스입니다. null일 수 없습니다. + public static void Add(string key, DataMapperValidator data) + { + if (!_dataMapperValidators.ContainsKey(key)) + { + _dataMapperValidators.Add(key, data); + } + else + { + _dataMapperValidators[key] = data; + } + } + + /// + /// 지정된 키와 연관된 유효성 검사기를 컬렉션에서 제거합니다. + /// + /// 지정된 키가 컬렉션에 없으면 메서드는 아무 작업도 수행하지 않습니다. + /// + /// 제거할 유효성 검사기의 키입니다. 이거나 비어 있으면 안 됩니다. + public static void Remove(string key) + { + if (_dataMapperValidators.ContainsKey(key)) + { + _dataMapperValidators.Remove(key); + } + } + + /// + /// 지정된 키와 연결된 를 검색합니다. + /// + /// 를 찾는 데 사용되는 키입니다. null이거나 비어 있을 수 없습니다. + /// 지정된 키와 연결된 또는 유효성 검사기를 찾을 수 없는 경우 을 반환합니다. + /// + public static DataMapperValidator? Get(string key) + { + if (_dataMapperValidators.TryGetValue(key, out var data)) + { + return data; + } + return null; + } + + /// + /// 이 분할 키에 대한 데이터 매퍼입니다. + /// + public DataMapper? DataMapper { get; } + + /// + /// 이 분할 키에 대한 데이터 유효성 검사기입니다. + /// + public DataValidator? Validator { get; } + + /// + /// DataMapperValidator 클래스의 새 인스턴스를 초기화합니다. + /// + /// 데이터 매퍼입니다. + /// 데이터 유효성 검사기입니다. + public DataMapperValidator(DataMapper? dataMapper, DataValidator? validator = null) + { + DataMapper = dataMapper; + Validator = validator; + } + } +} diff --git a/Assets/Scripts/UVC/Data/Core/DataMapperValidator.cs.meta b/Assets/Scripts/UVC/Data/Core/DataMapperValidator.cs.meta new file mode 100644 index 00000000..0b12f39f --- /dev/null +++ b/Assets/Scripts/UVC/Data/Core/DataMapperValidator.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a653efb9df38c124c81d005833ebb647 \ No newline at end of file diff --git a/Assets/Scripts/UVC/Data/Core/DataObject.cs b/Assets/Scripts/UVC/Data/Core/DataObject.cs index e3026334..2ed053b7 100644 --- a/Assets/Scripts/UVC/Data/Core/DataObject.cs +++ b/Assets/Scripts/UVC/Data/Core/DataObject.cs @@ -73,6 +73,31 @@ namespace UVC.Data.Core } } + private bool createdFromPool = false; + + /// + /// 객체가 풀에서 생성되었는지 여부를 나타냅니다. + /// + internal bool CreatedFromPool + { + get => createdFromPool; + set + { + createdFromPool = value; + foreach (var item in this) + { + if (item.Value is DataObject dataObject) + { + dataObject.CreatedFromPool = value; // 내부 DataObject도 풀에 있다고 표시합니다. + } + else if (item.Value is DataArray dataArray) + { + dataArray.CreatedFromPool = value; // 내부 DataArray도 풀에 있다고 표시합니다. + } + } + } + } + /// /// 객체의 고유 식별자를 나타내는 속성입니다. DataArray에서 데이터를 식별하는 데 사용됩니다. /// @@ -858,7 +883,14 @@ namespace UVC.Data.Core public void ReturnToPool() { - DataObjectPool.Return(this); + if (CreatedFromPool) + { + Reset(); + } + else + { + DataObjectPool.Return(this); + } } /// diff --git a/Assets/Scripts/UVC/Data/Core/DataObjectPool.cs b/Assets/Scripts/UVC/Data/Core/DataObjectPool.cs index 91fed709..a98c378f 100644 --- a/Assets/Scripts/UVC/Data/Core/DataObjectPool.cs +++ b/Assets/Scripts/UVC/Data/Core/DataObjectPool.cs @@ -49,7 +49,7 @@ namespace UVC.Data.Core // maxPoolSize만큼의 DataObject 인스턴스를 미리 생성하여 풀에 추가합니다. for (int i = 0; i < maxPoolSize; i++) { - pool.Enqueue(new DataObject() { IsInPool = true }); + pool.Enqueue(new DataObject() { IsInPool = true, CreatedFromPool = true }); } } @@ -90,7 +90,7 @@ namespace UVC.Data.Core { obj.IsInPool = false; } - return fromPool ? obj : new DataObject(); + return fromPool ? obj : new DataObject() { CreatedFromPool = true }; } /// diff --git a/Assets/Scripts/UVC/Data/DataRepository.cs b/Assets/Scripts/UVC/Data/DataRepository.cs index 4bb9f74e..bc21cbcd 100644 --- a/Assets/Scripts/UVC/Data/DataRepository.cs +++ b/Assets/Scripts/UVC/Data/DataRepository.cs @@ -1,4 +1,5 @@ -using Newtonsoft.Json; +using Cysharp.Threading.Tasks; +using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; @@ -54,7 +55,6 @@ namespace UVC.Data /// private Dictionary> dataUpdateHandlers = new Dictionary>(); - private HttpDataFetcher httpFetcher = new HttpDataFetcher(); public HttpDataFetcher HttpFetcher => httpFetcher; @@ -85,7 +85,7 @@ namespace UVC.Data dataObjects.Add(key, newData); dataObject.MarkAllAsUpdated(); - //UniTask.Post(() => NotifyDataUpdate(key, newData)); + NotifyDataUpdate(key, newData); return dataObject; } else @@ -101,7 +101,7 @@ namespace UVC.Data { newDataObject = dataObject; } - //UniTask.Post(() => NotifyDataUpdate(key, obj)); + NotifyDataUpdate(key, obj); return newDataObject; } } @@ -155,24 +155,24 @@ namespace UVC.Data /// 핸들러는 해당 키의 데이터가 AddData를 통해 업데이트될 때마다 호출됩니다. /// 전달 되는 데이터 객체는 업데이트된 상태고 DataRepository에 저장된 객체이기에 pool.ReturnToPool()을 호출하면 않됩니다. /// - //public void AddDataUpdateHandler(string key, Action handler) - //{ - // if (string.IsNullOrEmpty(key)) - // throw new ArgumentNullException(nameof(key), "키는 null이거나 빈 문자열일 수 없습니다."); - // if (handler == null) - // throw new ArgumentNullException(nameof(handler), "핸들러는 null일 수 없습니다."); - // lock (syncLock) - // { - // if (!dataUpdateHandlers.ContainsKey(key)) - // { - // dataUpdateHandlers[key] = handler; - // } - // else - // { - // dataUpdateHandlers[key] += handler; // 기존 핸들러에 추가 - // } - // } - //} + public void AddDataUpdateHandler(string key, Action handler) + { + if (string.IsNullOrEmpty(key)) + throw new ArgumentNullException(nameof(key), "키는 null이거나 빈 문자열일 수 없습니다."); + if (handler == null) + throw new ArgumentNullException(nameof(handler), "핸들러는 null일 수 없습니다."); + lock (syncLock) + { + if (!dataUpdateHandlers.ContainsKey(key)) + { + dataUpdateHandlers[key] = handler; + } + else + { + dataUpdateHandlers[key] += handler; // 기존 핸들러에 추가 + } + } + } /// /// 지정된 키에서 데이터 업데이트 핸들러를 제거합니다. @@ -183,24 +183,24 @@ namespace UVC.Data /// 지정된 키에 연결된 핸들러가 없거나, 제거하려는 핸들러가 등록되지 않은 경우 아무 작업도 수행하지 않습니다. /// 키에 연결된 마지막 핸들러가 제거되면 해당 키는 dataUpdateHandlers 딕셔너리에서 삭제됩니다. /// - //public void RemoveDataUpdateHandler(string key, Action handler) - //{ - // if (string.IsNullOrEmpty(key)) - // throw new ArgumentNullException(nameof(key), "키는 null이거나 빈 문자열일 수 없습니다."); - // if (handler == null) - // throw new ArgumentNullException(nameof(handler), "핸들러는 null일 수 없습니다."); - // lock (syncLock) - // { - // if (dataUpdateHandlers.ContainsKey(key)) - // { - // dataUpdateHandlers[key] -= handler; // 기존 핸들러에서 제거 - // if (dataUpdateHandlers[key] == null) - // { - // dataUpdateHandlers.Remove(key); // 핸들러가 없으면 제거 - // } - // } - // } - //} + public void RemoveDataUpdateHandler(string key, Action handler) + { + if (string.IsNullOrEmpty(key)) + throw new ArgumentNullException(nameof(key), "키는 null이거나 빈 문자열일 수 없습니다."); + if (handler == null) + throw new ArgumentNullException(nameof(handler), "핸들러는 null일 수 없습니다."); + lock (syncLock) + { + if (dataUpdateHandlers.ContainsKey(key)) + { + dataUpdateHandlers[key] -= handler; // 기존 핸들러에서 제거 + if (dataUpdateHandlers[key] == null) + { + dataUpdateHandlers.Remove(key); // 핸들러가 없으면 제거 + } + } + } + } /// /// 모든 데이터 업데이트 핸들러를 제거합니다. @@ -210,13 +210,13 @@ namespace UVC.Data /// 예를 들어, 씬이 변경되거나 애플리케이션이 종료될 때 /// 모든 핸들러를 정리하는 데 유용합니다. /// - //public void ClearDataUpdateHandlers() - //{ - // lock (syncLock) - // { - // dataUpdateHandlers.Clear(); - // } - //} + public void ClearDataUpdateHandlers() + { + lock (syncLock) + { + dataUpdateHandlers.Clear(); + } + } /// /// 지정된 키의 데이터가 업데이트되었음을 알리고 등록된 핸들러들을 호출합니다. @@ -227,20 +227,20 @@ namespace UVC.Data /// 이 메서드는 주로 내부적으로 AddOrUpdateData 메서드에서 호출되어 /// 특정 키의 데이터가 변경되었을 때 등록된 핸들러들에게 알립니다. /// - //private void NotifyDataUpdate(string key, IDataObject dataObject) - //{ - // if (string.IsNullOrEmpty(key)) - // throw new ArgumentNullException(nameof(key), "키는 null이거나 빈 문자열일 수 없습니다."); - // if (dataObject == null) - // throw new ArgumentNullException(nameof(dataObject), "데이터 객체는 null일 수 없습니다."); - // lock (syncLock) - // { - // if (dataUpdateHandlers.ContainsKey(key)) - // { - // dataUpdateHandlers[key]?.Invoke(dataObject); - // } - // } - //} + private void NotifyDataUpdate(string key, IDataObject dataObject) + { + if (string.IsNullOrEmpty(key)) + throw new ArgumentNullException(nameof(key), "키는 null이거나 빈 문자열일 수 없습니다."); + if (dataObject == null) + throw new ArgumentNullException(nameof(dataObject), "데이터 객체는 null일 수 없습니다."); + lock (syncLock) + { + if (dataUpdateHandlers.ContainsKey(key)) + { + UniTask.Post(() => dataUpdateHandlers[key]!.Invoke(dataObject)); + } + } + } /// /// 저장소에 저장된 모든 데이터 객체의 키 목록을 반환합니다. diff --git a/Assets/Scripts/UVC/Data/Http/HttpDataFetcher.cs b/Assets/Scripts/UVC/Data/Http/HttpDataFetcher.cs index 05e97be0..01d760c9 100644 --- a/Assets/Scripts/UVC/Data/Http/HttpDataFetcher.cs +++ b/Assets/Scripts/UVC/Data/Http/HttpDataFetcher.cs @@ -53,7 +53,7 @@ namespace UVC.Data.Http /// // 단일 요청 설정 및 등록 /// var singleRequest = new HttpRequestConfig("https://api.example.com/data") /// .setDataMapper(dataMapper) - /// .setHandler(data => { + /// .setSuccessHandler(data => { /// // 데이터 처리 로직 /// ULog.Debug($"데이터 수신: {data?.ToString() ?? "null"}"); /// }); @@ -62,16 +62,36 @@ namespace UVC.Data.Http /// // 반복 요청 설정 및 등록 /// var repeatingRequest = new HttpRequestConfig("https://api.example.com/status") /// .setDataMapper(dataMapper) - /// .setHandler(data => { + /// .setSuccessHandler(data => { /// // 상태 데이터 처리 /// ULog.Debug($"상태 업데이트: {data?.ToString() ?? "null"}"); /// }) /// .setRepeat(true, 0, 5000); // 5초마다 무한 반복 /// httpFetcher.Add("statusMonitor", repeatingRequest); /// + /// // 응답 분할 요청 설정 (예: 응답이 {"AGV": [...], "ALARM": [...]} 형태) + /// // 각 키에 맞는 DataMapper와 Validator를 준비합니다. + /// var agvMask = new DataMask { ["VHL_NAME"] = "차량명" }; + /// var alarmMask = new DataMask { ["MESSAGE"] = "메시지" }; + /// var agvMapper = new DataMapper(agvMask); + /// var alarmMapper = new DataMapper(alarmMask); + /// + /// var splitRequest = new HttpRequestConfig("https://api.example.com/baseinfo") + /// .setSplitResponseByKey(true) // 응답을 키별로 분할 + /// .AddSplitConfig("AGV", agvMapper) // "AGV" 키에 대한 매퍼 설정 + /// .AddSplitConfig("ALARM", alarmMapper); // "ALARM" 키에 대한 매퍼 설정 + /// httpFetcher.Add("baseInfo", splitRequest); + /// /// // 요청 실행 /// await httpFetcher.Excute("dataRequest"); // 단일 실행 /// await httpFetcher.Excute("statusMonitor"); // 반복 실행 시작 + /// await httpFetcher.Excute("baseInfo"); // 분할 요청 실행 + /// + /// // 분할된 데이터 확인 + /// var agvData = DataRepository.Instance.GetData("AGV"); + /// var alarmData = DataRepository.Instance.GetData("ALARM"); + /// ULog.Debug($"AGV Data from Repository: {agvData}"); + /// ULog.Debug($"Alarm Data from Repository: {alarmData}"); /// /// // 나중에 반복 요청 중지 /// httpFetcher.StopRepeat("statusMonitor"); @@ -245,235 +265,9 @@ namespace UVC.Data.Http result = await HttpRequester.Request(info.Url, info.Method, info.Body, info.Headers); } - // 응답 처리 전에 다시 취소 요청 확인 - if (cancellationToken.IsCancellationRequested) - { - throw new OperationCanceledException("Operation cancelled", cancellationToken); - } - - result = result.Trim(); + cancellationToken.ThrowIfCancellationRequested(); - if (!string.IsNullOrEmpty(result)) - { - try - { - HttpResponseResult responseResult = info.ResponseMask.Apply(result); - // 응답 마스크 적용 결과가 성공이 아니면 실패 핸들러 호출 후 반환 - if (!responseResult.IsSuccess) - { - if (info.FailHandler != null) - { - string errorMessage = responseResult.Message!; - - // UI 스레드에서 실패 핸들러 호출 - await UniTask.SwitchToMainThread(); - info.FailHandler.Invoke(errorMessage); - } - return; - } - else - { - result = responseResult.Data!.Trim(); - } - - - if (result.StartsWith("{")) - { - if (info.Validator != null) - { - if (info.Validator.SupportsStreamParsing && result.Length > info.Validator.SupportsStreamLength) - { - using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(result))) - { - if (info.Validator != null && !info.Validator.IsValid(stream)) - { - if (info.FailHandler != null) - { - // UI 스레드에서 실패 핸들러 호출 - await UniTask.SwitchToMainThread(); - info.FailHandler.Invoke("Data is not Valid"); - } - return; - } - } - } - else - { - JObject source = JObject.Parse(result); - if (info.Validator != null && !info.Validator.IsValid(source)) - { - if (info.FailHandler != null) - { - // UI 스레드에서 실패 핸들러 호출 - await UniTask.SwitchToMainThread(); - info.FailHandler.Invoke("Data is not Valid"); - } - return; - } - } - } - - if (info.DataMapper != null) - { - if (info.DataMapper.SupportsStreamParsing && result.Length > info.DataMapper.SupportsStreamLength) - { - using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(result))) - { - mappedObject = info.DataMapper.MapObjectStream(stream); - } - } - else - { - JObject source = JObject.Parse(result); - mappedObject = info.DataMapper.Map(source); - } - } - else - { - mappedObject = new DataObject(result); - } - } - else if (result.StartsWith("[")) - { - if (info.Validator != null) - { - if (info.Validator.SupportsStreamParsing && result.Length > info.Validator.SupportsStreamLength) - { - using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(result))) - { - JArray? validSource = info.Validator.GetValidData(stream); - if (validSource == null) - { - if (info.FailHandler != null) - { - // UI 스레드에서 실패 핸들러 호출 - await UniTask.SwitchToMainThread(); - info.FailHandler.Invoke("Data is not Valid"); - } - return; - } - } - } - else - { - JArray source = JArray.Parse(result); - JArray? validSource = info.Validator.GetValidData(source); - if (validSource == null) - { - if (info.FailHandler != null) - { - // UI 스레드에서 실패 핸들러 호출 - await UniTask.SwitchToMainThread(); - info.FailHandler.Invoke("Data is not Valid"); - } - return; - } - } - } - - if (info.DataMapper != null) - { - if (info.DataMapper.SupportsStreamParsing && result.Length > info.DataMapper.SupportsStreamLength) - { - using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(result))) - { - if (info.Validator != null) - { - JArray? validSource = info.Validator.GetValidData(stream); - if (validSource != null) - { - mappedObject = info.DataMapper.Map(validSource); - } - } - else - { - mappedObject = info.DataMapper.MapArrayStream(stream); - } - } - } - else - { - JArray source = JArray.Parse(result); - if (info.Validator != null) - { - JArray? validSource = info.Validator.GetValidData(source); - if (validSource != null) - { - mappedObject = info.DataMapper.Map(validSource); - } - } - else - { - mappedObject = info.DataMapper.Map(source); - } - } - } - else - { - // DataMapper가 없는 경우, JArray를 IDataObject로 변환 - mappedObject = new DataArray(result); - } - } - } - catch (JsonException ex) - { - ULog.Error($"JSON parsing error in ExecuteSingle for {key}: {ex.Message}\nResponse: {result}", ex); - throw; // 상위에서 처리하도록 다시 throw - } - } - - // 핸들러 호출 전에 다시 취소 요청 확인 - if (cancellationToken.IsCancellationRequested) - { - throw new OperationCanceledException("Operation cancelled", cancellationToken); - } - - var repoObject = mappedObject; - if (mappedObject != null) - { - repoObject = DataRepository.Instance.AddOrUpdateData(key, mappedObject, info.UpdatedDataOnly); - if (repoObject == mappedObject) repoObject = mappedObject.Clone(fromPool: false); - } - - - // 갱신 된 데이터가 있는 경우 핸들러 호출 - if (info.UpdatedDataOnly) - { - if (repoObject != null && repoObject.UpdatedCount > 0) - { - if (info.SuccessHandler != null) - { - // 로컬 변수로 복사하여 클로저에서 안전하게 사용 - var handlerData = repoObject; - // UI 스레드에서 성공 핸들러 호출 - await UniTask.SwitchToMainThread(); - info.SuccessHandler.Invoke(handlerData); - } - return; - } - } - - - if (repoObject != null) - { - if (info.SuccessHandler != null) - { - // 로컬 변수로 복사하여 클로저에서 안전하게 사용 - var handlerData = repoObject; - // UI 스레드에서 성공 핸들러 호출 - await UniTask.SwitchToMainThread(); - info.SuccessHandler.Invoke(handlerData); - } - } - else - { - if (info.FailHandler != null) - { - // UI 스레드에서 실패 핸들러 호출 - await UniTask.SwitchToMainThread(); - info.FailHandler.Invoke("Data is Null"); - } - } + await HttpDataProcessor.ProcessResponseAsync(key, info, result, cancellationToken); return; } diff --git a/Assets/Scripts/UVC/Data/Http/HttpDataProcessor.cs b/Assets/Scripts/UVC/Data/Http/HttpDataProcessor.cs new file mode 100644 index 00000000..ff237c6d --- /dev/null +++ b/Assets/Scripts/UVC/Data/Http/HttpDataProcessor.cs @@ -0,0 +1,395 @@ +#nullable enable + +using Cysharp.Threading.Tasks; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.IO; +using System.Text; +using System.Threading; +using UVC.Data.Core; +using UVC.Log; + +namespace UVC.Data.Http +{ + /// + /// HTTP 응답 데이터를 처리하는 정적 클래스입니다. + /// + /// + /// 이 클래스는 `HttpDataFetcher`로부터 데이터 처리 로직을 분리하여 재사용성을 높입니다. + /// HTTP 응답(문자열)을 입력받아, 설정된 규칙(`HttpRequestConfig`)에 따라 파싱, 유효성 검사, + /// 데이터 변환(`IDataObject`로 매핑) 및 결과 핸들러 호출까지의 과정을 담당합니다. + /// 모든 메서드는 정적(static)이므로 인스턴스 생성 없이 사용할 수 있습니다. + /// + public static class HttpDataProcessor + { + /// + /// HTTP 응답 문자열을 비동기적으로 처리하고, 결과를 IDataObject로 변환한 후 적절한 핸들러를 호출합니다. + /// + /// 요청을 식별하는 고유 키. 로그 및 데이터 저장소에서 사용됩니다. + /// HTTP 요청에 대한 모든 설정(URL, 매퍼, 핸들러 등)을 담고 있는 객체입니다. + /// HTTP 요청으로부터 받은 원시 응답 문자열입니다. + /// 비동기 작업을 취소하기 위한 토큰입니다. + /// + /// 이 메서드는 다음과 같은 순서로 응답을 처리합니다. + /// 1. 응답 문자열이 비어 있는지 확인합니다. + /// 2. `HttpResponseMask`를 적용하여 응답의 성공 여부를 판단하고 실제 데이터 부분을 추출합니다. + /// 3. 데이터가 분할 처리(Split) 대상인지, 단일 객체(Object)인지, 배열(Array)인지 확인하고 각각의 처리 메서드를 호출합니다. + /// 4. 처리된 데이터(`IDataObject`)를 `DataRepository`에 추가하거나 업데이트합니다. + /// 5. 설정에 따라 성공(`SuccessHandler`) 또는 실패(`FailHandler`) 핸들러를 메인 스레드에서 호출하여 UI 업데이트 등을 안전하게 처리할 수 있도록 합니다. + /// 6. 모든 과정에서 발생하는 예외(JSON 파싱, 작업 취소 등)를 처리하고 로그를 남깁니다. + /// + public static async UniTask ProcessResponseAsync(string key, HttpRequestConfig info, string responseContent, CancellationToken cancellationToken) + { + // 매핑된 최종 데이터 객체를 담을 변수입니다. try-finally 블록에서 자원 해제를 위해 외부에 선언합니다. + IDataObject? mappedObject = null; + try + { + // 앞뒤 공백 제거 + responseContent = responseContent.Trim(); + + // 응답이 비어있으면 실패로 간주하고 FailHandler를 호출합니다. + if (string.IsNullOrEmpty(responseContent)) + { + // 핸들러는 UI와 상호작용할 수 있으므로 메인 스레드에서 호출합니다. + if (info.FailHandler != null) + { + await UniTask.SwitchToMainThread(); + info.FailHandler.Invoke("Response content is null or empty."); + } + return; + } + + // ResponseMask를 사용해 응답이 성공적인지 확인하고, 실제 데이터 부분을 추출합니다. + // 예를 들어, 응답이 {"status":"OK", "data":{...}} 형태일 때, "status"가 "OK"인지 확인하고 "data" 부분만 가져옵니다. + HttpResponseResult responseResult = info.ResponseMask.Apply(responseContent); + if (!responseResult.IsSuccess) + { + if (info.FailHandler != null) + { + string errorMessage = responseResult.Message!; + await UniTask.SwitchToMainThread(); + info.FailHandler.Invoke(errorMessage); + } + return; + } + + // 마스크를 통해 추출된 실제 데이터 + responseContent = responseResult.Data!.Trim(); + + // 응답을 최상위 키를 기준으로 분할 처리해야 하는 경우 + if (info.SplitResponseByKey && responseContent.StartsWith("{")) + { + await ProcessSplitResponse(info, responseContent, cancellationToken); + return; // 분할 처리가 완료되면 이 메서드의 나머지 로직은 실행하지 않습니다. + } + // 응답이 JSON 객체 형태인 경우 (e.g., {"id": 1, "name": "item"}) + else if (responseContent.StartsWith("{")) + { + mappedObject = await ProcessObjectResponse(info, responseContent, cancellationToken); + if (mappedObject == null) return; + } + // 응답이 JSON 배열 형태인 경우 (e.g., [{"id": 1}, {"id": 2}]) + else if (responseContent.StartsWith("[")) + { + mappedObject = await ProcessArrayResponse(info, responseContent, cancellationToken); + if (mappedObject == null) return; + } + + // 핸들러 호출 전 작업 취소 요청이 있었는지 다시 확인합니다. + cancellationToken.ThrowIfCancellationRequested(); + + // 매핑된 데이터를 DataRepository에 저장하거나 업데이트합니다. + var repoObject = mappedObject; + if (mappedObject != null) + { + // DataRepository는 모든 데이터를 중앙에서 관리하는 저장소입니다. + repoObject = DataRepository.Instance.AddOrUpdateData(key, mappedObject, info.UpdatedDataOnly); + // 만약 반환된 객체가 원본과 같다면, 핸들러에 전달하기 위해 복제본을 만듭니다. + if (repoObject == mappedObject) repoObject = mappedObject.Clone(fromPool: false); + } + + // 'UpdatedDataOnly' 옵션이 켜져 있고, 실제로 데이터가 업데이트되었을 때만 핸들러를 호출합니다. + if (info.UpdatedDataOnly) + { + if (repoObject != null && repoObject.UpdatedCount > 0) + { + if (info.SuccessHandler != null) + { + var handlerData = repoObject; + await UniTask.SwitchToMainThread(); + info.SuccessHandler.Invoke(handlerData); + } + return; + } + } + + // 최종적으로 처리된 데이터가 있는 경우 성공 핸들러를 호출합니다. + if (repoObject != null) + { + if (info.SuccessHandler != null) + { + var handlerData = repoObject; + await UniTask.SwitchToMainThread(); + info.SuccessHandler.Invoke(handlerData); + } + } + // 처리된 데이터가 없는 경우 실패 핸들러를 호출합니다. + else + { + if (info.FailHandler != null) + { + await UniTask.SwitchToMainThread(); + info.FailHandler.Invoke("Data is Null"); + } + } + } + catch (JsonException ex) + { + // JSON 파싱 중 오류가 발생한 경우 + ULog.Error($"JSON parsing error for {key}: {ex.Message}\nResponse: {responseContent}", ex); + if (info.FailHandler != null) + { + await UniTask.SwitchToMainThread(); + info.FailHandler.Invoke($"JSON parsing error: {ex.Message}"); + } + } + catch (OperationCanceledException) + { + // 작업이 외부에서 취소된 경우, 예외를 다시 던져 상위 호출자에게 알립니다. + throw; + } + catch (Exception ex) + { + // 그 외 모든 예외 처리 + ULog.Error($"Error processing response for {key}: {ex.Message}", ex); + if (info.FailHandler != null) + { + await UniTask.SwitchToMainThread(); + info.FailHandler.Invoke($"Error processing response: {ex.Message}"); + } + } + finally + { + // 매핑 과정에서 생성된 IDataObject 객체는 내부적으로 풀링될 수 있습니다. + // 처리가 끝난 객체는 다시 풀에 반환하여 메모리 할당을 줄입니다. + mappedObject?.ReturnToPool(); + } + } + + /// + /// 키-값 형태의 JSON 응답을 각 키별로 분할하여 처리합니다. + /// + /// HTTP 요청 설정 객체. + /// 분할할 JSON 객체 문자열. + /// 비동기 작업을 위한 취소 토큰. + /// + /// 예를 들어, `{"AGV": [...], "ALARM": [...]}` 같은 응답을 받으면, + /// "AGV"와 "ALARM"을 각각 별개의 데이터로 간주하고 처리합니다. + /// 각 키에 대해 별도의 DataMapper나 Validator를 `HttpRequestConfig`에 설정할 수 있습니다. + /// + public static async UniTask ProcessSplitResponse(HttpRequestConfig info, string jsonResponse, CancellationToken? cancellationToken = null) + { + JObject responseObject = JObject.Parse(jsonResponse); + // JSON 객체의 모든 프로퍼티(키-값 쌍)를 순회합니다. + foreach (var property in responseObject.Properties()) + { + cancellationToken?.ThrowIfCancellationRequested(); + + string subKey = property.Name; // "AGV", "ALARM" 등 + JToken subToken = property.Value; // `[...]` 또는 `{...}` + IDataObject? subMappedObject = null; + + // 현재 키(subKey)에 대한 분할 설정을 가져옵니다. + DataMapperValidator? splitConfig = null; + if (info.SplitConfigs != null) info.SplitConfigs.TryGetValue(subKey, out splitConfig); + + // 분할 설정에 지정된 매퍼와 유효성 검사기를 사용합니다. 없으면 null입니다. + var subKeyDataMapper = splitConfig?.DataMapper; + var subKeyValidator = splitConfig?.Validator; + + try + { + // 하위 데이터가 배열 또는 객체 형태인지에 따라 적절한 처리 메서드를 호출합니다. + if (subToken is JArray) + { + // 분할 처리 중 개별 항목의 실패가 전체 실패로 이어지지 않도록 `invokeFailHandler`를 false로 설정합니다. + subMappedObject = await ProcessArrayResponse(info, subToken.ToString(), cancellationToken, subKeyDataMapper, subKeyValidator, invokeFailHandler: false); + } + else if (subToken is JObject) + { + subMappedObject = await ProcessObjectResponse(info, subToken.ToString(), cancellationToken, subKeyDataMapper, subKeyValidator, invokeFailHandler: false); + } + + // 매핑된 결과가 없으면 (예: 유효성 검사 실패) 다음 키로 넘어갑니다. + if (subMappedObject == null) + { + continue; + } + + // 분할된 데이터를 `subKey`를 키로 사용하여 DataRepository에 저장합니다. + var repoObject = DataRepository.Instance.AddOrUpdateData(subKey, subMappedObject, info.UpdatedDataOnly); + + // 핸들러 호출 조건(데이터가 있거나, 업데이트된 경우)을 확인합니다. + bool shouldInvokeHandler = repoObject != null && (!info.UpdatedDataOnly || repoObject.UpdatedCount > 0); + + if (shouldInvokeHandler && info.SuccessHandler != null) + { + var handlerData = repoObject.Clone(fromPool: false); + await UniTask.SwitchToMainThread(); + info.SuccessHandler.Invoke(handlerData); + // 다음 키 처리를 위해 다시 스레드 풀로 전환합니다. + await UniTask.SwitchToThreadPool(); + } + } + finally + { + // 사용이 끝난 객체는 풀에 반환합니다. + subMappedObject?.ReturnToPool(); + } + } + } + + private static async UniTask ProcessObjectResponse(HttpRequestConfig info, string jsonResponse, CancellationToken? cancellationToken, DataMapper? dataMapper = null, DataValidator? validator = null, bool invokeFailHandler = true) + { + Action? failHandler = invokeFailHandler ? info.FailHandler : null; + return await ProcessObjectResponse(jsonResponse, cancellationToken, dataMapper ?? info.DataMapper, validator ?? info.Validator, failHandler); + } + + /// + /// 단일 JSON 객체 응답을 검증하고 매핑합니다. + /// + /// 처리할 JSON 객체 문자열. + /// 취소 토큰. + /// 사용할 데이터 매퍼. null이면 원시 데이터를 반환합니다. + /// 사용할 유효성 검사기. null이면 검사를 생략합니다. + /// 실패 시 호출할 핸들러. + /// 매핑된 IDataObject 또는 null(실패 시). + /// + /// 이 메서드는 먼저 `DataValidator`를 통해 데이터의 유효성을 검사하고, + /// 통과하면 `DataMapper`를 사용해 JSON을 `IDataObject`로 변환합니다. + /// 대용량 JSON의 경우 메모리 효율을 위해 스트림 기반 파싱을 지원합니다. + /// + public static async UniTask ProcessObjectResponse(string jsonResponse, CancellationToken? cancellationToken, DataMapper? dataMapper, DataValidator? validator, Action? failHandler) + { + // 유효성 검사기가 설정된 경우 + if (validator != null) + { + bool isValid; + // 스트림 파싱을 지원하고 데이터가 충분히 큰 경우, 스트림으로 유효성을 검사합니다. + if (validator.SupportsStreamParsing && jsonResponse.Length > validator.SupportsStreamLength) + { + using var stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonResponse)); + isValid = validator.IsValid(stream); + } + else + { + JObject source = JObject.Parse(jsonResponse); + isValid = validator.IsValid(source); + } + + // 유효성 검사에 실패하면 실패 핸들러를 호출하고 null을 반환합니다. + if (!isValid) + { + if (failHandler != null) + { + await UniTask.SwitchToMainThread(); + failHandler.Invoke("Data is not Valid"); + } + return null; + } + } + + cancellationToken?.ThrowIfCancellationRequested(); + + // 데이터 매퍼가 설정된 경우 + if (dataMapper != null) + { + // 스트림 파싱 지원 여부에 따라 매핑 방식을 선택합니다. + if (dataMapper.SupportsStreamParsing && jsonResponse.Length > dataMapper.SupportsStreamLength) + { + using var stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonResponse)); + return dataMapper.MapObjectStream(stream); + } + else + { + JObject source = JObject.Parse(jsonResponse); + return dataMapper.Map(source); + } + } + else + { + // 매퍼가 없으면 원시 JSON 문자열을 그대로 `DataObject`로 감싸 반환합니다. + return new DataObject(jsonResponse); + } + } + + private static async UniTask ProcessArrayResponse(HttpRequestConfig info, string jsonResponse, CancellationToken? cancellationToken, DataMapper? dataMapper = null, DataValidator? validator = null, bool invokeFailHandler = true) + { + Action? failHandler = invokeFailHandler ? info.FailHandler : null; + return await ProcessArrayResponse(jsonResponse, cancellationToken, dataMapper ?? info.DataMapper, validator ?? info.Validator, failHandler); + } + + /// + /// JSON 배열 응답을 검증하고 매핑합니다. + /// + /// 처리할 JSON 배열 문자열. + /// 취소 토큰. + /// 사용할 데이터 매퍼. null이면 원시 데이터를 반환합니다. + /// 사용할 유효성 검사기. null이면 검사를 생략합니다. + /// 실패 시 호출할 핸들러. + /// 매핑된 IDataObject(보통 DataArray) 또는 null(실패 시). + /// + /// `DataValidator`를 통해 배열의 각 항목을 필터링하여 유효한 데이터만 포함하는 새 배열을 만들 수 있습니다. + /// 그 후 `DataMapper`를 통해 배열 전체를 `DataArray` 객체로 변환합니다. + /// + public static async UniTask ProcessArrayResponse(string jsonResponse, CancellationToken? cancellationToken, DataMapper? dataMapper, DataValidator? validator, Action? failHandler) + { + JArray? sourceArray; + + // 유효성 검사기가 설정된 경우 + if (validator != null) + { + // 스트림 파싱 지원 여부에 따라 유효한 데이터만 필터링합니다. + if (validator.SupportsStreamParsing && jsonResponse.Length > validator.SupportsStreamLength) + { + using var stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonResponse)); + sourceArray = validator.GetValidData(stream); + } + else + { + sourceArray = validator.GetValidData(JArray.Parse(jsonResponse)); + } + + // 유효한 데이터가 하나도 없는 경우 + if (sourceArray == null || sourceArray.Count == 0) + { + if (failHandler != null) + { + await UniTask.SwitchToMainThread(); + failHandler.Invoke("Data is not Valid or empty after validation"); + } + return null; + } + } + else + { + // 검사기가 없으면 원본 배열을 그대로 사용합니다. + sourceArray = JArray.Parse(jsonResponse); + } + + cancellationToken?.ThrowIfCancellationRequested(); + + // 데이터 매퍼가 설정된 경우, 필터링된 배열을 매핑합니다. + if (dataMapper != null) + { + return dataMapper.Map(sourceArray); + } + else + { + // 매퍼가 없으면 필터링된 배열을 `DataArray`로 감싸 반환합니다. + return new DataArray(sourceArray.ToString()); + } + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/UVC/Data/Http/HttpDataProcessor.cs.meta b/Assets/Scripts/UVC/Data/Http/HttpDataProcessor.cs.meta new file mode 100644 index 00000000..a7f730b0 --- /dev/null +++ b/Assets/Scripts/UVC/Data/Http/HttpDataProcessor.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: fb7c200bb8a6d244f8d66049bd64e12f \ No newline at end of file diff --git a/Assets/Scripts/UVC/Data/Http/HttpRequestConfig.cs b/Assets/Scripts/UVC/Data/Http/HttpRequestConfig.cs index 49e13fe0..4936d79b 100644 --- a/Assets/Scripts/UVC/Data/Http/HttpRequestConfig.cs +++ b/Assets/Scripts/UVC/Data/Http/HttpRequestConfig.cs @@ -1,6 +1,5 @@ #nullable enable -using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using UVC.Data.Core; @@ -24,6 +23,18 @@ namespace UVC.Data.Http /// .setFailHandler(errorData => Console.Error.WriteLine(errorData)) // 실패 핸들러 예시 /// .setRetry(5, 2000) /// .setRepeat(true, 10, 5000); + /// + /// // 응답을 키별로 분할하는 설정 + /// // 응답이 {"AGV": [...], "ALARM": [...]} 형태일 때 사용 + /// var splitConfig = new HttpRequestConfig("https://api.example.com/alldata") + /// .setSplitResponseByKey(true) // 이 옵션을 활성화 + /// .AddSplitConfig("AGV", new DataMapper(agvMask), agvValidator) + /// .AddSplitConfig("ALARM", new DataMapper(alarmMask)) + /// .setSuccessHandler(splitData => { + /// // HttpDataFetcher 구현에 따라, 분할된 각 데이터가 처리된 후 이 핸들러가 호출될 수 있습니다. + /// // 이 경우 핸들러의 IDataObject는 null일 수 있습니다. + /// Console.WriteLine("Split data processing completed."); + /// }); /// /// public class HttpRequestConfig @@ -38,10 +49,12 @@ namespace UVC.Data.Http private int _repeatCount = 0; // 반복 횟수, 0은 무한 반복 private int _repeatInterval = 1000; // 반복 간격 (ms) private DataMapper? _dataMapper = null; // 데이터 매퍼 + private Dictionary? _splitConfigs = null; // 분할 응답에 대한 구성 private HttpResponseMask _responseMask = new HttpResponseMask(); // response 데이터 성공 여부와 데이터를 구분하는 마스크 private int _maxRetryCount = 3; private int _retryDelay = 1000; // 밀리초 private bool _updatedDataOnly = false; // 업데이트된 데이터만 받을 여부 + private bool _splitResponseByKey = false; // 응답을 키별로 분할할지 여부 /// /// HTTP 응답 데이터의 유효성을 검사하는 데 사용되는 검사기입니다. @@ -139,6 +152,11 @@ namespace UVC.Data.Http /// public DataValidator? Validator => _validator; + /// + /// 분할된 응답의 각 키에 대한 구성을 포함합니다. + /// + public IReadOnlyDictionary? SplitConfigs => _splitConfigs; + /// /// HTTP 응답의 성공 여부를 확인하고, 성공 시 실제 데이터 페이로드를 추출하는 데 사용되는 입니다. /// 이 객체에 정의된 규칙에 따라 원시 응답 문자열이 처리됩니다. @@ -160,6 +178,11 @@ namespace UVC.Data.Http /// public bool UpdatedDataOnly => _updatedDataOnly; + /// + /// 응답 JSON을 최상위 키를 기준으로 분할하여 각각 DataRepository에 저장할지 여부를 나타냅니다. + /// + public bool SplitResponseByKey => _splitResponseByKey; + /// /// HttpRequestConfig 클래스의 새 인스턴스를 초기화합니다. /// @@ -236,6 +259,23 @@ namespace UVC.Data.Http return this; } + /// + /// 분할된 응답의 특정 키에 대한 구성을 추가합니다. + /// + /// 구성할 응답의 키입니다. + /// 이 키에 사용할 데이터 매퍼입니다. + /// 이 키에 사용할 데이터 유효성 검사기입니다. + /// 현재 HttpRequestConfig 인스턴스 (메서드 체이닝용) + public HttpRequestConfig AddSplitConfig(string key, DataMapperValidator? dataMapperValidator = null) + { + if (_splitConfigs == null) + { + _splitConfigs = new Dictionary(); + } + if(dataMapperValidator != null)_splitConfigs[key] = dataMapperValidator; + return this; + } + /// /// HTTP 파이프라인에 적용할 ResponseMask를 설정하고 업데이트된 파이프라인 구성을 반환합니다. /// @@ -319,5 +359,18 @@ namespace UVC.Data.Http return this; } + /// + /// 응답 JSON을 최상위 키를 기준으로 분할하여 처리할지 여부를 설정합니다. + /// true로 설정하면, 응답이 {"key1": [...], "key2": [...]} 형태일 때, + /// key1과 key2를 각각의 키로 사용하여 DataRepository에 데이터를 추가/업데이트합니다. + /// + /// 분할 처리 여부 + /// 현재 HttpRequestConfig 인스턴스 (메서드 체이닝용) + public HttpRequestConfig setSplitResponseByKey(bool split) + { + _splitResponseByKey = split; + return this; + } + } } diff --git a/Assets/Scripts/UVC/Data/Mqtt/MqttDataReceiver.cs b/Assets/Scripts/UVC/Data/Mqtt/MqttDataReceiver.cs index 63ea0117..369ef171 100644 --- a/Assets/Scripts/UVC/Data/Mqtt/MqttDataReceiver.cs +++ b/Assets/Scripts/UVC/Data/Mqtt/MqttDataReceiver.cs @@ -5,9 +5,9 @@ using Newtonsoft.Json.Linq; using SampleProject.Config; using System; using System.Collections.Generic; -using System.Text; -using UnityEngine; +using System.Threading; using UVC.Data.Core; +using UVC.Data.Http; using UVC.Log; using UVC.Tests; @@ -170,6 +170,7 @@ namespace UVC.Data.Mqtt { if (!UseMockup) { + if (mqttWorker.IsRunning) return; foreach (var topic in topics) { mqttWorker.AddListener(topic, OnTopicPacketMessage); @@ -195,11 +196,11 @@ namespace UVC.Data.Mqtt /// 이 메서드를 호출하기 전에 매개변수가 null이 아닌지 확인하십시오. /// 처리할 객체 목록입니다. null일 수 없습니다. private void OnTopicPacketMessage(string topic, List packets) - { + { OnTopicMessage(topic, MqttDataPacket.ToJsonFromList(packets)); } - + private void OnTopicMessage(string topic, string message) { @@ -230,7 +231,7 @@ namespace UVC.Data.Mqtt /// 등록된 데이터 매퍼를 통해 메시지를 변환한 후, 해당 토픽에 등록된 핸들러에게 전달합니다. /// 'UpdatedDataOnly' 설정에 따라 데이터가 변경된 경우에만 핸들러를 호출할 수도 있습니다. /// - private void OnTopicMessageLogic(string topic, string message) + private async void OnTopicMessageLogic(string topic, string message) { // 토픽이 infoList와 readyHandlerList에 존재하고, 준비 상태가 true인 경우에만 처리합니다. if (infoList.ContainsKey(topic)) @@ -244,37 +245,11 @@ namespace UVC.Data.Mqtt { if (message.StartsWith("{")) { - JObject source = JObject.Parse(message); - if (info.Validator != null && !info.Validator.IsValid(source)) return; - if (info.DataMapper != null) - { - mappedObject = info.DataMapper.Map(source); - } - else - { - // DataMapper가 없으면 JObject를 IDataObject로 변환 - mappedObject = new DataObject(source); - } + mappedObject = await HttpDataProcessor.ProcessObjectResponse(message, null, info.DataMapper, info.Validator, null); } else if (message.StartsWith("[")) { - JArray source = JArray.Parse(message); - if (info.Validator != null) - { - JArray? validSource = info.Validator.GetValidData(source); - // 유효성 검사 실패 시 핸들러 호출을 중단 - if (validSource == null || validSource.Count == 0) return; - source = validSource; - } - if (info.DataMapper != null) - { - mappedObject = info.DataMapper.Map(source); - } - else - { - // DataMapper가 없으면 JArray를 IDataObject로 변환 - mappedObject = new DataArray(source); - } + mappedObject = await HttpDataProcessor.ProcessArrayResponse(message, null, info.DataMapper, info.Validator, null); } if (mappedObject == null) return; @@ -316,6 +291,7 @@ namespace UVC.Data.Mqtt { if (!UseMockup) { + if (!mqttWorker.IsRunning) return; foreach (var topic in infoList.Keys) { mqttWorker.RemoveListener(topic, OnTopicPacketMessage); diff --git a/Assets/Scripts/UVC/Data/Mqtt/MqttWorker.cs b/Assets/Scripts/UVC/Data/Mqtt/MqttWorker.cs index 68a0603d..de0cf126 100644 --- a/Assets/Scripts/UVC/Data/Mqtt/MqttWorker.cs +++ b/Assets/Scripts/UVC/Data/Mqtt/MqttWorker.cs @@ -36,6 +36,7 @@ namespace UVC.Data.Mqtt private Thread workerThread; private volatile bool isRunning = false; + public bool IsRunning => isRunning; /// /// 스레드를 안전하게 종료시키기 위한 CancellationTokenSource 입니다. diff --git a/Assets/Scripts/UVC/Data/URLList.cs b/Assets/Scripts/UVC/Data/URLList.cs index a7d29d5c..818db3c7 100644 --- a/Assets/Scripts/UVC/Data/URLList.cs +++ b/Assets/Scripts/UVC/Data/URLList.cs @@ -6,27 +6,27 @@ using System.Collections.Generic; namespace UVC.Data { /// - /// URL ּҸ Ű- ϰ ϴ ŬԴϴ. + /// URL 주소를 키-값 쌍으로 저장하고 관리하는 클래스입니다. /// public static class URLList { /// - /// URL ϴ Dictionary ÷ + /// URL을 저장하는 내부 Dictionary 컬렉션 /// private static Dictionary urls = new Dictionary(); public static IReadOnlyDictionary Urls => urls; /// - /// Ű URL ÷ǿ ߰մϴ. Ű ̹ ϸ URL Ʈմϴ. + /// 지정된 키와 URL을 컬렉션에 추가합니다. 키가 이미 존재하면 URL을 업데이트합니다. /// - /// URL ϱ Ű - /// URL ڿ + /// URL에 접근하기 위한 고유 키 + /// 저장할 URL 문자열 /// /// /// URLList.Add("google", "https://www.google.com"); /// URLList.Add("naver", "https://www.naver.com"); /// - /// // Ű URL Ʈ + /// // 기존 키의 URL 업데이트 /// URLList.Add("google", "https://www.google.co.kr"); /// /// @@ -43,17 +43,17 @@ namespace UVC.Data } /// - /// Ű شϴ URL ÷ǿ մϴ. + /// 지정된 키에 해당하는 URL을 컬렉션에서 제거합니다. /// - /// URL Ű + /// 제거할 URL의 키 /// /// /// URLList.Add("temp", "https://www.temp.com"); /// - /// // URL + /// // URL 제거 /// URLList.Remove("temp"); /// - /// // ʴ Ű õ(ƹ ϵ ߻ ) + /// // 존재하지 않는 키 제거 시도(아무 일도 발생하지 않음) /// URLList.Remove("nonexistent"); /// /// @@ -66,23 +66,23 @@ namespace UVC.Data } /// - /// Ű ÷ǿ ϴ Ȯմϴ. + /// 지정된 키가 컬렉션에 존재하는지 확인합니다. /// - /// Ȯ Ű - /// Ű ϸ true, ׷ false + /// 확인할 키 + /// 키가 존재하면 true, 그렇지 않으면 false /// /// /// URLList.Add("github", "https://github.com"); /// - /// // Ű Ȯ + /// // 키 존재 여부 확인 /// if(URLList.ContainsKey("github")) /// { - /// Console.WriteLine("GitHub URL մϴ."); + /// Console.WriteLine("GitHub URL이 존재합니다."); /// } /// /// if(!URLList.ContainsKey("gitlab")) /// { - /// Console.WriteLine("GitLab URL ʽϴ."); + /// Console.WriteLine("GitLab URL이 존재하지 않습니다."); /// } /// /// @@ -92,26 +92,26 @@ namespace UVC.Data } /// - /// Ű شϴ URL ȯմϴ. + /// 지정된 키에 해당하는 URL을 반환합니다. /// - /// URL Ű - /// Ű شϴ URL Ǵ Ű null + /// 가져올 URL의 키 + /// 키에 해당하는 URL 또는 키가 존재하지 않을 경우 null /// /// /// URLList.Add("youtube", "https://www.youtube.com"); /// - /// // URL + /// // URL 가져오기 /// string youtubeUrl = URLList.Get("youtube"); /// if (youtubeUrl != null) /// { /// Console.WriteLine($"YouTube URL: {youtubeUrl}"); /// } /// - /// // ʴ Ű URL + /// // 존재하지 않는 키로 URL 가져오기 /// string nullUrl = URLList.Get("nonexistent"); /// if (nullUrl == null) /// { - /// Console.WriteLine("URL ʽϴ."); + /// Console.WriteLine("URL이 존재하지 않습니다."); /// } /// /// @@ -125,14 +125,14 @@ namespace UVC.Data } /// - /// URL κ մϴ. + /// URL에서 도메인 부분을 추출합니다. /// - /// URL - /// Ǵ Ľ null + /// 도메인을 추출할 URL + /// 추출된 도메인 또는 파싱 실패 시 null /// /// /// string domain = URLList.ExtractDomain("https://www.example.com/path/page.html"); - /// Console.WriteLine(domain); // : www.example.com + /// Console.WriteLine(domain); // 출력: www.example.com /// /// public static string? ExtractDomain(string url) diff --git a/Assets/Scripts/UVC/Factory/Alarm/AlarmManager.cs b/Assets/Scripts/UVC/Factory/Alarm/AlarmManager.cs index ca3eef4c..5659da1a 100644 --- a/Assets/Scripts/UVC/Factory/Alarm/AlarmManager.cs +++ b/Assets/Scripts/UVC/Factory/Alarm/AlarmManager.cs @@ -81,59 +81,31 @@ namespace UVC.Factory.Alarm /// 이 메서드는 외부에서 호출되어야 알람 데이터 수신이 시작됩니다. /// public void Run() - { - // 1. 데이터 마스크(DataMask) 정의: - // 수신할 데이터의 구조를 미리 정의합니다. 여기서 정의된 키(Key)들을 기준으로 데이터를 파싱합니다. - var dataMask = new DataMask(); - dataMask.ObjectName = "Alarm"; // Alarm 객체의 이름을 설정합니다. - dataMask.ObjectIdKey = "ID"; // Alarm의 고유 식별자로 사용할 키를 설정합니다. - dataMask["ID"] = ""; - dataMask["ALARM_TYPE"] = ""; - dataMask["LEVEL"] = ""; - dataMask["LOGISTIC"] = ""; - dataMask["STATE"] = ""; - dataMask["MESSAGE"] = ""; - dataMask["CODE"] = ""; - dataMask["ICON"] = ""; - dataMask["MACHINENAME"] = ""; - dataMask["SHOPNAME"] = ""; - dataMask["TRANSPORT_EQP_NAME"] = ""; - dataMask["TRANSPORT_UNIT_NAME"] = ""; - dataMask["TRANSPORT_EQP_ID"] = ""; - dataMask["TRANSPORT_UNIT_ID"] = ""; - dataMask["CLEAR_TIME"] = DateTime.Now; - dataMask["SET_TIME"] = DateTime.Now; - dataMask["UPDATE_TIME"] = DateTime.Now; - dataMask["TIMESTAMP"] = DateTime.Now; - - // 2. 데이터 유효성 검사기(DataValidator) 설정: - // 수신된 데이터가 유효한지 검사하는 규칙을 추가합니다. - // 여기서는 "MACHINENAME" 필드가 null이 아닌지 확인합니다. - DataValidator validator = new DataValidator(); - validator.AddValidator("MACHINENAME", value => value != null); - - // 3. MQTT 파이프라인 정보(MqttSubscriptionConfig) 생성: + { + // MQTT 파이프라인 정보(MqttSubscriptionConfig) 생성: // - "ALARM" 토픽을 구독합니다. // - 위에서 정의한 dataMask를 사용해 수신된 JSON 데이터를 DataObject로 변환합니다. // - validator를 사용해 데이터의 유효성을 검사합니다. // - 유효한 데이터가 수신되면 OnUpdateData 메서드를 호출하여 처리합니다. - var pipelineInfo = new MqttSubscriptionConfig("ALARM") - .setDataMapper(new DataMapper(dataMask)) - .setValidator(validator) - .setHandler(OnUpdateData); + var pipelineInfo = new MqttSubscriptionConfig("ALARM"); + + var dataMapperValidator = DataMapperValidator.Get("ALARM"); + if (dataMapperValidator?.DataMapper != null) pipelineInfo.setDataMapper(dataMapperValidator.DataMapper); + if (dataMapperValidator?.Validator != null) pipelineInfo.setValidator(dataMapperValidator.Validator); // 4. 생성한 파이프라인을 전역 MQTT 파이프라인에 추가하여 데이터 수신을 시작합니다. DataRepository.Instance.MqttReceiver.Add(pipelineInfo); - } - + //playback에서도 데이터를 업데이트 하기에 DataRepository에 핸들러를 추가합니다. + DataRepository.Instance.AddDataUpdateHandler("ALARM", OnUpdateData); + } /// /// MQTT 파이프라인으로부터 데이터가 업데이트될 때마다 호출되는 메인 핸들러입니다. /// 수신된 알람 데이터 배열을 분석하여 추가, 수정, 제거된 알람을 각각 처리합니다. /// /// 수신된 데이터 객체 (DataArray 형태여야 함) - public void OnUpdateData(IDataObject? data) + public void OnUpdateData(IDataObject data) { if (data == null) return; diff --git a/Assets/Scripts/UVC/Factory/Component/AGVManager.cs b/Assets/Scripts/UVC/Factory/Component/AGVManager.cs index 2e81bd79..ad230ed5 100644 --- a/Assets/Scripts/UVC/Factory/Component/AGVManager.cs +++ b/Assets/Scripts/UVC/Factory/Component/AGVManager.cs @@ -112,43 +112,18 @@ namespace UVC.Factory.Component private async void OnSceneInitializedAsync() { await InitializePoolAsync(); - //데이터를 어떤 형식으로 받을지 정의합니다. - var dataMask = new DataMask(); - dataMask.ObjectName = "AGV"; // AGV 객체의 이름을 설정합니다. - dataMask.ObjectIdKey = "VHL_NAME"; // AGV의 고유 식별자로 사용할 키를 설정합니다. - dataMask["VHL_NAME"] = ""; - dataMask["AGV_IDX"] = ""; - dataMask["B_INSTALL"] = ""; - dataMask["NODE_ID"] = ""; - dataMask["REAL_ID"] = ""; - dataMask["VHL_STATE"] = ""; - dataMask["BAY_LIST"] = ""; - dataMask["X"] = 0; - dataMask["Y"] = 0; - dataMask["DEGREE"] = 0.0; - dataMask["MODE"] = ""; - dataMask["BATT"] = ""; - dataMask["SUB_GOAL"] = ""; - dataMask["FINAL_GOAL"] = ""; - dataMask["JOB_ID"] = ""; - dataMask["TIMESTAMP"] = DateTime.Now; - // MQTT 파이프라인 정보를 생성합니다. - // 'AGV' 토픽을 구독하고, 받은 데이터는 위에서 정의한 dataMask로 매핑하며, - // 데이터 유효성 검사를 위해 DataValidator를 설정합니다. - // 데이터가 업데이트되면 OnUpdateData 메서드를 호출하여 처리합니다. + var pipelineInfo = new MqttSubscriptionConfig("AGV"); - DataValidator validator = new DataValidator(); - //validator.AddValidator("JOB_ID", value => value != null); - validator.AddValidator("VHL_NAME", value => value != null && value!.ToString() == "HFF09CNA8016"); - - var pipelineInfo = new MqttSubscriptionConfig("AGV") - .setDataMapper(new DataMapper(dataMask)) - //.setValidator(validator) - .setHandler(OnUpdateData); + var dataMapperValidator = DataMapperValidator.Get("AGV"); + if (dataMapperValidator?.DataMapper != null) pipelineInfo.setDataMapper(dataMapperValidator.DataMapper); + if (dataMapperValidator?.Validator != null) pipelineInfo.setValidator(dataMapperValidator.Validator); // 생성한 파이프라인 정보를 전역 MQTT 파이프라인에 추가합니다. DataRepository.Instance.MqttReceiver.Add(pipelineInfo); + + //playback에서도 데이터를 업데이트 하기에 DataRepository에 핸들러를 추가합니다. + DataRepository.Instance.AddDataUpdateHandler("AGV", OnUpdateData); } /// @@ -173,7 +148,7 @@ namespace UVC.Factory.Component /// 추가, 제거, 수정된 AGV 데이터를 각각 구분하여 처리합니다. /// /// 수신된 데이터 객체 (DataArray 형태) - public void OnUpdateData(IDataObject? data) + public void OnUpdateData(IDataObject data) { if (data == null || agvPool == null) return; @@ -244,7 +219,7 @@ namespace UVC.Factory.Component { base.OnDestroy(); SceneMain.Instance.Initialized -= OnSceneInitializedAsync; - DataRepository.Instance.MqttReceiver.Remove("AGV"); + DataRepository.Instance.RemoveDataUpdateHandler("AGV", OnUpdateData); agvPool?.ClearRecycledItems(); } } diff --git a/Assets/Scripts/UVC/Factory/Playback.meta b/Assets/Scripts/UVC/Factory/Playback.meta new file mode 100644 index 00000000..4a348f70 --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9a6c4a7abdcb2b54fa7cbf89c01f722e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UVC/Factory/Playback/PlaybackCommand.cs b/Assets/Scripts/UVC/Factory/Playback/PlaybackCommand.cs new file mode 100644 index 00000000..08485919 --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/PlaybackCommand.cs @@ -0,0 +1,43 @@ +using UnityEngine; +using UVC.Data; +using UVC.Factory.Playback.UI; +using UVC.UI.Commands; +using UVC.UI.Loading; +using UVC.UI.Modal; + +namespace UVC.Factory.Playback +{ + public class PlaybackCommand : ICommand + { + public async void Execute(object parameter = null) + { + + var modalContent = new ModalContent("Prefabs/Factory/Playback/UIPlaybackListModal") + { + Title = "Playback List", + ConfirmButtonText = "Play", + ShowCancelButton = false + }; + + object result = await UVC.UI.Modal.Modal.Open(modalContent); + + Debug.Log($"PlaybackCommand result:{result}"); + if (result != null) + { + UIPlaybackListItemData data = (UIPlaybackListItemData)result; + Debug.Log($"PlaybackCommand data:{data}"); + UIPlayback.Instance.Show(); + DataRepository.Instance.MqttReceiver.Stop(); + await UIPlayback.Instance.SetData(data.date, data.time, data.sqlFileName); + } + else + { + UILoading.Show(); + PlaybackService.Instance.Stop(); + UILoading.Hide(); + } + + } + + } +} diff --git a/Assets/Scripts/UVC/Factory/Playback/PlaybackCommand.cs.meta b/Assets/Scripts/UVC/Factory/Playback/PlaybackCommand.cs.meta new file mode 100644 index 00000000..87ffbf02 --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/PlaybackCommand.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 071f03b6e7e6d0342a5fe94183a1db70 \ No newline at end of file diff --git a/Assets/Scripts/UVC/Factory/Playback/PlaybackRepository.cs b/Assets/Scripts/UVC/Factory/Playback/PlaybackRepository.cs new file mode 100644 index 00000000..e31174c1 --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/PlaybackRepository.cs @@ -0,0 +1,107 @@ +#nullable enable +using Best.HTTP; +using Cysharp.Threading.Tasks; +using SampleProject.Config; +using System; +using System.Collections.Generic; +using UnityEngine; +using UVC.Network; + +namespace UVC.Factory.Playback +{ + public class PlaybackRepository + { + + private PlaybackSQLiteService? sqliteService = null; + + public async UniTask>?> RequestPlaybackDateList() + { + + //local + //string path = System.IO.Path.Combine(Application.streamingAssetsPath, "playbackList.json"); + //string json = System.IO.File.ReadAllText(path); + + //HttpResponseModel>> localData = JsonHelper.FromJson>>>(json); + //return new EntityWithState>>(APIState.Loaded, localData.data); + + try + { + return await UniTask.RunOnThreadPool>?>(async () => + { + var response = await HttpRequester.RequestGet>>>($"{Constants.PlaybackDomain}/playback/list"); + if (response.message.ToLower() == "success") + { + return new Dictionary>(response.data); + } + return null; + }); + + } + catch (Exception e) + { + Debug.Log($"Exception {e.ToString()}"); + return null; + } + } + + public HTTPRequest? DownloadPlaybackData(string fileName, string savePath, Action OnProgress, Action OnComplete, Action OnError) + { + try + { + return HttpRequester.Download($"{Constants.PlaybackDomain}/playback/{fileName}", savePath, OnComplete, OnProgress, OnError); + } + catch (Exception e) + { + Debug.Log($"Exception {e.ToString()}"); + return null; + } + } + + /// + /// selectTime보다 +- second 사이의 데이터 요청. selectTime, second 포함 + /// + /// + /// + /// yyyy-MM-ddTHH:mm:ss.fffZ format string + /// + /// true: 오래된 시간이 먼저, false: 최근 시간이 먼저 + /// + /// + public async UniTask> SelectBySecondAsync(string date, string sqlFileName, string selectTime, int second, bool orderAsc = true, int limit = 0) + { + validationSqliteService(date, sqlFileName); + return await sqliteService!.SelectBySecond(selectTime, second, orderAsc, limit); + } + + /// + /// selectTime보다 +- second 사이의 데이터 요청. selectTime, second 포함 + /// + /// + /// + /// yyyy-MM-ddTHH:mm:ss.fffZ format string + /// + /// 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); + } + + + private void validationSqliteService(string date, string sqlFileName) + { + if (sqliteService == null) sqliteService = new PlaybackSQLiteService(); + if (sqliteService.Connected) + { + if (sqliteService.Date != date || sqliteService.SqliteFileName != sqlFileName) + { + sqliteService.CloseDB(); + } + } + sqliteService.Connect(date, sqlFileName); + } + + } +} diff --git a/Assets/Scripts/UVC/Factory/Playback/PlaybackRepository.cs.meta b/Assets/Scripts/UVC/Factory/Playback/PlaybackRepository.cs.meta new file mode 100644 index 00000000..7d09c679 --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/PlaybackRepository.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 131e22b5d8e3f214cafd3ad0848fce28 \ No newline at end of file diff --git a/Assets/Scripts/UVC/Factory/Playback/PlaybackSQLiteService.cs b/Assets/Scripts/UVC/Factory/Playback/PlaybackSQLiteService.cs new file mode 100644 index 00000000..755d6a99 --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/PlaybackSQLiteService.cs @@ -0,0 +1,164 @@ +using Cysharp.Threading.Tasks; +using SQLite4Unity3d; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using UnityEngine; +using UVC.Util; + +namespace UVC.Factory +{ + public class PlaybackSQLiteService + { + + //#region Singleton + //private static readonly SQLiteService instance = new SQLiteService(); + //public static SQLiteService Instance => instance; + //static SQLiteService() { } + //#endregion + + + private SQLiteConnection dbConnection; + + public bool Connected { get => dbConnection != null; } + + private string date; + public string Date { get => date; } + private string sqliteFileName; + public string SqliteFileName { get => sqliteFileName; } + + public void Connect(string date, string sqliteFileName) + { + this.date = date; + this.sqliteFileName = sqliteFileName; + dbConnection = new SQLiteConnection(Path.Combine(Application.streamingAssetsPath, "playback", date, sqliteFileName)); + } + + public void CloseDB() + { + dbConnection.Close(); + dbConnection = null; + } + + /// + /// 추가하기 + /// + /// + /// yyyy-MM-ddTHH:mm:ss.fffZ format string + /// + /// 데이터베이스에서 추가된 행 수 + 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 ", + "timestamp >= '", + "' AND timestamp < '", + "timestamp <= '", + "' AND timestamp > '", + " ORDER BY timestamp ", + " LIMIT ", + }; + public async UniTask> SelectBySecond(string selectTime, int second, bool orderAsc = true, int limit = 0) + { + List result = await UniTask.RunOnThreadPool(() => + { + DateTime date = DateTimeUtil.UtcParse(selectTime).AddSeconds(second); + string targetTime = DateTimeUtil.FormatTime(date); + //Debug.Log($"SelectBySecondBaseInfo {selectTime} {second} {targetTime} {date}"); + queryBuilder.Append(queryParts[0]); + //second가 selectTime 보다 더 미래면 + if (second > 0) + { + queryBuilder.Append($"{queryParts[1]}{selectTime}{queryParts[2]}{targetTime}'"); + } + else + { + //second가 selectTime 보다 더 과거면 + queryBuilder.Append($"{queryParts[3]}{selectTime}{queryParts[4]}{targetTime}'"); + } + queryBuilder.Append($"{queryParts[5]}{(orderAsc ? "asc" : "desc")}"); + if (limit > 0) + queryBuilder.Append($"{queryParts[6]}{limit}"); + + queryBuilder.Append(";"); + //Debug.Log($"SelectBySecond {query}"); + var query = queryBuilder.ToString(); + queryBuilder.Clear(); + return dbConnection.Query(query); + }); + 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(); + public async UniTask> SelectBySecondBaseInfo(string selectTime, int second, bool orderAsc = false, int limit = 1) + { + List result = await UniTask.RunOnThreadPool(() => + { + DateTime date = DateTimeUtil.UtcParse(selectTime).AddSeconds(second); + string targetTime = DateTimeUtil.FormatTime(date); + //Debug.Log($"SelectBySecondBaseInfo {selectTime} {second} {targetTime} {date}"); + queryBuilder.Append($"SELECT * FROM baseInfo WHERE "); + //second가 selectTime 보다 더 미래면 + if (second > 0) + { + queryBuilder.Append($"timestamp >= '{selectTime}' AND timestamp < '{targetTime}'"); + } + else + { + //second가 selectTime 보다 더 과거면 + queryBuilder.Append($"timestamp <= '{selectTime}' AND timestamp > '{targetTime}'"); + } + queryBuilder.Append($" ORDER BY timestamp {(orderAsc ? "asc" : "desc")}"); + if (limit > 0) queryBuilder.Append($" LIMIT {limit}"); + queryBuilder.Append(";"); + //Debug.Log($"SelectBySecondBaseInfo {query}"); + var query = queryBuilder.ToString(); + queryBuilder.Clear(); + return dbConnection.Query(query); + }); + + return result; + } + } + + + [System.Serializable] + public class PlaybackSQLiteDataEntity + { + public string data { get; set; } + [PrimaryKey] + public string timestamp { get; set; } + public DateTime timestampHungary { get => DateTimeUtil.UtcStringToKoreaDateTime(timestamp); } + public string temp { get; set; } + } +} diff --git a/Assets/Scripts/UVC/Factory/Playback/PlaybackSQLiteService.cs.meta b/Assets/Scripts/UVC/Factory/Playback/PlaybackSQLiteService.cs.meta new file mode 100644 index 00000000..f0a23c81 --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/PlaybackSQLiteService.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 10c4a6d7e00d6e04eb5efd504572f689 \ No newline at end of file diff --git a/Assets/Scripts/UVC/Factory/Playback/PlaybackService.cs b/Assets/Scripts/UVC/Factory/Playback/PlaybackService.cs new file mode 100644 index 00000000..d3a0d9ef --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/PlaybackService.cs @@ -0,0 +1,207 @@ +#nullable enable +using Best.HTTP; +using Cysharp.Threading.Tasks; +using System; +using System.Collections.Generic; +using System.IO; +using UnityEngine; +using UVC.Data; +using UVC.Data.Core; +using UVC.Data.Http; +using UVC.Json; +using UVC.Util; +namespace UVC.Factory.Playback +{ + public class PlaybackService + { + #region Singleton + private static readonly PlaybackService instance = new PlaybackService(new PlaybackRepository()); + public static PlaybackService Instance => instance; + static PlaybackService() { } + #endregion + + private readonly PlaybackRepository repository; + + private string date; + private string time; + private string fileName; + + public Action OnStopPlayback; + + + public PlaybackService(PlaybackRepository repository) + { + this.repository = repository; + } + + public async UniTask>?> RequestDataAsync() + { + Dictionary>? data = await repository.RequestPlaybackDateList(); + return data; + } + + public async UniTask DispatchBaseInfoData(string date, string time, string fileName, string minute = "00", string second = "00") + { + Debug.Log($"DispatchBaseInfoData {date} {time} {minute} {second} {fileName}"); + + //헝가리 시간임 + this.date = date; + this.time = time; + this.fileName = fileName; + DateTime dateTime = DateTimeUtil.UtcParse($"{date}T{int.Parse(time).ToString("00")}:{minute}:{second}.000Z"); + string formatTime = DateTimeUtil.FormatTime(dateTime); + //baseInfo 가져오기 + + List list = await repository.SelectBySecondBaseInfo(date, fileName, formatTime); + if (list.Count > 0) + { + HttpRequestConfig httpRequestConfig = new HttpRequestConfig(""); + httpRequestConfig.setSplitResponseByKey(true); + httpRequestConfig.AddSplitConfig("AGV", DataMapperValidator.Get("AGV")); + httpRequestConfig.AddSplitConfig("ALARM", DataMapperValidator.Get("ALARM")); + foreach (var item in list) + { + await HttpDataProcessor.ProcessSplitResponse(httpRequestConfig, item.data); + } + } + } + + /// + /// + /// + /// 0 ~ 3600 + public async UniTask DispatchRealTimeData(int second, int speed) + { + int newSecond = second; + if (newSecond > 36000) newSecond = 36000; + //utc 시간으로 변환 + DateTime dateTime = DateTimeUtil.UtcParse($"{date}T{int.Parse(time).ToString("00")}:00:00.000Z").AddSeconds(newSecond);//.Add(-DateTimeUtil.UtcKoreaGap); + string formatTime = DateTimeUtil.FormatTime(dateTime); + + List list = await repository.SelectBySecondAsync(date, fileName, formatTime, 1); + if (list.Count > 0) + { + HttpRequestConfig httpRequestConfig = new HttpRequestConfig(""); + httpRequestConfig.setSplitResponseByKey(true); + httpRequestConfig.AddSplitConfig("AGV", DataMapperValidator.Get("AGV")); + httpRequestConfig.AddSplitConfig("ALARM", DataMapperValidator.Get("ALARM")); + foreach (var item in list) + { + await HttpDataProcessor.ProcessSplitResponse(httpRequestConfig, item.data); + } + } + } + + + + public void Stop() + { + OnStopPlayback?.Invoke(); + } + + public HTTPRequest? ReadyData(string date, string time, string fileName, Action OnProgress, Action OnComplete) + { + //date : "2024-12-05" + //fileName : "2024-12-05_0.sqlite.7z" + string playbackPath = Path.Combine(Application.streamingAssetsPath, "playback"); + string tempPath = Path.Combine(playbackPath, "temp");//한국 시간으로 변경하기 때문에 임시 폴더 만들어서 압축 해제 후 이동 + string datePath = Path.Combine(playbackPath, date); + var fileNameArr = fileName.Split("."); + string zipFilePath = Path.Combine(datePath, fileName); + string sqlFilePath = Path.Combine(datePath, fileNameArr[0] + ".sqlite"); + + DateTime utcDateTime = DateTimeUtil.Parse(fileNameArr[0], "yyyy-MM-dd_H").Add(-DateTimeUtil.UtcKoreaGap); + string utcDatePath = Path.Combine(playbackPath, utcDateTime.ToString("yyyy-MM-dd")); + string utcFileName = utcDateTime.ToString("yyyy-MM-dd_H") + "." + fileNameArr[1] + "." + fileNameArr[2]; + var utcFileNameArr = utcFileName.Split("."); + string utcZipFilePath = Path.Combine(tempPath, utcFileName); + string utcSqlFilePath = Path.Combine(tempPath, utcFileNameArr[0] + ".sqlite"); + if (!Directory.Exists(playbackPath)) Directory.CreateDirectory(playbackPath); + if (!Directory.Exists(datePath)) Directory.CreateDirectory(datePath); + if (!Directory.Exists(utcDatePath)) Directory.CreateDirectory(utcDatePath); + if (!Directory.Exists(tempPath)) Directory.CreateDirectory(tempPath); + if (File.Exists(sqlFilePath)) + { + Debug.Log($"ONREADY SQP FILE"); + if (OnProgress != null) OnProgress.Invoke(100, 100, 1.0f); + if (OnComplete != null) OnComplete.Invoke(null); + return null; + } + else + { + long downloadTotal = 0; + return repository.DownloadPlaybackData(utcFileName, utcZipFilePath, + (long progress, long length) => + { + float percent = (float)progress / (float)length; + Debug.Log($"DownloadPlaybackData OnProgress:{percent}"); + if (OnProgress != null) OnProgress.Invoke(progress, length, percent / 2); + downloadTotal = length; + }, async () => + { + await UniTask.Delay(500); + Debug.Log($"DownloadPlaybackData OnComplete"); + if (File.Exists(utcZipFilePath)) + { + if (OnProgress != null) OnProgress.Invoke(50, 100, 0.5f); + //압축해제 후 + var zipper = new Zipper(); + + string errorMessage = await zipper.Decompress(utcZipFilePath, tempPath, (long read, long total, float percent) => + { + if (OnProgress != null) + { + OnProgress.Invoke(downloadTotal + read, downloadTotal + total, 0.5f + percent / 2); + if (0.5f + percent / 2 > 100f) + { + Debug.Log($" DownloadReadData :{downloadTotal + read} , DownloadTotalData :{downloadTotal + total} ,DownloadPlaybackData OnProgress:{percent}"); + } + } + }); + Debug.Log($"zipper1 errorMessage:{errorMessage} utcSqlFilePath:{utcSqlFilePath} sqlFilePath:{sqlFilePath} utcZipFilePath:{utcZipFilePath}"); + + ////파일 접근 문제면 2회 0.5초 후에 다시 실행. + //if (errorMessage == "Could not open input(7z) file") + //{ + // await UniTask.Delay(500); + // errorMessage = await zipper.Decompress(utcZipFilePath, tempPath, (long read, long total, float percent) => + // { + // if (OnProgress != null) OnProgress.Invoke(downloadTotal + read, downloadTotal + total, 0.5f + percent / 2); + // }); + // Debug.Log($"zipper2 errorMessage:{errorMessage} utcSqlFilePath:{utcSqlFilePath} sqlFilePath:{sqlFilePath} utcZipFilePath:{utcZipFilePath}"); + //} + + //if (errorMessage == "Could not open input(7z) file") + //{ + // await UniTask.Delay(500); + // errorMessage = await zipper.Decompress(utcZipFilePath, tempPath, (long read, long total, float percent) => + // { + // if (OnProgress != null) OnProgress.Invoke(downloadTotal + read, downloadTotal + total, 0.5f + percent / 2); + // }); + // Debug.Log($"zipper3 errorMessage:{errorMessage} utcSqlFilePath:{utcSqlFilePath} sqlFilePath:{sqlFilePath} utcZipFilePath:{utcZipFilePath}"); + //} + + //압축해제 한 파일 이동 + if (File.Exists(utcSqlFilePath)) + { + //동일한 파일명이 있을경우 제거후 다시 + File.Copy(utcSqlFilePath, sqlFilePath); + File.Delete(utcSqlFilePath); + } + + //zip 파일 삭제 + File.Delete(utcZipFilePath); + if (OnComplete != null) OnComplete.Invoke(errorMessage); + } + }, + (string? error) => + { + Debug.Log($"DownloadPlaybackData OnError:{error}"); + if (OnComplete != null) OnComplete.Invoke(error); + }); + } + } + + + } +} diff --git a/Assets/Scripts/UVC/Factory/Playback/PlaybackService.cs.meta b/Assets/Scripts/UVC/Factory/Playback/PlaybackService.cs.meta new file mode 100644 index 00000000..f26cf514 --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/PlaybackService.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: deed16ffd893d334b937460dfaa00de3 \ No newline at end of file diff --git a/Assets/Scripts/UVC/Factory/Playback/UI.meta b/Assets/Scripts/UVC/Factory/Playback/UI.meta new file mode 100644 index 00000000..d1e529da --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/UI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 866839c3051b5dc46bb738a62bef8fb3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UVC/Factory/Playback/UI/UIPlayback.cs b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlayback.cs new file mode 100644 index 00000000..1b06bbb1 --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlayback.cs @@ -0,0 +1,265 @@ +using Cysharp.Threading.Tasks; +using System; +using TMPro; +using UnityEngine; +using UnityEngine.UI; +using UVC.Extension; +using UVC.UI; +using UVC.UI.Loading; + +namespace UVC.Factory.Playback.UI +{ + public class UIPlayback : MonoBehaviour + { + + private static UIPlayback instance; + public static UIPlayback Instance + { + get + { + if (instance == null) instance = CreateUIPlayBack(); + return instance; + } + } + + private static UIPlayback CreateUIPlayBack() + { + GameObject prefab = Resources.Load("Prefabs/Factory/Playback/UIPlayback"); + GameObject go = GameObject.Instantiate(prefab); + return go.GetComponent(); + } + + [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; + + private bool isPlaying = false; + private bool preparingData = false; + + private string date; + private string time; + private string fileName; + + private bool isTick = false; + private bool IsTick + { + get => isTick; + set + { + if (isTick != value) + { + var temp = isTick; + isTick = value; + if (!temp && value) OnTimer().Forget(); + } + } + } + + private void Init() + { + exitButton.onClick.AddListener(OnClickExit); + playButton.onClick.AddListener(OnClickPlay); + + progressBar.OnChangeValue += OnChangeProgress; + sliderSpeed.OnChangeValue += OnChangeSpeed; + opacitySlider.onValueChanged.AddListener(OnValueChangedOpcity); + } + + + + private void OnDestroy() + { + exitButton.onClick.RemoveListener(OnClickExit); + playButton.onClick.RemoveListener(OnClickPlay); + progressBar.OnChangeValue = null; + sliderSpeed.OnChangeValue = null; + opacitySlider.onValueChanged.RemoveListener(OnValueChangedOpcity); + if (isPlaying) IsTick = false; + } + + public void Show() + { + if (playButton == null) Init(); + gameObject.SetActive(true); + if (transform.parent == null) + { + var canvases = GameObject.FindObjectsByType(FindObjectsSortMode.None); + foreach (var canvas in canvases) + { + if (canvas.name == "ModalCanvas") + { + transform.SetParent(canvas.transform, false); + break; + } + } + } + } + + public void Hide() + { + Time.timeScale = 1; + IsTick = false; + gameObject.SetActive(false); + } + + private void OnClickExit() + { + UILoading.Show(); + isPlaying = false; + UpdatePlayState(); + Hide(); + PlaybackService.Instance.Stop(); + UILoading.Hide(); + } + + private void OnClickPlay() + { + isPlaying = !isPlaying; + UpdatePlayState(); + } + + private void OnChangeProgress(int newValue) + { + ChangePlayTime().Forget(); + } + + private void OnChangeSpeed(int newValue) + { + if (isPlaying) + { + if (Time.timeScale != sliderSpeed.Value) Time.timeScale = sliderSpeed.Value; + } + else + { + Time.timeScale = 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(); + Time.timeScale = 1; + canvasGroup.alpha = opacitySlider.value = 1; + preparingData = true; + progressBar.Interactable = !preparingData; + isPlaying = false; + UpdatePlayState(); + //UILoading.Show(); + await UniTask.WaitForSeconds(0.5f); + await PlaybackService.Instance.DispatchBaseInfoData(date, time, fileName); + preparingData = false; + progressBar.Interactable = !preparingData; + + //UILoading.Hide(); + await UniTask.WaitForSeconds(0.5f); + } + + 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() + { + if (progressBar.Value == progressBar.MaxValue) + { + 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(); + } + } + + } + +} diff --git a/Assets/Scripts/UVC/Factory/Playback/UI/UIPlayback.cs.meta b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlayback.cs.meta new file mode 100644 index 00000000..aec28b66 --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlayback.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6ca072637b87cb24eba398b90a1d49e9 \ 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 new file mode 100644 index 00000000..eee63ad7 --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListItem.cs @@ -0,0 +1,311 @@ +using Best.HTTP; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using TMPro; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; +using UVC.Extension; +using UVC.Pool; +using UVC.UI.Modal; +using UVC.Util; + +namespace UVC.Factory.Playback.UI +{ + + public enum UIPlaybackListItemStatus + { + Default, + Downloading, + Downloaded + } + + public class UIPlaybackListItemData + { + public string date = ""; + public string time = ""; + public string zipFileName = ""; + public string sqlFileName = ""; + public UIPlaybackListItemStatus status = UIPlaybackListItemStatus.Default; + + public override string ToString() + { + return $"date:{date}, time:{time}, zipFileName:{zipFileName}, sqlFileName:{sqlFileName}, status:{status}"; + } + } + + public class UIPlaybackListItem : UnityEngine.MonoBehaviour, IPointerClickHandler + { + + protected static ItemPool pool; + + public static readonly string PrefabPath = "Prefabs/Factory/Playback/UIPlaybackListItem"; + + public static UIPlaybackListItem CreateFromPool(Transform parent) + { + if (pool == null) + { + GameObject prefab = Resources.Load(PrefabPath); + pool = new ItemPool(prefab, parent, null); + } + return pool.GetItem(true, parent); + } + + public static List ActiveItems + { + get + { + if (pool != null) return (List)pool.ActiveItems; + return new List(); + } + } + + public static List DownloadingItems + { + get + { + return ActiveItems.Where(x => x.Status == UIPlaybackListItemStatus.Downloading).ToList(); + } + } + + public static void ReleaseAll() + { + if (pool != null) + { + foreach (var item in pool.ActiveItems) item.Release(); + pool.ReturnAll(); + } + } + + public static void ClearAll() + { + if (pool != null) + { + foreach (var item in pool.ActiveItems) item.Release(); + pool.ReturnAll(); + pool.ClearRecycledItems(); + } + } + + [SerializeField] + private Image loadingImage; + [SerializeField] + private Image selectedImage; + [SerializeField] + private Button downloadButton; + [SerializeField] + private Button stopButton; + [SerializeField] + private Button deleteButton; + [SerializeField] + private TextMeshProUGUI downloadText; + [SerializeField] + private TextMeshProUGUI text; + + public Action OnSelect { get; set; } + public Action OnChangeStatus { get; set; } + + private UIPlaybackListItemData data; + public UIPlaybackListItemData Data { get => data; } + + + public UIPlaybackListItemStatus Status + { + get => data.status; + set + { + if (data.status != value) + { + data.status = value; + ChangeStatus(); + if (OnChangeStatus != null) OnChangeStatus.Invoke(Data, value); + } + } + } + + private bool selected = false; + + public bool Selected + { + get => selected; + set + { + if (selected != value) + { + selected = value; + selectedImage.gameObject.SetActive(selected); + } + } + } + + + private HTTPRequest? downloadRequest; + + + public void Init(UIPlaybackListItemData data) + { + transform.localScale = Vector3.one; + selected = false; + selectedImage.gameObject.SetActive(selected); + + this.data = data; + text.text = $"{data.time} ~ {int.Parse(data.time) + 1} Hour"; + downloadButton.onClick.AddListener(onClickDownload); + stopButton.onClick.AddListener(onClickStop); + deleteButton.onClick.AddListener(onClickDelete); + ChangeStatus(); + } + + private void onClickDownload() + { + if (Status == UIPlaybackListItemStatus.Downloading) return; + + long freeSize = DriveUtil.GetDriveGigaBytes(); + + Debug.Log($"여유 공간 freeSize:{freeSize} {10 * (DownloadingItems.Count + 1)} {freeSize < 10 * (DownloadingItems.Count + 1)}"); + if (freeSize < 10 * (DownloadingItems.Count + 1)) + { + Toast.Show("Playback 하나당 10기가바이트의 용량이 필요합니다. 용량을 확보하고 다운로드 하세요.\nEach Playback requires a capacity of 10 gigabytes. Secure the capacity and download it."); + return; + } + + if (DownloadingItems.Count >= 2) + { + Toast.Show("한번에 총 2개 아이템만 다운로드가 가능합니다.\nOnly 2 items can be downloaded at a time."); + //await UIAlertManager.Instance.ShowAlert("Downloading", "한번에 총 2개 아이템만 다운로드가 가능합니다.\nOnly 3 items can be downloaded at a time."); + return; + } + + Status = UIPlaybackListItemStatus.Downloading; + downloadRequest = PlaybackService.Instance.ReadyData(data.date, data.time, data.zipFileName, + (long read, long total, float percent) => + { + Debug.Log($"ReadyData {percent}"); + downloadText.text = $"{read.ToSizeSuffix()}/{total.ToSizeSuffix()} ({(int)(percent * 100)}%)"; + loadingImage.fillAmount = percent; + }, + (string errorMessage) => + { + Debug.Log($"Complete Data errorMessage:{errorMessage}"); + if (downloadRequest != null) downloadRequest.Clear(); + downloadRequest = null; + if (errorMessage != null) + { + if (errorMessage.ToLower().Contains("abort")) errorMessage = "다운로드를 중지 했습니다.\nThe download has been stopped."; + Toast.Show(errorMessage); + //await UIAlertManager.Instance.ShowAlert("Error", errorMessage); + deleteFile(); + Status = UIPlaybackListItemStatus.Default; + } + else + { + Status = UIPlaybackListItemStatus.Downloaded; + } + }); + } + + private void deleteFile() + { + try + { + string playbackPath = Path.Combine(Application.streamingAssetsPath, "playback"); + string tempPath = Path.Combine(playbackPath, "temp"); + string datePath = Path.Combine(playbackPath, data.date); + var fileNameArr = data.zipFileName.Split('.'); + DateTime utcDateTime = DateTimeUtil.Parse(fileNameArr[0], "yyyy-MM-dd_H"); + string utcSqlFileName = utcDateTime.ToString("yyyy-MM-dd_H") + "." + fileNameArr[1]; + string utcZipFileName = utcSqlFileName + "." + fileNameArr[2]; + string utcZipFilePath = Path.Combine(datePath, utcZipFileName); + string utcSqlFilePath = Path.Combine(datePath, utcSqlFileName); + System.GC.Collect(); + System.GC.WaitForPendingFinalizers(); + if (File.Exists(utcZipFilePath)) File.Delete(utcZipFilePath); + if (File.Exists(utcSqlFilePath)) File.Delete(utcSqlFilePath); + // if (Directory.Exists(tempPath)) Directory.Delete(tempPath, true); + } + catch (Exception ex) + { + Debug.LogException(ex); + } + } + + private void onClickStop() + { + if (downloadRequest != null && Status == UIPlaybackListItemStatus.Downloading) + { + downloadRequest.Abort(); + downloadRequest.Clear(); + downloadRequest = null; + deleteFile(); + Status = UIPlaybackListItemStatus.Default; + } + } + + 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); + stopButton.onClick.RemoveListener(onClickStop); + deleteButton.onClick.RemoveListener(onClickDelete); + OnSelect = null; + OnChangeStatus = null; + transform.SetParent(null); + } + + private void ChangeStatus() + { + downloadText.text = ""; + if (data.status == UIPlaybackListItemStatus.Default) + { + loadingImage.gameObject.SetActive(false); + downloadButton.gameObject.SetActive(true); + stopButton.gameObject.SetActive(false); + deleteButton.gameObject.SetActive(false); + downloadText.gameObject.SetActive(false); + } + else if (data.status == UIPlaybackListItemStatus.Downloading) + { + loadingImage.gameObject.SetActive(true); + loadingImage.SetAlpha(0.2f); + loadingImage.fillAmount = 0; + downloadButton.gameObject.SetActive(false); + stopButton.gameObject.SetActive(true); + deleteButton.gameObject.SetActive(false); + downloadText.gameObject.SetActive(true); + } + else if (data.status == UIPlaybackListItemStatus.Downloaded) + { + loadingImage.gameObject.SetActive(true); + loadingImage.SetAlpha(1f); + loadingImage.fillAmount = 1; + downloadButton.gameObject.SetActive(false); + stopButton.gameObject.SetActive(false); + deleteButton.gameObject.SetActive(true); + downloadText.gameObject.SetActive(false); + } + } + + + } + + + +} diff --git a/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListItem.cs.meta b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListItem.cs.meta new file mode 100644 index 00000000..6f11d9aa --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListItem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e157d53f2eb114b4b94e5b0d1c7eeaa9 \ No newline at end of file diff --git a/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListModal.cs b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListModal.cs new file mode 100644 index 00000000..f54e995e --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListModal.cs @@ -0,0 +1,319 @@ +using Cysharp.Threading.Tasks; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using TMPro; +using UnityEngine; +using UnityEngine.UI; +using UVC.Extension; +using UVC.Log; +using UVC.UI; +using UVC.UI.Modal; +using UVC.Util; + +namespace UVC.Factory.Playback.UI +{ + [RequireComponent(typeof(CanvasGroup))] + public class UIPlaybackListModal : ModalView + { + public static new readonly string PrefabPath = "Prefabs/Factory/Playback/UIPlaybackListModal"; + + public static UIPlaybackListModal CreateFromPrefab(Transform parent = null) + { + GameObject prefab = Resources.Load(PrefabPath, typeof(GameObject)) as GameObject; + GameObject go = UnityEngine.Object.Instantiate(prefab); + UIPlaybackListModal modal = go.GetComponent(); + return modal; + } + + private Dictionary> data; + + public bool IsOkable => (selectedItem != null && selectedItem.status == UIPlaybackListItemStatus.Downloaded && UIPlaybackListItem.DownloadingItems.Count == 0); + + private UIPlaybackListItemData? selectedItem; + + [SerializeField] + private TMP_Dropdown dropdownDate; + [SerializeField] + private ScrollRect scrollRectTime; + + + public void Init() + { + initContent(); + } + + + public override async UniTask OnOpen(ModalContent content) + { + await base.OnOpen(content); // 부모의 OnOpen을 먼저 호출해서 기본 UI를 설정해요. + + + } + + public override object GetResult() + { + if (data != null) data.Clear(); + data = null; + return selectedItem; + } + + 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); + } + + + protected void OnDestroy() + { + dropdownDate.onValueChanged.RemoveListener(DropDownDateChanged); + UIPlaybackListItem.ClearAll(); + } + + public void LocalSetData() + { + Dictionary> newData = new Dictionary>(); + var dateList = new List(); + + string playbackPath = Path.Combine(Application.streamingAssetsPath, "playback"); + DirectoryInfo di = new DirectoryInfo(playbackPath); + if (di.Exists) + { + var childDi = di.EnumerateDirectories(); + foreach (var child in childDi) + { + string date = child.Name; + //Debug.Log($"date:{date}"); + var childFiles = child.EnumerateFiles(); + if (childFiles.Count() > 0 && !newData.ContainsKey(date)) newData[date] = new List(); + foreach (var childFile in childFiles) + { + //남은게 있다면 삭제 + if (childFile.Extension == ".zip" || childFile.Extension == ".7z") + { + try + { + Debug.Log($"delete zip file:{childFile.FullName}"); + childFile.Delete(); + } + catch (Exception ex) + { + Debug.LogException(ex); + } + } + if (childFile.Extension != ".sqlite") continue; + var sqlFileName = childFile.Name; + string time = sqlFileName.Split("_")[1].Replace(".sqlite", ""); + newData[date].Add(new UIPlaybackListItemData() + { + date = date, + time = time, + zipFileName = $"{sqlFileName}.7z", + sqlFileName = sqlFileName, + status = UIPlaybackListItemStatus.Downloaded, + }); + //fileName.Split(".")[0] + ".sqlite" + } + + if (newData.ContainsKey(date) && newData[date].Count() > 0) dateList.Add(new TMP_Dropdown.OptionData(date)); + } + } + + this.data = newData; + dateList.Sort((b, a) => a.text.CompareTo(b.text)); + dropdownDate.options = dateList; + dropdownDate.value = -1; + } + + public void SetData(Dictionary> data) + { + //{ + // "2024-12-05": { + // "0": "2024-12-05_0.sqlite.7z", + // "1": "2024-12-05_1.sqlite.7z", + // "2": "2024-12-05_2.sqlite.7z", + // } + //} + Dictionary> dataList = new Dictionary>(); + + //헝가리 시간으로 변경 + foreach (var keyPair in data) + { + if (!dataList.ContainsKey(keyPair.Key)) dataList[keyPair.Key] = new Dictionary(); + foreach (var keyPair2 in keyPair.Value) + { + var arr = keyPair2.Value.Split("."); + string timeStr = arr[0]; + DateTime dateTime = DateTimeUtil.Parse(timeStr, "yyyy-MM-dd_H"); + string dateStr = dateTime.ToString("yyyy-MM-dd"); + string dateKey = dateTime.Hour.ToString(); + string dateValue = dateTime.ToString("yyyy-MM-dd_H") + "." + arr[1] + "." + arr[2]; + ULog.Debug($"dateTime:{dateTime}, timeStr:{timeStr} dateValue:{dateValue}"); + if (!dataList.ContainsKey(dateStr)) dataList[dateStr] = new Dictionary(); + if (!dataList[dateStr].ContainsKey(dateKey)) dataList[dateStr][dateKey] = dateValue; + } + } + + foreach (var item in dataList.ToList()) + { + if (item.Key.Count() == 0) dataList.Remove(item.Key); + } + + + Dictionary> newData = new Dictionary>(); + + var dateList = new List(); + + //로컬에 저장 되 있는데 sqlite 파일 찾아서 추가 + string playbackPath = Path.Combine(Application.streamingAssetsPath, "playback"); + DirectoryInfo di = new DirectoryInfo(playbackPath); + if (di.Exists) + { + var childDi = di.EnumerateDirectories(); + foreach (var child in childDi) + { + string date = child.Name; + //Debug.Log($"date:{date}"); + var childFiles = child.EnumerateFiles(); + if (childFiles.Count() > 0 && !newData.ContainsKey(date)) newData[date] = new List(); + foreach (var childFile in childFiles) + { + //남은게 있다면 삭제 + if (childFile.Extension == ".zip" || childFile.Extension == ".7z") + { + try + { + Debug.Log($"delete zip file:{childFile.FullName}"); + childFile.Delete(); + } + catch (Exception ex) + { + Debug.LogException(ex); + } + } + if (childFile.Extension != ".sqlite") continue; + var sqlFileName = childFile.Name; + string time = sqlFileName.Split("_")[1].Replace(".sqlite", ""); + newData[date].Add(new UIPlaybackListItemData() + { + date = date, + time = time, + zipFileName = $"{sqlFileName}.7z", + sqlFileName = sqlFileName, + status = UIPlaybackListItemStatus.Downloaded, + }); + //fileName.Split(".")[0] + ".sqlite" + } + + if (newData.ContainsKey(date) && newData[date].Count() > 0) dateList.Add(new TMP_Dropdown.OptionData(date)); + } + } + + + + foreach (var keyPair in dataList) + { + string date = keyPair.Key; + if (dateList.FindIndex(o => o.text == date) == -1) dateList.Add(new TMP_Dropdown.OptionData(date)); + if (!newData.ContainsKey(date)) newData[date] = new List(); + foreach (var keyPair2 in keyPair.Value) + { + var zipFileName = keyPair2.Value; + var sqlFileName = zipFileName.Replace(".zip", "").Replace(".7z", ""); + if (newData[date].FindIndex(item => item.sqlFileName == sqlFileName) == -1) + { + newData[date].Add(new UIPlaybackListItemData() + { + date = date, + time = keyPair2.Key, + zipFileName = zipFileName, + sqlFileName = sqlFileName, + status = UIPlaybackListItemStatus.Default, + }); + } + } + //내림차순 정리 + if (newData.ContainsKey(date)) newData[date].Sort((a, b) => int.Parse(a.time) - int.Parse(b.time)); + } + + this.data = newData; + dateList.Sort((b, a) => a.text.CompareTo(b.text)); + dropdownDate.options = dateList; + dropdownDate.value = -1; + + } + + + 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 (UIPlaybackListItem.ActiveItems.Count > 0) UIPlaybackListItem.ReleaseAll(); + List itemList = data[key]; + foreach (var itemData in itemList) + { + UIPlaybackListItem item = UIPlaybackListItem.CreateFromPool(scrollRectTime.content); + item.Init(itemData); + item.OnSelect += OnItemSelect; + item.OnChangeStatus += OnItemChangeStatus; + } + selectedItem = null; + updateButtonStatus(); + } + //scroll move to top + scrollRectTime.normalizedPosition = new Vector2(0, 1); + + } + + private void OnItemSelect(UIPlaybackListItemData data, bool selected) + { + if (selected) + { + List itemList = UIPlaybackListItem.ActiveItems; + foreach (var item in itemList) + { + if (item.Data.sqlFileName != data.sqlFileName) + { + item.Selected = false; + } + } + selectedItem = data; + } + else + { + selectedItem = null; + } + updateButtonStatus(); + } + + private void OnItemChangeStatus(UIPlaybackListItemData data, UIPlaybackListItemStatus status) + { + bool enable = UIPlaybackListItem.DownloadingItems.Count == 0; + dropdownDate.interactable = enable; + } + + private void updateButtonStatus() + { + confirmButton.interactable = IsOkable; + } + + } +} diff --git a/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListModal.cs.meta b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListModal.cs.meta new file mode 100644 index 00000000..47d9321f --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackListModal.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f7fd94cb2e9eab84ea0e85244ba1a656 \ No newline at end of file diff --git a/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackProgressBar.cs b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackProgressBar.cs new file mode 100644 index 00000000..67298110 --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackProgressBar.cs @@ -0,0 +1,142 @@ +using System; +using TMPro; +using UnityEngine; +using UVC.Extension; +using UVC.UI; + +namespace UVC.Factory.Playback.UI +{ + public class UIPlaybackProgressBar : MonoBehaviour + { + private TextMeshProUGUI playTimeTxt; + private TextMeshProUGUI totalTimeTxt; + private SliderWithEvent progressBar; + private float progressBarPrevValue = 0; + + private CanvasGroup canvasGroup; + private int time; + + public Action OnChangeValue { get; set; } + + public int Value + { + get + { + return (int)progressBar.value; + } + + set + { + if (progressBar.value != value) + { + progressBar.value = value; + UpdateTimeText(); + progressBarPrevValue = value; + } + } + } + + public int MaxValue + { + get => (int)progressBar.maxValue; + } + + public bool Interactable + { + get => canvasGroup.interactable; + set => canvasGroup.interactable = value; + } + + private void OnDestroy() + { + progressBar.onValueChanged.RemoveListener(OnChangeSlider); + progressBar.OnClickAction = null; + progressBar.OnDragAction = null; + progressBar.OnEndDragAction = null; + } + + 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) + { + progressBar.value = progressBarPrevValue; + UpdateTimeText(); + return; + } + } + + private void OnClickProgressBar() + { + float snapedValue = SnapProgressBarValue(); + progressBar.value = snapedValue; + UpdateTimeText(); + if (progressBarPrevValue != snapedValue) + { + progressBarPrevValue = snapedValue; + if (OnChangeValue != null) OnChangeValue.Invoke((int)snapedValue); + } + } + + private void OnDragProgressBar() + { + float snapedValue = SnapProgressBarValue(); + progressBar.value = snapedValue; + UpdateTimeText(); + } + + private void OnEndDragProgressBar() + { + float snapedValue = SnapProgressBarValue(); + progressBar.value = snapedValue; + UpdateTimeText(); + if (progressBarPrevValue != snapedValue) + { + progressBarPrevValue = snapedValue; + if (OnChangeValue != null) OnChangeValue.Invoke((int)snapedValue); + } + } + + private float SnapProgressBarValue() + { + float value = progressBar.value; + float interval = 60f; + value = Mathf.Round(value / interval) * interval; + return value; + } + + private void UpdateTimeText() + { + int minute = (int)progressBar.value / 60; + int second = (int)progressBar.value % 60; + string timeStr = time.ToString("00"); + if (progressBar.value == 3600) + { + timeStr = (time + 1).ToString("00"); + minute = 0; + } + playTimeTxt.text = $"{timeStr}:{minute.ToString("00")}:{second.ToString("00")}"; + } + + } +} diff --git a/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackProgressBar.cs.meta b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackProgressBar.cs.meta new file mode 100644 index 00000000..f9f505a2 --- /dev/null +++ b/Assets/Scripts/UVC/Factory/Playback/UI/UIPlaybackProgressBar.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bce52072cdea6144b98e9297b89d6558 \ No newline at end of file diff --git a/Assets/Scripts/UVC/Network/HttpRequester.cs b/Assets/Scripts/UVC/Network/HttpRequester.cs index 137ca98c..104437b2 100644 --- a/Assets/Scripts/UVC/Network/HttpRequester.cs +++ b/Assets/Scripts/UVC/Network/HttpRequester.cs @@ -15,22 +15,22 @@ using UVC.Log; namespace UVC.Network { /// - /// HTTP û óϱ ƿƼ Ŭ + /// HTTP 요청을 처리하기 위한 유틸리티 클래스 /// /// - /// Ŭ REST API ȣ ޼ҵ մϴ. - /// GET, POST û ٿε带 ϸ û/ α ɵ մϴ. - /// û 񵿱(UniTask) ó˴ϴ. + /// 이 클래스는 REST API 호출을 위한 메소드들을 제공합니다. + /// GET, POST 요청 및 파일 다운로드를 지원하며 요청/응답 로깅 기능도 포함합니다. + /// 요청은 비동기(UniTask)로 처리됩니다. /// - /// ⺻ : + /// 기본 사용법: /// - /// // + /// // 도메인 설정 /// HttpRequester.Domain = "https://api.example.com"; /// - /// // GET û + /// // GET 요청 예제 /// var products = await HttpRequester.RequestGet>("/api/products"); /// - /// // POST û + /// // POST 요청 예제 /// var loginData = new Dictionary /// { /// { "username", "user@example.com" }, @@ -42,23 +42,23 @@ namespace UVC.Network public class HttpRequester { /// - /// ⺻ ּԴϴ. + /// 기본 도메인 주소입니다. /// public static string Domain { get; set; } = ""; /// - /// Dictionary HTTP ޼ҵ API û մϴ. + /// Dictionary 형태의 본문을 가진 사용자 정의 HTTP 메소드로 API 요청을 수행합니다. /// - /// ͸ ȯ Ÿ - /// û URL (http Ե Domain ) - /// HTTP ޼ҵ (get, post, put ) - /// û Dictionary (null ) - /// ߰ (null ) - /// ū - /// Ÿ ȯ + /// 응답 데이터를 변환할 타입 + /// 요청할 URL (http가 포함되지 않은 경우 Domain과 결합) + /// HTTP 메소드 (get, post, put 등) + /// 요청 본문으로 전송할 Dictionary 데이터 (null 가능) + /// 추가할 헤더 정보 (null 가능) + /// 인증 토큰 사용 여부 + /// 지정된 타입으로 변환된 응답 데이터 /// /// - /// // PUT û + /// // PUT 요청 예제 /// public async UniTask UpdateProductAsync(int productId, string name, float price) /// { /// var body = new Dictionary @@ -78,18 +78,18 @@ namespace UVC.Network } /// - /// ڿ HTTP ޼ҵ API û մϴ. + /// 문자열 형태의 본문을 가진 사용자 정의 HTTP 메소드로 API 요청을 수행합니다. /// - /// ͸ ȯ Ÿ - /// û URL (http Ե Domain ) - /// HTTP ޼ҵ (get, post, put ) - /// û JSON ڿ (null ) - /// ߰ (null ) - /// ū - /// Ÿ ȯ + /// 응답 데이터를 변환할 타입 + /// 요청할 URL (http가 포함되지 않은 경우 Domain과 결합) + /// HTTP 메소드 (get, post, put 등) + /// 요청 본문으로 전송할 JSON 문자열 (null 가능) + /// 추가할 헤더 정보 (null 가능) + /// 인증 토큰 사용 여부 + /// 지정된 타입으로 변환된 응답 데이터 /// /// - /// // DELETE û + /// // DELETE 요청 예제 /// public async UniTask DeleteResourceAsync(string resourceId) /// { /// string jsonBody = $"{{\"id\": \"{resourceId}\"}}"; @@ -105,17 +105,17 @@ namespace UVC.Network /// - /// Dictionary JSON body ȯϿ POST û մϴ. + /// Dictionary를 JSON body로 변환하여 POST 요청을 수행합니다. /// - /// ͸ ȯ Ÿ - /// û URL (http Ե Domain ) - /// û Dictionary (null ) - /// ߰ (null ) - /// ū - /// Ÿ ȯ + /// 응답 데이터를 변환할 타입 + /// 요청할 URL (http가 포함되지 않은 경우 Domain과 결합) + /// 요청 본문으로 전송할 Dictionary 데이터 (null 가능) + /// 추가할 헤더 정보 (null 가능) + /// 인증 토큰 사용 여부 + /// 지정된 타입으로 변환된 응답 데이터 /// /// - /// // α û + /// // 사용자 로그인 요청 예제 /// public async UniTask LoginAsync(string username, string password) /// { /// var body = new Dictionary @@ -127,7 +127,7 @@ namespace UVC.Network /// return await HttpRequester.RequestPost("/api/login", body); /// } /// - /// // LoginResponse Ŭ + /// // LoginResponse 클래스 예제 /// [Serializable] /// public class LoginResponse /// { @@ -142,17 +142,17 @@ namespace UVC.Network } /// - /// ڿ JSON body Ͽ POST û մϴ. + /// 문자열 형태의 JSON을 body로 사용하여 POST 요청을 수행합니다. /// - /// ͸ ȯ Ÿ - /// û URL (http Ե Domain ) - /// û JSON ڿ - /// ߰ (null ) - /// ū - /// Ÿ ȯ + /// 응답 데이터를 변환할 타입 + /// 요청할 URL (http가 포함되지 않은 경우 Domain과 결합) + /// 요청 본문으로 전송할 JSON 문자열 + /// 추가할 헤더 정보 (null 가능) + /// 인증 토큰 사용 여부 + /// 지정된 타입으로 변환된 응답 데이터 /// /// - /// // JSON ڿ ûϴ + /// // 사용자 정의 JSON 문자열로 요청하는 예제 /// public async UniTask UpdateProductAsync(int productId, string productName) /// { /// string jsonBody = $"{{\"id\": {productId}, \"name\": \"{productName}\"}}"; @@ -167,17 +167,17 @@ namespace UVC.Network } /// - /// GET API ȣմϴ. + /// GET 방식으로 API를 호출합니다. /// - /// ͸ ȯ Ÿ - /// û URL (http Ե Domain ) - /// û Ķ (URL Ʈ ȯ) - /// ߰ (null ) - /// ū - /// Ÿ ȯ + /// 응답 데이터를 변환할 타입 + /// 요청할 URL (http가 포함되지 않은 경우 Domain과 결합) + /// 요청에 포함할 파라미터 (URL 쿼리스트링으로 변환) + /// 추가할 헤더 정보 (null 가능) + /// 인증 토큰 사용 여부 + /// 지정된 타입으로 변환된 응답 데이터 /// /// - /// // ǰ + /// // 상품 목록을 가져오는 예제 /// public async UniTask> GetProductsAsync(int page = 1, int pageSize = 20) /// { /// var queryParams = new Dictionary @@ -189,7 +189,7 @@ namespace UVC.Network /// return await HttpRequester.RequestGet>("/api/products", queryParams); /// } /// - /// // Product Ŭ + /// // Product 클래스 예제 /// [Serializable] /// public class Product /// { @@ -205,23 +205,23 @@ namespace UVC.Network } /// - /// HTTP û óϴ ޼ҵ + /// HTTP 요청을 처리하는 내부 메소드 /// /// - /// ޼ҵ HTTP û óմϴ: - /// - URL (Domain ) - /// - HTTP ޼ҵ - /// - - /// - û α - /// - ó ȭ + /// 이 메소드는 모든 HTTP 요청의 공통 로직을 처리합니다: + /// - URL 구성 (Domain과 상대 경로 결합) + /// - HTTP 메소드 설정 + /// - 헤더 설정 + /// - 요청 로깅 + /// - 응답 처리 및 역직렬화 /// - /// ͸ ȯ Ÿ - /// û URL - /// û (JSON ڿ) - /// HTTP ޼ҵ ڿ - /// ߰ - /// ū - /// Ÿ ȯ + /// 응답 데이터를 변환할 타입 + /// 요청할 URL + /// 요청 본문 (JSON 문자열) + /// HTTP 메소드 문자열 + /// 추가할 헤더 정보 + /// 인증 토큰 사용 여부 + /// 지정된 타입으로 변환된 응답 데이터 private static async UniTask Request_(string url, string body = null, string methodString = "post", Dictionary header = null, bool useAuth = false) { HTTPMethods method = StringToMethod(methodString); @@ -257,7 +257,7 @@ namespace UVC.Network log.ResponseData = response; log.ResponseDate = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); ServerLog.LogHttpResponse(log); - //T string̸ + //T가 string이면 if (typeof(T) == typeof(string)) { return (T)(object)response; @@ -269,17 +269,17 @@ namespace UVC.Network } /// - /// Dictionary JSON body ȯϿ POST û ϰ ó ð Բ ȯմϴ. + /// Dictionary를 JSON body로 변환하여 POST 요청을 수행하고 처리 시간도 함께 반환합니다. /// - /// ͸ ȯ Ÿ - /// û URL (http Ե Domain ) - /// û Dictionary (null ) - /// ߰ (null ) - /// ū - /// Ÿ ȯ Ϳ û ó ð + /// 응답 데이터를 변환할 타입 + /// 요청할 URL (http가 포함되지 않은 경우 Domain과 결합) + /// 요청 본문으로 전송할 Dictionary 데이터 (null 가능) + /// 추가할 헤더 정보 (null 가능) + /// 인증 토큰 사용 여부 + /// 지정된 타입으로 변환된 응답 데이터와 요청 처리 시간 /// /// - /// // ð ϴ + /// // 서버 응답 시간을 측정하는 예제 /// public async UniTask<(UserData, TimeSpan)> GetUserDataWithPerformanceCheck(int userId) /// { /// var body = new Dictionary @@ -289,7 +289,7 @@ namespace UVC.Network /// /// var (userData, duration) = await HttpRequester.RequestPostWithDuration("/api/users/details", body); /// - /// Debug.Log($"API ð: {duration.TotalMilliseconds}ms"); + /// Debug.Log($"API 응답 시간: {duration.TotalMilliseconds}ms"); /// return (userData, duration); /// } /// @@ -300,26 +300,26 @@ namespace UVC.Network } /// - /// ڿ JSON body Ͽ POST û ϰ ó ð Բ ȯմϴ. + /// 문자열 형태의 JSON을 body로 사용하여 POST 요청을 수행하고 처리 시간도 함께 반환합니다. /// - /// ͸ ȯ Ÿ - /// û URL (http Ե Domain ) - /// û JSON ڿ - /// ߰ (null ) - /// ū - /// Ÿ ȯ Ϳ û ó ð + /// 응답 데이터를 변환할 타입 + /// 요청할 URL (http가 포함되지 않은 경우 Domain과 결합) + /// 요청 본문으로 전송할 JSON 문자열 + /// 추가할 헤더 정보 (null 가능) + /// 인증 토큰 사용 여부 + /// 지정된 타입으로 변환된 응답 데이터와 요청 처리 시간 /// /// - /// // Ŀ JSON ûϰ ð ϴ + /// // 커스텀 JSON으로 요청하고 응답 시간을 측정하는 예제 /// public async UniTask<(APIResponse, TimeSpan)> SendComplexDataWithTiming(string jsonData) /// { - /// // jsonData ̹ ȭ JSON ڿ + /// // jsonData는 이미 직렬화된 JSON 문자열 /// /// var (response, duration) = await HttpRequester.RequestPostWithDuration("/api/complex-operation", jsonData); /// /// if (duration.TotalSeconds > 1.0) /// { - /// Debug.LogWarning($"API ϴ: {duration.TotalSeconds}"); + /// Debug.LogWarning($"API 응답이 느립니다: {duration.TotalSeconds}초"); /// } /// /// return (response, duration); @@ -332,33 +332,33 @@ namespace UVC.Network } /// - /// GET API ȣϰ ó ð Բ ȯմϴ. + /// GET 방식으로 API를 호출하고 처리 시간도 함께 반환합니다. /// - /// ͸ ȯ Ÿ - /// û URL (http Ե Domain ) - /// û Ķ (URL Ʈ ȯ) - /// ߰ (null ) - /// ū - /// Ÿ ȯ Ϳ û ó ð + /// 응답 데이터를 변환할 타입 + /// 요청할 URL (http가 포함되지 않은 경우 Domain과 결합) + /// 요청에 포함할 파라미터 (URL 쿼리스트링으로 변환) + /// 추가할 헤더 정보 (null 가능) + /// 인증 토큰 사용 여부 + /// 지정된 타입으로 변환된 응답 데이터와 요청 처리 시간 /// /// - /// // Ȯ ð + /// // 서버 상태 확인 및 응답 시간 측정 예제 /// public async UniTask<(ServerStatus, TimeSpan)> CheckServerStatus() /// { /// var (status, duration) = await HttpRequester.RequestGetWithDuration("/api/server/status"); /// - /// // ð + /// // 응답 시간에 따른 서버 상태 평가 /// if (duration.TotalMilliseconds < 100) /// { - /// Debug.Log(" : ſ "); + /// Debug.Log("서버 응답 상태: 매우 좋음"); /// } /// else if (duration.TotalMilliseconds < 500) /// { - /// Debug.Log(" : ȣ"); + /// Debug.Log("서버 응답 상태: 양호"); /// } /// else /// { - /// Debug.Log(" : "); + /// Debug.Log("서버 응답 상태: 지연됨"); /// } /// /// return (status, duration); @@ -371,24 +371,24 @@ namespace UVC.Network } /// - /// HTTP û óϰ ó ð ϴ ޼ҵ + /// HTTP 요청을 처리하고 처리 시간을 측정하는 내부 메소드 /// /// - /// ޼ҵ ʿ HTTP û óմϴ: - /// - û ó ð - /// - URL - /// - HTTP ޼ҵ - /// - - /// - û α - /// - ó ȭ + /// 이 메소드는 모든 성능 측정이 필요한 HTTP 요청의 공통 로직을 처리합니다: + /// - 요청 처리 시간 측정 + /// - URL 구성 + /// - HTTP 메소드 설정 + /// - 헤더 설정 + /// - 요청 로깅 + /// - 응답 처리 및 역직렬화 /// - /// ͸ ȯ Ÿ - /// û URL - /// û (JSON ڿ) - /// HTTP ޼ҵ ڿ - /// ߰ - /// ū - /// Ÿ ȯ Ϳ û ó ð Ʃ + /// 응답 데이터를 변환할 타입 + /// 요청할 URL + /// 요청 본문 (JSON 문자열) + /// HTTP 메소드 문자열 + /// 추가할 헤더 정보 + /// 인증 토큰 사용 여부 + /// 지정된 타입으로 변환된 응답 데이터와 요청 처리 시간의 튜플 private static async UniTask<(T, TimeSpan)> RequestWithDuration(string url, string body = null, string methodString = "", Dictionary header = null, bool useAuth = true) { HTTPMethods method = StringToMethod(methodString); @@ -434,20 +434,20 @@ namespace UVC.Network } /// - /// ٿεմϴ. + /// 원격 서버에서 파일을 다운로드합니다. /// - /// ٿε URL - /// - /// ٿε Ϸ ȣ ݹ - /// ٿε Ʈ ݹ (progress: ٿε Ʈ , length: ü ũ) - /// ߻ ȣ ݹ - /// HTTP û ü ( ̹ ϴ null) + /// 다운로드할 파일의 URL + /// 파일을 저장할 로컬 경로 + /// 다운로드 완료시 호출될 콜백 + /// 다운로드 진행 상태 업데이트 콜백 (progress: 다운로드된 바이트 수, length: 전체 파일 크기) + /// 오류 발생시 호출될 콜백 + /// 발행된 HTTP 요청 객체 (파일이 이미 존재하는 경우 null) /// - /// ο ̹ ϴ ٿε带 ʰ ٷ OnComplete ݹ ȣմϴ. + /// 지정된 경로에 파일이 이미 존재하는 경우 다운로드를 수행하지 않고 바로 OnComplete 콜백을 호출합니다. /// /// /// - /// // ̹ ٿε + /// // 이미지 파일 다운로드 예제 /// public void DownloadImage(string imageUrl, string fileName) /// { /// string savePath = Path.Combine(Application.persistentDataPath, fileName); @@ -456,15 +456,15 @@ namespace UVC.Network /// imageUrl, /// savePath, /// () => { - /// Debug.Log($"̹ ٿεǾϴ: {savePath}"); - /// // ٿε ̹ ڵ... + /// Debug.Log($"이미지가 성공적으로 다운로드되었습니다: {savePath}"); + /// // 다운로드된 이미지 사용 코드... /// }, /// (progress, length) => { /// float percentage = (float)progress / length * 100f; - /// Debug.Log($"ٿε : {percentage:F1}%"); + /// Debug.Log($"다운로드 진행률: {percentage:F1}%"); /// }, /// (error) => { - /// Debug.LogError($"ٿε : {error}"); + /// Debug.LogError($"다운로드 실패: {error}"); /// } /// ); /// } @@ -530,18 +530,18 @@ namespace UVC.Network } /// - /// ٿε Ʈ óϿ Ϸ մϴ. + /// 다운로드 스트림을 처리하여 파일로 저장합니다. /// /// - /// ޼ҵ Ʈ ͸ Ϸ ϸ, ٿε尡 Ϸǰų ߴܵ ŷ ͸ óմϴ. - /// ٿε忡 (̰ 0 ) ˴ϴ. + /// 이 메소드는 스트림 데이터를 지정된 파일로 저장하며, 다운로드가 완료되거나 중단될 때까지 블로킹 방식으로 데이터를 처리합니다. + /// 다운로드에 실패한 경우 (길이가 0인 경우) 빈 파일은 삭제됩니다. /// - /// ٿε ͸ - /// ٿε Ʈ - /// ũ(Ʈ) + /// 다운로드한 데이터를 저장할 파일 경로 + /// 다운로드 콘텐츠 스트림 + /// 저장된 파일의 크기(바이트) /// /// - /// // Download ޼ҵ忡 ˴ϴ + /// // 내부적으로 Download 메소드에서 사용됩니다 /// long fileSize = await UniTask.RunOnThreadPool(() => /// ConsumeDownloadStream(savePath, downloadStream as BlockingDownloadContentStream)); /// @@ -583,15 +583,15 @@ namespace UVC.Network } /// - /// HTTP ޼ҵ URL HTTPRequest ü մϴ. + /// HTTP 메소드와 URL을 기반으로 적절한 HTTPRequest 객체를 생성합니다. /// - /// û HTTP ޼ҵ - /// û URL - /// û Ϸ ȣ ݹ ( ) - /// HTTPRequest ü + /// 요청에 사용할 HTTP 메소드 + /// 요청할 URL + /// 요청 완료 시 호출될 콜백 (선택 사항) + /// 생성된 HTTPRequest 객체 /// /// - /// // ( ) + /// // 내부 사용 예제 (직접 사용하지 않음) /// HTTPRequest request = SelectHTTPRequest(HTTPMethods.Get, "https://api.example.com/data"); /// request.SetHeader("Custom-Header", "HeaderValue"); /// request.Send(); @@ -615,11 +615,11 @@ namespace UVC.Network } /// - /// ڿ HTTP ޼ҵ带 Best.HTTP.HTTPMethods ȯմϴ. + /// 문자열 형태의 HTTP 메소드를 Best.HTTP.HTTPMethods 열거형으로 변환합니다. /// - /// ȯ HTTP ޼ҵ ڿ ("get", "post" ) - /// شϴ HTTPMethods - /// ʴ HTTP ޼ҵ ߻ + /// 변환할 HTTP 메소드 문자열 ("get", "post" 등) + /// 해당하는 HTTPMethods 열거형 값 + /// 지원하지 않는 HTTP 메소드인 경우 발생 private static HTTPMethods StringToMethod(string method) { return method.ToLower() switch diff --git a/Assets/Scripts/UVC/Network/HttpResponseModel.cs b/Assets/Scripts/UVC/Network/HttpResponseModel.cs new file mode 100644 index 00000000..d06efc94 --- /dev/null +++ b/Assets/Scripts/UVC/Network/HttpResponseModel.cs @@ -0,0 +1,51 @@ +#nullable enable + +namespace UVC.Network +{ + public enum APIState + { + Loaded, Loading, Error + } + + [System.Serializable] + public class HttpResponseModel + { + public int code; + public string message; + public T? data; + + public override string ToString() + { + return $"HttpResponseModel code:{code} message:{message} data:{data}"; + } + } + + /// + /// Data로 한번 감싸진 response때문에 + /// + /// + [System.Serializable] + public class ResponseDataModel + { + public T? data; + } + + public class EntityWithState + { + private APIState state; + public APIState State { get => state; } + + private T? entity; + public T? Entity { get => entity; } + + private string? message; + public string? Message { get => message; } + + public EntityWithState(APIState state, T? entity, string? message = null) + { + this.state = state; + this.entity = entity; + this.message = message; + } + } +} diff --git a/Assets/Scripts/UVC/Network/HttpResponseModel.cs.meta b/Assets/Scripts/UVC/Network/HttpResponseModel.cs.meta new file mode 100644 index 00000000..16468866 --- /dev/null +++ b/Assets/Scripts/UVC/Network/HttpResponseModel.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 942596c4ce2c4c9449479859f4117502 \ No newline at end of file diff --git a/Assets/Scripts/UVC/Pool/GameObjectPool.cs b/Assets/Scripts/UVC/Pool/GameObjectPool.cs index d9c17ce0..dfc7606c 100644 --- a/Assets/Scripts/UVC/Pool/GameObjectPool.cs +++ b/Assets/Scripts/UVC/Pool/GameObjectPool.cs @@ -94,13 +94,15 @@ namespace UVC.Pool private int _poolMisses = 0; private readonly object _statsLock = new object(); + + /// /// GameObject 프리팹을 사용하여 풀을 초기화합니다. /// /// 풀링할 오브젝트의 원본 프리팹입니다. /// 활성화된 오브젝트가 위치할 부모 Transform입니다. /// 비활성화된 오브젝트가 위치할 부모 Transform입니다. 지정하지 않으면 activeItemContainer가 사용됩니다. - public GameObjectPool(GameObject originalPrefab, Transform activeItemContainer, Transform recycledItemContainer = null) + public GameObjectPool(GameObject originalPrefab, Transform activeItemContainer, Transform? recycledItemContainer = null) { _originalPrefab = originalPrefab; _activeItemContainer = activeItemContainer; @@ -125,19 +127,31 @@ namespace UVC.Pool } /// - /// 풀에서 아이템을 가져와 지정된 키와 연결합니다. + /// 지정된 키와 연결된 항목을 검색하고, 선택적으로 해당 항목의 부모 변환을 설정합니다. /// - /// 아이템을 식별할 고유 키입니다. - /// true일 경우, 아이템의 부모를 자동으로 ActiveItemContainer로 설정합니다. - /// autoSetParent가 true일 때, 아이템의 부모를 지정된 Transform으로 설정합니다. - /// 활성화된 아이템의 T 컴포넌트입니다. 키가 이미 존재하면 null을 반환합니다. + /// 항목이 아직 활성화되지 않은 경우, 검색되어 활성 항목 컬렉션에 추가됩니다. + /// + /// 검색할 항목과 연결된 키입니다. null이거나 비어 있으면 안 됩니다. + /// 항목의 부모 변환을 자동으로 설정할지 여부를 나타내는 부울 값입니다. 부모를 설정하려면 를 사용하고, 그렇지 않으면 를 사용합니다. + /// 인 경우 항목에 설정할 부모 변환입니다. 부모를 설정하지 않으면 + /// null이 될 수 있습니다. + /// 지정된 키와 연관된 유형의 항목입니다. 항목이 없는 경우 + /// 입니다. public T? GetItem(string key, bool autoSetParent = true, Transform? parent = null) { if (_activeItems.ContainsKey(key)) { return _activeItems[key]; } + T? item = GetItem_(autoSetParent, parent); + if(item != null) _activeItems.Add(key, item); + return item; + + } + private T? GetItem_(bool autoSetParent = true, Transform? parent = null) + { T? item = null; lock (_statsLock) @@ -177,8 +191,6 @@ namespace UVC.Pool item.transform.SetParent(_activeItemContainer, false); } } - - _activeItems.Add(key, item); return item; } diff --git a/Assets/Scripts/UVC/Pool/ItemPool.cs b/Assets/Scripts/UVC/Pool/ItemPool.cs new file mode 100644 index 00000000..afb1ad52 --- /dev/null +++ b/Assets/Scripts/UVC/Pool/ItemPool.cs @@ -0,0 +1,322 @@ +#nullable enable + +using System.Collections.Generic; +using UnityEngine; + +namespace UVC.Pool +{ + /// + /// Unity의 MonoBehaviour를 상속받는 컴포넌트들을 재사용하기 위한 제네릭 오브젝트 풀 클래스입니다. + /// 오브젝트 풀링은 게임 오브젝트를 반복적으로 생성(Instantiate)하고 파괴(Destroy)하는 대신, + /// 비활성화 상태로 보관하고 필요할 때 다시 활성화하여 사용하는 디자인 패턴입니다. + /// 이를 통해 불필요한 메모리 할당 및 가비지 컬렉션을 줄여 게임 성능을 향상시킬 수 있습니다. + /// + /// 풀링할 대상이며, MonoBehaviour를 상속해야 합니다. + /// + /// + /// // 1. 풀링할 대상이 되는 스크립트 (예: Bullet.cs) + /// public class Bullet : MonoBehaviour + /// { + /// public void Fire(Vector3 direction) + /// { + /// // 발사 로직 + /// } + /// } + /// + /// // 2. 풀을 관리하는 클래스 + /// public class PlayerController : MonoBehaviour + /// { + /// public GameObject bulletPrefab; // Unity 에디터에서 총알 프리팹을 할당 + /// public Transform bulletContainer; // 활성 총알들이 위치할 부모 Transform + /// + /// private ItemPool<Bullet> bulletPool; + /// + /// void Start() + /// { + /// // 총알을 관리할 ItemPool을 생성합니다. + /// bulletPool = new ItemPool<Bullet>(bulletPrefab, bulletContainer); + /// } + /// + /// void Update() + /// { + /// if (Input.GetKeyDown(KeyCode.Space)) + /// { + /// // 풀에서 총알을 하나 가져옵니다. + /// Bullet newBullet = bulletPool.GetItem(); + /// newBullet.transform.position = this.transform.position; + /// newBullet.Fire(this.transform.forward); + /// + /// // 2초 후에 총알을 풀에 반환합니다. + /// StartCoroutine(ReturnBulletAfterTime(newBullet, 2.0f)); + /// } + /// } + /// + /// private IEnumerator ReturnBulletAfterTime(Bullet bullet, float delay) + /// { + /// yield return new WaitForSeconds(delay); + /// bulletPool.ReturnItem(bullet); + /// } + /// } + /// + /// + public class ItemPool where T : UnityEngine.MonoBehaviour + { + /// + /// Resources 폴더에 있는 프리팹의 경로입니다. 생성자에서 이 경로를 이용해 프리팹을 로드할 수 있습니다. + /// + protected string _prefabsPath = ""; + + /// + /// 풀에서 아이템을 새로 생성할 때 사용할 원본 프리팹입니다. + /// + protected GameObject _originalPrefab; + + /// + /// 현재 사용 중인 (활성화된) 아이템들이 위치할 부모 Transform 입니다. + /// 씬(Scene)의 계층 구조를 깔끔하게 정리하는 데 도움이 됩니다. + /// + protected Transform _activeItemContainer; + + /// + /// 재활용 대기 중인 (비활성화된) 아이템들이 위치할 부모 Transform 입니다. + /// null일 경우, _activeItemContainer를 사용합니다. + /// + protected Transform? _recycledItemContainer; + + /// + /// 현재 사용 중인 아이템들의 목록입니다. GetItem() 호출 시 이 목록에 추가됩니다. + /// + protected List _activeItems = new List(); + + /// + /// 재활용을 위해 대기 중인 아이템들의 목록입니다. ReturnItem() 호출 시 이 목록에 추가됩니다. + /// + protected List _recycledItems = new List(); + + // --- 통계용 필드 --- + private int _inUseCount = 0; // 현재 사용 중인 아이템의 수 + private int _peakUsage = 0; // 역대 최대 동시 사용량 + private int _poolMisses = 0; // 풀이 비어있어서 새로 생성해야 했던 횟수 + private readonly object _statsLock = new object(); // 멀티스레드 환경에서의 통계 데이터 접근을 위한 잠금 객체 + + /// + /// 현재 활성화된 아이템 목록을 가져옵니다. + /// + public List ActiveItems { get { return _activeItems; } } + + /// + /// 활성 아이템들의 부모 Transform을 가져옵니다. + /// + public Transform ActiveItemContainer { get { return _activeItemContainer; } } + + /// + /// 재활용 아이템들의 부모 Transform을 가져옵니다. + /// + public Transform? RecycledItemContainer { get { return _recycledItemContainer; } } + + /// + /// 원본 프리팹(GameObject)을 직접 전달하여 풀을 생성합니다. + /// + /// 풀링할 아이템의 원본 프리팹입니다. + /// 활성화된 아이템들이 위치할 부모 Transform입니다. + /// 비활성화된 아이템들이 위치할 부모 Transform입니다. null이면 activeItemContainer가 사용됩니다. + public ItemPool(GameObject originalPrefab, Transform activeItemContainer, Transform? recycledItemContainer = null) + { + _originalPrefab = originalPrefab; + _activeItemContainer = activeItemContainer; + _recycledItemContainer = recycledItemContainer; + + if (recycledItemContainer == null) _recycledItemContainer = _activeItemContainer; + } + + /// + /// Resources 폴더 내의 프리팹 경로(string)를 전달하여 풀을 생성합니다. + /// + /// Resources 폴더 기준의 프리팹 경로입니다. (예: "Prefabs/Enemy") + /// 활성화된 아이템들이 위치할 부모 Transform입니다. + /// 비활성화된 아이템들이 위치할 부모 Transform입니다. null이면 activeItemContainer가 사용됩니다. + public ItemPool(string prefabsPath, Transform activeItemContainer, Transform recycledItemContainer) + { + _prefabsPath = prefabsPath; + _originalPrefab = Resources.Load(prefabsPath); + _activeItemContainer = activeItemContainer; + _recycledItemContainer = recycledItemContainer; + if (recycledItemContainer == null) _recycledItemContainer = _activeItemContainer; + } + + /// + /// 풀에서 아이템을 가져옵니다. 재활용 가능한 아이템이 있으면 그것을 반환하고, 없으면 새로 생성합니다. + /// + /// true일 경우, 아이템의 부모를 자동으로 ActiveItemContainer로 설정합니다. + /// autoSetParent가 true일 때, ActiveItemContainer 대신 지정할 특정 부모 Transform입니다. + /// 활성화된 아이템의 컴포넌트 + /// + /// + /// // 기본 사용법: 자동으로 부모가 설정됩니다. + /// Bullet bullet1 = bulletPool.GetItem(); + /// + /// // 특정 부모를 지정하여 아이템을 가져옵니다. + /// Bullet bullet2 = bulletPool.GetItem(true, specialSpawnPoint); + /// + /// // 부모를 직접 설정하고 싶을 때 사용합니다. + /// Bullet bullet3 = bulletPool.GetItem(false); + /// bullet3.transform.SetParent(anotherContainer, false); + /// + /// + public T GetItem(bool autoSetParent = true, Transform? parent = null) + { + T? item = null; + + lock (_statsLock) + { + _inUseCount++; + if (_inUseCount > _peakUsage) + { + _peakUsage = _inUseCount; + } + } + + if (_recycledItems.Count > 0) + { + // 재활용 목록에 아이템이 있으면 가져와서 사용합니다. + item = _recycledItems[0]; + _recycledItems.RemoveAt(0); + } + else + { + // 재활용 목록이 비어있으면 새로 생성합니다. + lock (_statsLock) + { + _poolMisses++; + } + GameObject go = UnityEngine.Object.Instantiate(_originalPrefab); + item = go.GetComponent(); + } + + item.gameObject.SetActive(true); + if (autoSetParent) + { + // 부모를 자동으로 설정합니다. + if (parent != null) + { + item.transform.SetParent(parent, false); + } + else if (_activeItemContainer != null) + { + item.transform.SetParent(_activeItemContainer, false); + } + } + + _activeItems.Add(item); + return item; + } + + /// + /// 사용이 끝난 아이템을 풀에 반환합니다. 아이템은 비활성화되고 재활용 목록으로 이동합니다. + /// + /// 반환할 아이템 + /// true일 경우, 아이템의 부모를 RecycledItemContainer로 설정합니다. + /// + /// + /// // 총알이 어딘가에 부딪혔을 때 + /// void OnCollisionEnter(Collision collision) + /// { + /// // 아이템을 풀에 반환합니다. + /// bulletPool.ReturnItem(this); + /// } + /// + /// + public void ReturnItem(T item, bool clearParent = false) + { + if (item == null) return; + // 이미 반환되었거나 풀에 속하지 않은 아이템은 무시합니다. + if (!_activeItems.Contains(item)) return; + + lock (_statsLock) + { + _inUseCount--; + } + + _activeItems.Remove(item); + _recycledItems.Add(item); + if (clearParent) + { + // 아이템의 부모를 재활용 컨테이너로 변경하여 씬을 정리합니다. + if (item.gameObject.activeInHierarchy && _recycledItemContainer != null) + { + item.transform.SetParent(_recycledItemContainer, false); + } + } + + item.gameObject.SetActive(false); + } + + /// + /// 현재 사용 중인 모든 아이템을 풀에 반환합니다. + /// + /// + /// + /// // 스테이지가 끝날 때 모든 적을 한번에 제거(반환)합니다. + /// enemyPool.ReturnAll(); + /// + /// + public void ReturnAll() + { + int i, len = _activeItems.Count; + for (i = 0; i < len; i++) + { + ReturnItem(_activeItems[0]); + } + } + + /// + /// 재활용 목록에 있는 모든 아이템의 게임 오브젝트를 파괴(Destroy)합니다. + /// 메모리를 정리하고 싶을 때 사용합니다. (예: 씬 전환 시) + /// + public void ClearRecycledItems() + { + if (_recycledItems == null) + return; + + var c = _recycledItems.Count; + for (int i = 0; i < c; i++) + { + var item = _recycledItems[0]; + if (item != null) + UnityEngine.Object.Destroy(item.gameObject); + } + _recycledItems.Clear(); + } + + /// + /// 풀의 현재 성능 통계를 문자열로 반환합니다. 디버깅 및 성능 분석에 유용합니다. + /// + /// 풀 통계 (최대 사용량, 현재 사용량, 풀 비어있을 때 생성 횟수, 현재 풀 크기) + /// + /// + /// void OnGUI() + /// { + /// // 화면에 풀 통계를 표시합니다. + /// GUI.Label(new Rect(10, 10, 500, 20), bulletPool.GetStats()); + /// } + /// + /// + public string GetStats() + { + return $"최대 사용량: {_peakUsage}, 현재 사용량: {_inUseCount}, 풀 비어있을 때 생성 횟수: {_poolMisses}, 현재 풀 크기: {_recycledItems.Count}"; + } + + /// + /// 풀의 성능 통계 데이터를 초기화합니다. + /// + public void ResetStats() + { + lock (_statsLock) + { + _peakUsage = 0; + _poolMisses = 0; + } + } + + } +} \ No newline at end of file diff --git a/Assets/Scripts/UVC/Pool/ItemPool.cs.meta b/Assets/Scripts/UVC/Pool/ItemPool.cs.meta new file mode 100644 index 00000000..105fdf78 --- /dev/null +++ b/Assets/Scripts/UVC/Pool/ItemPool.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6c1650b14f2ed7a4ba6163059aa6f5f7 \ No newline at end of file diff --git a/Assets/Scripts/UVC/UI/Loading.meta b/Assets/Scripts/UVC/UI/Loading.meta new file mode 100644 index 00000000..c87d08a4 --- /dev/null +++ b/Assets/Scripts/UVC/UI/Loading.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 027afc20f17ea9a46af9e3340241f00e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UVC/UI/Loading/UILoading.cs b/Assets/Scripts/UVC/UI/Loading/UILoading.cs new file mode 100644 index 00000000..19613a8d --- /dev/null +++ b/Assets/Scripts/UVC/UI/Loading/UILoading.cs @@ -0,0 +1,104 @@ +using System.Collections; +using UnityEngine; +using UnityEngine.UI; + +namespace UVC.UI.Loading +{ + [RequireComponent(typeof(CanvasGroup))] + public class UILoading : UnityEngine.MonoBehaviour + { + public static string PrefabPath = "Prefabs/UI/Loading/UILoading"; + + private static UILoading instance; + + public static void Show() + { + if (instance == null) { + GameObject prefab = Resources.Load(PrefabPath); + GameObject go = Instantiate(prefab); + go.name = "UILoading"; + go.transform.SetParent(null, false); + instance = go.GetComponent(); + } + instance.ShowLoading(); + } + + public static void Hide() + { + if (instance != null) + { + instance.HideLoading(); + } + } + + + 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 float loadingSpeed = 1.5f; + private float rotationSpeed = 1.0f; + + private void Awake() + { + canvasGroup = GetComponent(); + loadinImage = transform.Find("loadingImage").GetComponent(); + loadingImageTransform = loadinImage.transform; + + } + + + public void ShowLoading() + { + if (animatting && target == 1) return; + + target = 1; + animatting = true; + StopCoroutine("Animate"); + StartCoroutine(Animate()); + } + + public void HideLoading() + { + if (animatting && target == 0) return; + + target = 0; + animatting = true; + StopCoroutine("Animate"); + StartCoroutine(Animate()); + } + + private IEnumerator Animate() + { + float start = canvasGroup.alpha; + float time = 0; + + while (time < duration) + { + time += Time.deltaTime; + canvasGroup.alpha = Mathf.Lerp(start, target, time / duration); + yield return null; + } + + canvasGroup.alpha = target; + animatting = false; + if(target == 0) + { + Destroy(gameObject); + } + } + + private void Update() + { + if (canvasGroup.alpha == 1) + { + loadingImageTransform.Rotate(Vector3.forward, loadingSpeed * Time.deltaTime * 360); + loadinImage.fillAmount = Mathf.PingPong(Time.time * rotationSpeed, 1); + } + } + } +} diff --git a/Assets/Scripts/UVC/UI/Loading/UILoading.cs.meta b/Assets/Scripts/UVC/UI/Loading/UILoading.cs.meta new file mode 100644 index 00000000..2e6c6f10 --- /dev/null +++ b/Assets/Scripts/UVC/UI/Loading/UILoading.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0575433bbc705184a91373cc1596e713 \ No newline at end of file diff --git a/Assets/Scripts/UVC/UI/Loading/UILoadingBar.cs b/Assets/Scripts/UVC/UI/Loading/UILoadingBar.cs new file mode 100644 index 00000000..eed83331 --- /dev/null +++ b/Assets/Scripts/UVC/UI/Loading/UILoadingBar.cs @@ -0,0 +1,131 @@ +using System.Collections; +using TMPro; +using UnityEngine; +using UnityEngine.UI; + +namespace UVC.UI.Loading +{ + [RequireComponent(typeof(CanvasGroup))] + public class UILoadingBar : UnityEngine.MonoBehaviour + { + public static string PrefabPath = "Prefabs/UI/Loading/UILoadingBar"; + + private static UILoadingBar instance; + + /// + /// 0.0~1.0 + /// + public static float Percent + { + get + { + if (instance == null) return 0; + return instance.loadinImage.fillAmount; + } + set + { + if (instance == null) return; + instance.loadinImage.fillAmount = value; + } + } + + public static string Message + { + get + { + if (instance == null) return ""; + return instance.text.text; + } + set + { + if (instance == null) return; + instance.text.text = value; + } + } + + public static void Show(string message = "") + { + if (instance == null) { + GameObject prefab = Resources.Load(PrefabPath); + GameObject go = Instantiate(prefab); + go.name = "UILoadingBar"; + go.transform.SetParent(null, false); + instance = go.GetComponent(); + } + Message = message; + instance.ShowLoading(); + } + + public static void Hide() + { + if (instance != null) + { + instance.HideLoading(); + } + } + + + + 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() + { + if (animatting && target == 1) return; + + target = 1; + animatting = true; + StopCoroutine("Animate"); + StartCoroutine(Animate()); + } + + public void HideLoading() + { + if (animatting && target == 0) return; + + target = 0; + animatting = true; + StopCoroutine("Animate"); + StartCoroutine(Animate()); + } + + private IEnumerator Animate() + { + float start = canvasGroup.alpha; + float time = 0; + + while (time < duration) + { + time += Time.deltaTime; + canvasGroup.alpha = Mathf.Lerp(start, target, time / duration); + yield return null; + } + + canvasGroup.alpha = target; + animatting = false; + if(target == 0) + { + Destroy(gameObject); + } + } + + } +} diff --git a/Assets/Scripts/UVC/UI/Loading/UILoadingBar.cs.meta b/Assets/Scripts/UVC/UI/Loading/UILoadingBar.cs.meta new file mode 100644 index 00000000..db5d5e15 --- /dev/null +++ b/Assets/Scripts/UVC/UI/Loading/UILoadingBar.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4fb7ebdfa824a214caad9f55f3398cc0 \ No newline at end of file diff --git a/Assets/Scripts/UVC/UI/SliderWithEvent.cs b/Assets/Scripts/UVC/UI/SliderWithEvent.cs new file mode 100644 index 00000000..0b48c55f --- /dev/null +++ b/Assets/Scripts/UVC/UI/SliderWithEvent.cs @@ -0,0 +1,100 @@ +using System; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +namespace UVC.UI +{ + /// + /// Unity의 기본 Slider 컴포넌트를 확장하여 드래그 시작, 드래그 중, 드래그 종료 및 클릭 이벤트를 제공하는 클래스입니다. + /// 이를 통해 슬라이더 상호작용에 대한 더 세밀한 제어가 가능합니다. + /// + [ExecuteAlways] + [RequireComponent(typeof(RectTransform))] + public class SliderWithEvent : Slider, IEndDragHandler + { + private bool isDragging = false; + /// + /// 슬라이더가 현재 드래그 중인지 여부를 나타냅니다. + /// + public bool IsDragging { get => isDragging; } + + private Vector2 downPosition = Vector2.zero; + + /// + /// 슬라이더를 클릭했을 때 호출될 액션입니다. + /// 드래그가 아닌, 포인터를 눌렀다 뗄 때 위치가 동일한 경우에만 발생합니다. + /// + public Action OnClickAction { get; set; } + + /// + /// 슬라이더를 드래그하는 동안 계속해서 호출될 액션입니다. + /// + public Action OnDragAction { get; set; } + + /// + /// 슬라이더 드래그를 마쳤을 때 호출될 액션입니다. + /// + public Action OnEndDragAction { get; set; } + + /// + /// 슬라이더를 드래그할 때 호출되는 Unity 이벤트 메서드입니다. + /// IsDragging 상태를 true로 설정하고 OnDragAction을 호출합니다. + /// + /// 포인터 이벤트 데이터입니다. + public override void OnDrag(PointerEventData eventData) + { + if (!MayDrag(eventData)) return; + base.OnDrag(eventData); + isDragging = true; + if (OnDragAction != null) OnDragAction.Invoke(); + } + + /// + /// 슬라이더 드래그를 마쳤을 때 호출되는 IEndDragHandler 인터페이스의 메서드입니다. + /// IsDragging 상태를 false로 설정하고 OnEndDragAction을 호출합니다. + /// + /// 포인터 이벤트 데이터입니다. + public void OnEndDrag(PointerEventData eventData) + { + isDragging = false; + if (OnEndDragAction != null) OnEndDragAction.Invoke(); + } + + /// + /// 슬라이더 위에서 포인터를 눌렀을 때 호출되는 Unity 이벤트 메서드입니다. + /// 클릭 판정을 위해 시작 위치를 저장합니다. + /// + /// 포인터 이벤트 데이터입니다. + public override void OnPointerDown(PointerEventData eventData) + { + if (!MayDrag(eventData)) return; + base.OnPointerDown(eventData); + downPosition = eventData.position; + } + + /// + /// 슬라이더 위에서 포인터를 뗄 때 호출되는 Unity 이벤트 메서드입니다. + /// 포인터를 누른 위치와 뗀 위치가 같으면 클릭으로 간주하고 OnClickAction을 호출합니다. + /// + /// 포인터 이벤트 데이터입니다. + public override void OnPointerUp(PointerEventData eventData) + { + base.OnPointerUp(eventData); + if (downPosition == eventData.position) + { + if (OnClickAction != null) OnClickAction.Invoke(); + } + } + + /// + /// 드래그가 가능한 상태인지 확인합니다. (활성화, 상호작용 가능, 왼쪽 마우스 버튼) + /// + /// 포인터 이벤트 데이터입니다. + /// 드래그 가능 여부를 반환합니다. + private bool MayDrag(PointerEventData eventData) + { + return IsActive() && IsInteractable() && eventData.button == PointerEventData.InputButton.Left; + } + } +} diff --git a/Assets/Scripts/UVC/UI/SliderWithEvent.cs.meta b/Assets/Scripts/UVC/UI/SliderWithEvent.cs.meta new file mode 100644 index 00000000..a2aae0d8 --- /dev/null +++ b/Assets/Scripts/UVC/UI/SliderWithEvent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c91122bcd4466654a8edf4e66c23448a \ No newline at end of file diff --git a/Assets/Scripts/UVC/UI/UIDragger.cs b/Assets/Scripts/UVC/UI/UIDragger.cs new file mode 100644 index 00000000..bf602544 --- /dev/null +++ b/Assets/Scripts/UVC/UI/UIDragger.cs @@ -0,0 +1,175 @@ +using System; +using UnityEngine; +using UnityEngine.EventSystems; + +namespace UVC.UI +{ + + /// + /// UI 요소를 마우스로 드래그하여 이동할 수 있게 만드는 컴포넌트입니다. + /// IBeginDragHandler, IDragHandler, IEndDragHandler 인터페이스를 구현하여 드래그 이벤트를 처리합니다. + /// 이 컴포넌트는 드래그될 UI 요소의 자식 오브젝트(예: 창의 헤더 영역)에 부착되어야 합니다. + /// + /// + /// 사용 예제: + /// 1. 드래그하고 싶은 창(Panel) UI를 만듭니다. + /// 2. 해당 창의 자식으로 드래그 핸들 역할을 할 UI(예: Image)를 만들고, 이 오브젝트에 `UIDragger` 컴포넌트를 추가합니다. + /// 3. 아래와 같은 컨트롤러 스크립트를 만들어 창에 추가하고, Inspector 창에서 `draggerHandle`과 `windowPanel`을 연결해줍니다. + /// + /// using UnityEngine; + /// using UVC.UI; + /// + /// public class DraggableWindowController : MonoBehaviour + /// { + /// // UIDragger 컴포넌트가 부착된 드래그 핸들 오브젝트 + /// public UIDragger draggerHandle; + /// + /// void Start() + /// { + /// // 드래그 시작 이벤트 구독 + /// draggerHandle.onBeginDragHandler += () => + /// { + /// Debug.Log("창 드래그가 시작되었습니다!"); + /// }; + /// + /// // 드래그 종료 이벤트 구독 + /// draggerHandle.OnEndDragHandler += pos => + /// { + /// Debug.Log($"창 드래그가 종료되었습니다! 최종 위치: {pos}"); + /// }; + /// } + /// } + /// + /// + public class UIDragger : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler + { + [Header("드래그 설정")] + [SerializeField] + [Tooltip("드래그 가능한 영역을 지정합니다. 이 영역 내에서 드래그가 가능합니다.")] + private RectTransform dragArea; // 드래그가 가능한 영역 + [SerializeField] + [Tooltip("드래그할 UI 요소를 지정합니다. 이 요소가 실제로 드래그됩니다.")] + private RectTransform dragObject; // 실제로 드래그될 UI 요소 (예: 창 전체) + [SerializeField] + [Tooltip("드래그 시작 시 해당 UI 요소를 맨 앞으로 가져올지 여부를 설정합니다.")] + private bool topOnDrag = true; // 드래그 시작 시 맨 앞으로 가져올지 여부 + [SerializeField] + [Tooltip("드래그 영역 제한 시 사용할 최소 높이값")] + private float yMinHeight = 30; + + private Vector2 originalLocalPointerPosition; // 드래그 시작 시 마우스 포인터의 로컬 위치 + private Vector3 originalPanelLocalPosition; // 드래그 시작 시 패널의 로컬 위치 + + /// + /// 드래그가 끝났을 때 발생하는 이벤트입니다. 최종 위치 정보를 전달합니다. + /// + public Action OnEndDragHandler { get; set; } + + /// + /// 드래그가 시작될 때 발생하는 액션입니다. + /// + public Action onBeginDragHandler; + + + // 원래의 형제 순서(UI 렌더링 순서) + private int baseSibling; + + private void Awake() + { + // dragObject가 설정되지 않았다면, 부모를 드래그 대상으로 설정 + if (dragObject == null) + { + dragObject = transform.parent as RectTransform; + if (dragObject == null) + { + Debug.LogError("[UIDragger] 드래그할 객체(dragObject)를 찾을 수 없습니다. 부모가 RectTransform이 아닙니다.", this); + enabled = false; + return; + } + } + + // dragArea가 설정되지 않았다면, 최상위 Canvas를 드래그 영역으로 설정 + if (dragArea == null) + { + dragArea = GetComponentInParent()?.transform as RectTransform; + if (dragArea == null) + { + Debug.LogError("[UIDragger] 드래그 영역(dragArea)으로 사용할 Canvas를 찾을 수 없습니다.", this); + enabled = false; + return; + } + } + } + + /// + /// 드래그가 시작될 때 호출됩니다. (IBeginDragHandler) + /// + public void OnBeginDrag(PointerEventData data) + { + if (data.button != PointerEventData.InputButton.Left) return; + + originalPanelLocalPosition = dragObject.localPosition; + baseSibling = dragObject.GetSiblingIndex(); + + RectTransformUtility.ScreenPointToLocalPointInRectangle(dragArea, data.position, data.pressEventCamera, out originalLocalPointerPosition); + + if (topOnDrag) + { + dragObject.SetAsLastSibling(); + } + onBeginDragHandler?.Invoke(); + } + + /// + /// 드래그 중일 때 매 프레임 호출됩니다. (IDragHandler) + /// + public void OnDrag(PointerEventData data) + { + if (data.button != PointerEventData.InputButton.Left) return; + + if (RectTransformUtility.ScreenPointToLocalPointInRectangle(dragArea, data.position, data.pressEventCamera, out Vector2 localPointerPosition)) + { + Vector3 offsetToOriginal = localPointerPosition - originalLocalPointerPosition; + dragObject.localPosition = originalPanelLocalPosition + offsetToOriginal; + } + + ClampToArea(); + } + + /// + /// 드래그가 끝났을 때 호출됩니다. (IEndDragHandler) + /// + public void OnEndDrag(PointerEventData eventData) + { + if (eventData.button != PointerEventData.InputButton.Left) return; + + if (topOnDrag) + { + dragObject.SetSiblingIndex(baseSibling); + } + OnEndDragHandler?.Invoke(dragObject.anchoredPosition); + } + + /// + /// UI 요소가 드래그 영역 내에 있도록 위치를 제한합니다. + /// + private void ClampToArea() + { + Vector3 pos = dragObject.localPosition; + Rect dragObjectRect = dragObject.rect; + Rect dragAreaRect = dragArea.rect; + + // Pivot을 기준으로 최소/최대 위치를 계산합니다. + float minX = dragAreaRect.xMin - dragObjectRect.xMin; + float maxX = dragAreaRect.xMax - dragObjectRect.xMax; + float minY = dragAreaRect.yMin - dragObjectRect.yMin; + float maxY = dragAreaRect.yMax - dragObjectRect.yMax; + + pos.x = Mathf.Clamp(pos.x, minX, maxX); + pos.y = Mathf.Clamp(pos.y, minY, maxY - yMinHeight); + + dragObject.localPosition = pos; + } + } + +} \ No newline at end of file diff --git a/Assets/Scripts/UVC/UI/UIDragger.cs.meta b/Assets/Scripts/UVC/UI/UIDragger.cs.meta new file mode 100644 index 00000000..f0a12e66 --- /dev/null +++ b/Assets/Scripts/UVC/UI/UIDragger.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 31446b5c56e405741ac8a38fe5a42443 \ No newline at end of file diff --git a/Assets/Scripts/UVC/UI/UISliderWithLabel.cs b/Assets/Scripts/UVC/UI/UISliderWithLabel.cs new file mode 100644 index 00000000..d8b53db6 --- /dev/null +++ b/Assets/Scripts/UVC/UI/UISliderWithLabel.cs @@ -0,0 +1,81 @@ +using System; +using TMPro; +using UnityEngine; + +namespace UVC.UI +{ + [RequireComponent(typeof(RectTransform))] + public class UISliderWithLabel : UnityEngine.MonoBehaviour + { + private TextMeshProUGUI label; + private SliderWithEvent slider; + + public int Value + { + get + { + return (int)slider.value; + } + + set + { + if (slider.value != value) + { + slider.value = value; + UpdateLabel(); + } + } + } + + public Action OnChangeValue { get; set; } + + + public void Init() + { + label = GetComponentInChildren(); + slider = GetComponentInChildren(); + slider.onValueChanged.AddListener(onValueChangedSlider); + slider.OnClickAction += OnClickSlider; + slider.OnEndDragAction += OnEndDragSlider; + + slider.value = 1; + label.text = $"{slider.value}x"; + } + + + private void onValueChangedSlider(float value) + { + UpdateLabel(); + } + + private void OnClickSlider() + { + UpdateLabel(); + DispatchOnChange(); + } + + private void OnEndDragSlider() + { + UpdateLabel(); + DispatchOnChange(); + } + + private void DispatchOnChange() + { + if (OnChangeValue != null) OnChangeValue.Invoke(Value); + } + + private void UpdateLabel() + { + label.text = $"{slider.value}x"; + } + + private void OnDestroy() + { + slider.onValueChanged.RemoveListener(onValueChangedSlider); + slider.OnClickAction = null; + slider.OnEndDragAction = null; + } + + } +} diff --git a/Assets/Scripts/UVC/UI/UISliderWithLabel.cs.meta b/Assets/Scripts/UVC/UI/UISliderWithLabel.cs.meta new file mode 100644 index 00000000..a19ac897 --- /dev/null +++ b/Assets/Scripts/UVC/UI/UISliderWithLabel.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c522490ef2b479444a65008dd03a24e9 \ No newline at end of file diff --git a/Assets/Scripts/UVC/Util/DateTimeUtil.cs b/Assets/Scripts/UVC/Util/DateTimeUtil.cs new file mode 100644 index 00000000..d5eea0da --- /dev/null +++ b/Assets/Scripts/UVC/Util/DateTimeUtil.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UVC.Util +{ + public static class DateTimeUtil + { + //헝가리 서버에서 NQTT 시간이 UTC 시간으로 전송되서 Greenwich Standard Time 로 변경 + private static TimeZoneInfo hungaryInfo = TimeZoneInfo.FindSystemTimeZoneById("Central Europe Standard Time"); + private static TimeZoneInfo koreadInfo = TimeZoneInfo.FindSystemTimeZoneById("Korea Standard Time");//korea + + /// + /// 헝가리 시간 + /// + public static DateTime HungaryNow { get => TimeZoneInfo.ConvertTime(DateTime.Now, TimeZoneInfo.Local, hungaryInfo); } + + public static string HungaryNowString { get => FormatTime(HungaryNow); } + + public static DateTime UtcNow { get => DateTime.UtcNow; } + public static string UtcNowString { get => FormatTime(UtcNow); } + + + private static TimeSpan utcHungaryGap = TimeSpan.Zero; + + private static TimeSpan utcKoreaGap = TimeSpan.Zero; + + /// + /// hungary - utc 시간 차이 + /// + public static TimeSpan UtcHungaryGap { get => (utcHungaryGap == TimeSpan.Zero) ? ToHungaryDateTime(DateTime.UtcNow) - DateTime.UtcNow : utcHungaryGap; } + + /// + /// korea - utc 시간 차이 + /// + public static TimeSpan UtcKoreaGap { get => (utcKoreaGap == TimeSpan.Zero) ? ToKoreaDateTime(DateTime.UtcNow) - DateTime.UtcNow : utcKoreaGap; } + + /// + /// UTC string을 UTC DateTime으로 변환. yyyy-MM-ddTHH:mm:ss.fffZ 포맷이라 제대로 변환 됨 + /// + /// + /// + public static DateTime UtcParse(string s) { return DateTime.Parse(s).ToUniversalTime(); } + + /// + /// string을 DateTime으로 변환 + /// + /// + /// + /// + public static DateTime Parse(string s, string format) { return DateTime.ParseExact(s, format, CultureInfo.InvariantCulture); } + + + /// + /// UTC DateTime을 헝가리 DateTime으로 변환 + /// + /// + /// + public static DateTime ToHungaryDateTime(DateTime utcDateTime) + { + return TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, hungaryInfo); + } + + /// + /// UTC string을 헝가리 DateTime으로 변환 + /// + /// + /// + public static DateTime UtcStringToHungaryDateTime(string s) + { + return ToHungaryDateTime(UtcParse(s)); + } + + /// + /// UTC string을 헝가리 Time String으로 변환 + /// + /// + /// + public static string UtcStringToHungaryTimeString(string s) + { + return FormatTime(UtcStringToHungaryDateTime(s)); + } + + + /// + /// UTC DateTime을 한국 DateTime으로 변환 + /// + /// + /// + public static DateTime ToKoreaDateTime(DateTime utcDateTime) + { + return TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, koreadInfo); + } + + /// + /// UTC string을 한국 DateTime으로 변환 + /// + /// + /// + public static DateTime UtcStringToKoreaDateTime(string s) + { + return ToKoreaDateTime(UtcParse(s)); + } + + + /// + /// UTC string을 한국 Time String으로 변환 + /// + /// + /// + public static string UtcStringToKoreaTimeString(string s) + { + return FormatTime(UtcStringToKoreaDateTime(s)); + } + + public static string FormatTime(DateTime dateTime) + { + return dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); + } + } +} diff --git a/Assets/Scripts/UVC/Util/DateTimeUtil.cs.meta b/Assets/Scripts/UVC/Util/DateTimeUtil.cs.meta new file mode 100644 index 00000000..9869fa2c --- /dev/null +++ b/Assets/Scripts/UVC/Util/DateTimeUtil.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a0fba0efd25a9324492be93878f287fb \ No newline at end of file