diff --git a/Assets/Resources/Prefabs/UI/Modal/Confirm.prefab b/Assets/Resources/Prefabs/UI/Modal/Confirm.prefab
new file mode 100644
index 00000000..c54535cc
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Modal/Confirm.prefab
@@ -0,0 +1,1257 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &157760054528398823
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1863887949234781852}
+ - component: {fileID: 7654955096077171671}
+ - component: {fileID: 6842567254505609782}
+ - component: {fileID: 2945644090061992249}
+ m_Layer: 5
+ m_Name: cancelButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1863887949234781852
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 157760054528398823}
+ 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: 7472250681771032410}
+ m_Father: {fileID: 8878455978135248687}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0}
+ m_AnchorMax: {x: 0.5, y: 0}
+ m_AnchoredPosition: {x: 50, y: 10}
+ m_SizeDelta: {x: 80, y: 30}
+ m_Pivot: {x: 0.5, y: 0}
+--- !u!222 &7654955096077171671
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 157760054528398823}
+ m_CullTransparentMesh: 1
+--- !u!114 &6842567254505609782
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 157760054528398823}
+ 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!114 &2945644090061992249
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 157760054528398823}
+ 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: 6842567254505609782}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!1 &1093717867300426814
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 7472250681771032410}
+ - component: {fileID: 2682716320523083194}
+ - component: {fileID: 6092143913489455736}
+ 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 &7472250681771032410
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1093717867300426814}
+ 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: 1863887949234781852}
+ 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 &2682716320523083194
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1093717867300426814}
+ m_CullTransparentMesh: 1
+--- !u!114 &6092143913489455736
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1093717867300426814}
+ 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: Cancel
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: 163d15b363a3bb343a8ba8275d295534, type: 2}
+ m_sharedMaterial: {fileID: -8103744068923331316, guid: 163d15b363a3bb343a8ba8275d295534, type: 2}
+ m_fontSharedMaterials: []
+ m_fontMaterial: {fileID: 0}
+ m_fontMaterials: []
+ m_fontColor32:
+ serializedVersion: 2
+ rgba: 4281479730
+ m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_enableVertexGradient: 0
+ m_colorMode: 3
+ m_fontColorGradient:
+ topLeft: {r: 1, g: 1, b: 1, a: 1}
+ topRight: {r: 1, g: 1, b: 1, a: 1}
+ bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+ bottomRight: {r: 1, g: 1, b: 1, a: 1}
+ m_fontColorGradientPreset: {fileID: 0}
+ m_spriteAsset: {fileID: 0}
+ m_tintAllSprites: 0
+ m_StyleSheet: {fileID: 0}
+ m_TextStyleHashCode: -1183493901
+ m_overrideHtmlColors: 0
+ m_faceColor:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontSize: 14
+ m_fontSizeBase: 14
+ m_fontWeight: 400
+ m_enableAutoSizing: 0
+ m_fontSizeMin: 18
+ m_fontSizeMax: 72
+ m_fontStyle: 0
+ m_HorizontalAlignment: 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 &1104576128895058025
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 7106620200700405133}
+ - component: {fileID: 2762808303022281448}
+ - component: {fileID: 6984195261169084811}
+ m_Layer: 5
+ m_Name: bg
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &7106620200700405133
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1104576128895058025}
+ 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: 8878455978135248687}
+ 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 &2762808303022281448
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1104576128895058025}
+ m_CullTransparentMesh: 1
+--- !u!114 &6984195261169084811
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1104576128895058025}
+ 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: -895992892, guid: 73d757b5d1b754245969af12daf01e78, 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 &1334662641111457779
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5494539156344885554}
+ - component: {fileID: 7293543872483431824}
+ - component: {fileID: 1270272885320112562}
+ - component: {fileID: 6539452975062971784}
+ m_Layer: 5
+ m_Name: closeButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &5494539156344885554
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1334662641111457779}
+ 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: 2699345389104186032}
+ m_Father: {fileID: 8878455978135248687}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 1, y: 1}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: -10, y: -10}
+ m_SizeDelta: {x: 29, y: 30}
+ m_Pivot: {x: 1, y: 1}
+--- !u!222 &7293543872483431824
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1334662641111457779}
+ m_CullTransparentMesh: 1
+--- !u!114 &1270272885320112562
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1334662641111457779}
+ 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!114 &6539452975062971784
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1334662641111457779}
+ 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: 1270272885320112562}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!1 &2193905547316409483
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2699345389104186032}
+ - component: {fileID: 8057403921354161840}
+ - component: {fileID: 2686023620273265434}
+ 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 &2699345389104186032
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2193905547316409483}
+ 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: 5494539156344885554}
+ 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 &8057403921354161840
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2193905547316409483}
+ m_CullTransparentMesh: 1
+--- !u!114 &2686023620273265434
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2193905547316409483}
+ 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: X
+ 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 &2199150456081301992
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 6460714630850448276}
+ - component: {fileID: 5630343645790254490}
+ - component: {fileID: 1945917519109566323}
+ m_Layer: 5
+ m_Name: messageText
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &6460714630850448276
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2199150456081301992}
+ 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: 8878455978135248687}
+ 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: -40, y: -100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5630343645790254490
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2199150456081301992}
+ m_CullTransparentMesh: 1
+--- !u!114 &1945917519109566323
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2199150456081301992}
+ 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: New Text
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: e938f39f708799f42bc6cb8f2d733c45, type: 2}
+ m_sharedMaterial: {fileID: 3963494727631305252, guid: e938f39f708799f42bc6cb8f2d733c45, type: 2}
+ m_fontSharedMaterials: []
+ m_fontMaterial: {fileID: 0}
+ m_fontMaterials: []
+ m_fontColor32:
+ serializedVersion: 2
+ rgba: 4278190080
+ m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+ m_enableVertexGradient: 0
+ m_colorMode: 3
+ m_fontColorGradient:
+ topLeft: {r: 1, g: 1, b: 1, a: 1}
+ topRight: {r: 1, g: 1, b: 1, a: 1}
+ bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+ bottomRight: {r: 1, g: 1, b: 1, a: 1}
+ m_fontColorGradientPreset: {fileID: 0}
+ m_spriteAsset: {fileID: 0}
+ m_tintAllSprites: 0
+ m_StyleSheet: {fileID: 0}
+ m_TextStyleHashCode: -1183493901
+ m_overrideHtmlColors: 0
+ m_faceColor:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontSize: 14
+ m_fontSizeBase: 14
+ m_fontWeight: 400
+ m_enableAutoSizing: 0
+ m_fontSizeMin: 18
+ m_fontSizeMax: 72
+ m_fontStyle: 0
+ m_HorizontalAlignment: 1
+ m_VerticalAlignment: 256
+ m_textAlignment: 65535
+ m_characterSpacing: 0
+ m_wordSpacing: 0
+ m_lineSpacing: 0
+ m_lineSpacingMax: 0
+ m_paragraphSpacing: 0
+ m_charWidthMaxAdj: 0
+ m_TextWrappingMode: 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 &2430457894950261084
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2292531325125449254}
+ - component: {fileID: 8251914459885537350}
+ - component: {fileID: 576750368261595047}
+ m_Layer: 5
+ m_Name: titleText
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &2292531325125449254
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2430457894950261084}
+ 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: 8878455978135248687}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 20, y: -10}
+ m_SizeDelta: {x: -70, y: 30}
+ m_Pivot: {x: 0, y: 1}
+--- !u!222 &8251914459885537350
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2430457894950261084}
+ m_CullTransparentMesh: 1
+--- !u!114 &576750368261595047
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2430457894950261084}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_text: title
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: 163d15b363a3bb343a8ba8275d295534, type: 2}
+ m_sharedMaterial: {fileID: -8103744068923331316, guid: 163d15b363a3bb343a8ba8275d295534, type: 2}
+ m_fontSharedMaterials: []
+ m_fontMaterial: {fileID: 0}
+ m_fontMaterials: []
+ m_fontColor32:
+ serializedVersion: 2
+ rgba: 4278190080
+ m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+ m_enableVertexGradient: 0
+ m_colorMode: 3
+ m_fontColorGradient:
+ topLeft: {r: 1, g: 1, b: 1, a: 1}
+ topRight: {r: 1, g: 1, b: 1, a: 1}
+ bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+ bottomRight: {r: 1, g: 1, b: 1, a: 1}
+ m_fontColorGradientPreset: {fileID: 0}
+ m_spriteAsset: {fileID: 0}
+ m_tintAllSprites: 0
+ m_StyleSheet: {fileID: 0}
+ m_TextStyleHashCode: -1183493901
+ m_overrideHtmlColors: 0
+ m_faceColor:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontSize: 18
+ m_fontSizeBase: 18
+ m_fontWeight: 400
+ m_enableAutoSizing: 0
+ m_fontSizeMin: 18
+ m_fontSizeMax: 72
+ m_fontStyle: 0
+ m_HorizontalAlignment: 1
+ m_VerticalAlignment: 256
+ 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 &2913451268823470843
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 8635697060592947593}
+ - component: {fileID: 6446731617233584224}
+ - component: {fileID: 5861331382376134956}
+ m_Layer: 5
+ m_Name: shadow
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &8635697060592947593
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2913451268823470843}
+ 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: 8878455978135248687}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 5, y: -5}
+ m_SizeDelta: {x: 10, y: 10}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &6446731617233584224
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2913451268823470843}
+ m_CullTransparentMesh: 1
+--- !u!114 &5861331382376134956
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2913451268823470843}
+ 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: 887145076, guid: 4cf3568ca3f55f64cb11447d139d7a3d, type: 3}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!1 &4870865872226109854
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3379896220624033424}
+ - component: {fileID: 158648194781141200}
+ - component: {fileID: 6824421060178732060}
+ 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 &3379896220624033424
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4870865872226109854}
+ 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: 2083401330524190855}
+ 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 &158648194781141200
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4870865872226109854}
+ m_CullTransparentMesh: 1
+--- !u!114 &6824421060178732060
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4870865872226109854}
+ 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: Confirm
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: 163d15b363a3bb343a8ba8275d295534, type: 2}
+ m_sharedMaterial: {fileID: -8103744068923331316, guid: 163d15b363a3bb343a8ba8275d295534, type: 2}
+ m_fontSharedMaterials: []
+ m_fontMaterial: {fileID: 0}
+ m_fontMaterials: []
+ m_fontColor32:
+ serializedVersion: 2
+ rgba: 4281479730
+ m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_enableVertexGradient: 0
+ m_colorMode: 3
+ m_fontColorGradient:
+ topLeft: {r: 1, g: 1, b: 1, a: 1}
+ topRight: {r: 1, g: 1, b: 1, a: 1}
+ bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+ bottomRight: {r: 1, g: 1, b: 1, a: 1}
+ m_fontColorGradientPreset: {fileID: 0}
+ m_spriteAsset: {fileID: 0}
+ m_tintAllSprites: 0
+ m_StyleSheet: {fileID: 0}
+ m_TextStyleHashCode: -1183493901
+ m_overrideHtmlColors: 0
+ m_faceColor:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontSize: 14
+ m_fontSizeBase: 14
+ m_fontWeight: 400
+ m_enableAutoSizing: 0
+ m_fontSizeMin: 18
+ m_fontSizeMax: 72
+ m_fontStyle: 0
+ m_HorizontalAlignment: 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 &7976514205510484745
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2083401330524190855}
+ - component: {fileID: 4187780467952822116}
+ - component: {fileID: 310464502753067420}
+ - component: {fileID: 6115370781225003563}
+ m_Layer: 5
+ m_Name: confirmButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &2083401330524190855
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7976514205510484745}
+ 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: 3379896220624033424}
+ m_Father: {fileID: 8878455978135248687}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0}
+ m_AnchorMax: {x: 0.5, y: 0}
+ m_AnchoredPosition: {x: -50, y: 10}
+ m_SizeDelta: {x: 80, y: 30}
+ m_Pivot: {x: 0.5, y: 0}
+--- !u!222 &4187780467952822116
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7976514205510484745}
+ m_CullTransparentMesh: 1
+--- !u!114 &310464502753067420
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7976514205510484745}
+ 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!114 &6115370781225003563
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7976514205510484745}
+ 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: 310464502753067420}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!1 &8678504293771769994
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 8878455978135248687}
+ - component: {fileID: 8346611057756904400}
+ m_Layer: 5
+ m_Name: Confirm
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &8878455978135248687
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8678504293771769994}
+ 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: 8635697060592947593}
+ - {fileID: 7106620200700405133}
+ - {fileID: 5494539156344885554}
+ - {fileID: 1863887949234781852}
+ - {fileID: 2083401330524190855}
+ - {fileID: 6460714630850448276}
+ - {fileID: 2292531325125449254}
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 400, y: 250}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &8346611057756904400
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8678504293771769994}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d70c9296cdb5be34d9c934fbdd52bdae, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ titleText: {fileID: 576750368261595047}
+ messageText: {fileID: 1945917519109566323}
+ confirmButton: {fileID: 6115370781225003563}
+ confirmButtonText: {fileID: 6824421060178732060}
+ cancelButton: {fileID: 2945644090061992249}
+ cancelButtonText: {fileID: 6092143913489455736}
+ closeButton: {fileID: 6539452975062971784}
diff --git a/Assets/Resources/Prefabs/UI/Modal/Confirm.prefab.meta b/Assets/Resources/Prefabs/UI/Modal/Confirm.prefab.meta
new file mode 100644
index 00000000..999084fd
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Modal/Confirm.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 788059ac67f211f42ad47ab6abbc0488
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity
index 0cf395e1..23f9266a 100644
--- a/Assets/Scenes/Main.unity
+++ b/Assets/Scenes/Main.unity
@@ -204,7 +204,7 @@ MonoBehaviour:
m_Calls:
- m_Target: {fileID: 632541408}
m_TargetAssemblyTypeName: SampleProject.AppMain, Assembly-CSharp
- m_MethodName: ShowAlertWithCustomConfirmText
+ m_MethodName: ShowAlert
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
@@ -646,7 +646,7 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
- m_text: Alert.Show
+ m_text: Confirm.Show
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: e938f39f708799f42bc6cb8f2d733c45, type: 2}
m_sharedMaterial: {fileID: 3963494727631305252, guid: e938f39f708799f42bc6cb8f2d733c45, type: 2}
@@ -824,7 +824,6 @@ RectTransform:
- {fileID: 1694507572}
- {fileID: 19718907}
- {fileID: 2037570841}
- - {fileID: 1100357418}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@@ -832,142 +831,6 @@ RectTransform:
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0, y: 0}
---- !u!1 &502433643
-GameObject:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- serializedVersion: 6
- m_Component:
- - component: {fileID: 502433644}
- - component: {fileID: 502433646}
- - component: {fileID: 502433645}
- 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 &502433644
-RectTransform:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 502433643}
- 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: 1100357418}
- 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 &502433645
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 502433643}
- 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: Alert.Show
- m_isRightToLeft: 0
- m_fontAsset: {fileID: 11400000, guid: e938f39f708799f42bc6cb8f2d733c45, type: 2}
- m_sharedMaterial: {fileID: 3963494727631305252, guid: e938f39f708799f42bc6cb8f2d733c45, type: 2}
- m_fontSharedMaterials: []
- m_fontMaterial: {fileID: 0}
- m_fontMaterials: []
- m_fontColor32:
- serializedVersion: 2
- rgba: 4281479730
- m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
- m_enableVertexGradient: 0
- m_colorMode: 3
- m_fontColorGradient:
- topLeft: {r: 1, g: 1, b: 1, a: 1}
- topRight: {r: 1, g: 1, b: 1, a: 1}
- bottomLeft: {r: 1, g: 1, b: 1, a: 1}
- bottomRight: {r: 1, g: 1, b: 1, a: 1}
- m_fontColorGradientPreset: {fileID: 0}
- m_spriteAsset: {fileID: 0}
- m_tintAllSprites: 0
- m_StyleSheet: {fileID: 0}
- m_TextStyleHashCode: -1183493901
- m_overrideHtmlColors: 0
- m_faceColor:
- serializedVersion: 2
- rgba: 4294967295
- m_fontSize: 16
- m_fontSizeBase: 16
- m_fontWeight: 400
- m_enableAutoSizing: 0
- m_fontSizeMin: 18
- m_fontSizeMax: 72
- m_fontStyle: 0
- m_HorizontalAlignment: 2
- m_VerticalAlignment: 512
- m_textAlignment: 65535
- m_characterSpacing: 0
- m_wordSpacing: 0
- m_lineSpacing: 0
- m_lineSpacingMax: 0
- m_paragraphSpacing: 0
- m_charWidthMaxAdj: 0
- m_TextWrappingMode: 1
- m_wordWrappingRatios: 0.4
- m_overflowMode: 0
- m_linkedTextComponent: {fileID: 0}
- parentLinkedComponent: {fileID: 0}
- m_enableKerning: 0
- m_ActiveFontFeatures: 6e72656b
- m_enableExtraPadding: 0
- checkPaddingRequired: 0
- m_isRichText: 1
- m_EmojiFallbackSupport: 1
- m_parseCtrlCharacters: 1
- m_isOrthographic: 1
- m_isCullingEnabled: 0
- m_horizontalMapping: 0
- m_verticalMapping: 0
- m_uvLineOffset: 0
- m_geometrySortingOrder: 0
- m_IsTextObjectScaleStatic: 0
- m_VertexBufferAutoSizeReduction: 0
- m_useMaxVisibleDescender: 1
- m_pageToDisplay: 1
- m_margin: {x: 0, y: 0, z: 0, w: 0}
- m_isUsingLegacyAnimationComponent: 0
- m_isVolumetricText: 0
- m_hasFontAssetChanged: 0
- m_baseMaterial: {fileID: 0}
- m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
---- !u!222 &502433646
-CanvasRenderer:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 502433643}
- m_CullTransparentMesh: 1
--- !u!1 &632541406
GameObject:
m_ObjectHideFlags: 0
@@ -1122,139 +985,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: ec70649e0f460ce458cf6d62498ecf20, type: 3}
m_Name:
m_EditorClassIdentifier:
---- !u!1 &1100357417
-GameObject:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- serializedVersion: 6
- m_Component:
- - component: {fileID: 1100357418}
- - component: {fileID: 1100357421}
- - component: {fileID: 1100357420}
- - component: {fileID: 1100357419}
- m_Layer: 5
- m_Name: AlertButton (2)
- m_TagString: Untagged
- m_Icon: {fileID: 0}
- m_NavMeshLayer: 0
- m_StaticEditorFlags: 0
- m_IsActive: 1
---- !u!224 &1100357418
-RectTransform:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1100357417}
- 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: 502433644}
- m_Father: {fileID: 483439351}
- 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: -87}
- m_SizeDelta: {x: 160, y: 30}
- m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &1100357419
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1100357417}
- 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: 1100357420}
- m_OnClick:
- m_PersistentCalls:
- m_Calls:
- - m_Target: {fileID: 632541408}
- m_TargetAssemblyTypeName: SampleProject.AppMain, Assembly-CSharp
- m_MethodName: ShowSimpleAlert
- m_Mode: 1
- m_Arguments:
- m_ObjectArgument: {fileID: 0}
- m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
- m_IntArgument: 0
- m_FloatArgument: 0
- m_StringArgument:
- m_BoolArgument: 0
- m_CallState: 2
---- !u!114 &1100357420
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1100357417}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
- m_Name:
- m_EditorClassIdentifier:
- m_Material: {fileID: 0}
- m_Color: {r: 1, g: 1, b: 1, a: 1}
- m_RaycastTarget: 1
- m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
- m_Maskable: 1
- m_OnCullStateChanged:
- m_PersistentCalls:
- m_Calls: []
- m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
- m_Type: 1
- m_PreserveAspect: 0
- m_FillCenter: 1
- m_FillMethod: 4
- m_FillAmount: 1
- m_FillClockwise: 1
- m_FillOrigin: 0
- m_UseSpriteMesh: 0
- m_PixelsPerUnitMultiplier: 1
---- !u!222 &1100357421
-CanvasRenderer:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1100357417}
- m_CullTransparentMesh: 1
--- !u!1 &1101428664
GameObject:
m_ObjectHideFlags: 0
@@ -1824,7 +1554,7 @@ GameObject:
- component: {fileID: 2037570843}
- component: {fileID: 2037570842}
m_Layer: 5
- m_Name: AlertButton (1)
+ m_Name: ConfirmButton
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -1896,7 +1626,7 @@ MonoBehaviour:
m_Calls:
- m_Target: {fileID: 632541408}
m_TargetAssemblyTypeName: SampleProject.AppMain, Assembly-CSharp
- m_MethodName: ShowLocalizedAlert
+ m_MethodName: ShowConfirm
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
diff --git a/Assets/Scripts/SampleProject/AppMain.cs b/Assets/Scripts/SampleProject/AppMain.cs
index 6d0ec444..e384dfa6 100644
--- a/Assets/Scripts/SampleProject/AppMain.cs
+++ b/Assets/Scripts/SampleProject/AppMain.cs
@@ -47,28 +47,22 @@ namespace SampleProject
//mqttService.Connect();
}
- public async void ShowSimpleAlert()
- {
- Debug.Log("˸â ϴ...");
+ public async void ShowAlert()
+ {
await Alert.Show("˸", "̰ ˸ Դϴ.");
- Debug.Log("˸â ϴ.");
- }
-
- public async void ShowAlertWithCustomConfirmText()
- {
await Alert.Show("", " ϴ.", "˰ڽϴ");
- }
-
- public async void ShowLocalizedAlert()
- {
- // locale.json Ű ǵǾ ִٰ :
- // "alert_title_error": "", "Error"
- // "alert_message_network": "Ʈũ Ȯּ.", "Please check your network connection."
- // "alert_button_retry": "õ", "Retry"
-
await Alert.ShowLocalized("error", "error_network_not", "button_retry");
- // Ǵ Ȯ ư ⺻ Ű(modal_confirm_button) Ϸ:
- // await Alert.ShowLocalized("alert_title_error", "alert_message_network");
}
+
+ public async void ShowConfirm()
+ {
+ bool result = await Confirm.Show("Ȯ", "̰ ˸ Դϴ.");
+ ULog.Debug($"ڰ Ȯ ư ? {result}");
+ result = await Confirm.Show("", " ϴ.", "˰ڽϴ", "ƴϿ");
+ ULog.Debug($"ڰ ˸ Ȯ߳? {result}");
+ result = await Confirm.ShowLocalized("error", "error_network_not", "button_retry", "button_cancel");
+ ULog.Debug($"ڰ Ʈũ ˸ Ȯ߳? {result}");
+ }
+
}
}
diff --git a/Assets/Scripts/UVC/Locale/LocalizationManager.cs b/Assets/Scripts/UVC/Locale/LocalizationManager.cs
index 1c0ee8fb..441253cd 100644
--- a/Assets/Scripts/UVC/Locale/LocalizationManager.cs
+++ b/Assets/Scripts/UVC/Locale/LocalizationManager.cs
@@ -75,7 +75,7 @@ namespace UVC.Locale
{
if (_instance == null)
{
- _instance = new LocalizationManager("en-US");
+ _instance = new LocalizationManager("ko-KR");
_instance.LoadDefaultLocalizationData(); // 기본 언어 데이터 로드
}
}
diff --git a/Assets/Scripts/UVC/UI/Modal/Alert.cs b/Assets/Scripts/UVC/UI/Modal/Alert.cs
index 4b6719bc..533b7090 100644
--- a/Assets/Scripts/UVC/UI/Modal/Alert.cs
+++ b/Assets/Scripts/UVC/UI/Modal/Alert.cs
@@ -1,74 +1,138 @@
using Cysharp.Threading.Tasks;
using UVC.Locale; // ConfirmButtonText의 기본값을 위해 추가
+using UVC.Log; // ULog 사용 예시를 위해 추가 (필요에 따라)
namespace UVC.UI.Modal
{
///
- /// 간단한 알림 메시지를 표시하는 정적 클래스입니다.
- /// 확인 버튼만 있으며, 사용자의 확인을 기다립니다.
+ /// 📢 간단한 알림 메시지를 화면에 보여주는 친구예요.
+ /// 이 친구는 "확인" 버튼만 가지고 있어서, 사용자가 내용을 읽고 확인 버튼을 누를 때까지 기다려줘요.
+ /// 복잡한 선택 없이, 간단한 정보 전달이나 경고를 보여줄 때 사용하면 좋아요.
///
+ ///
+ ///
+ /// // 가장 기본적인 알림창 사용법
+ /// async UniTask ShowMyFirstAlert()
+ /// {
+ /// await Alert.Show("알림", "게임 데이터가 성공적으로 저장되었습니다!");
+ /// ULog.Debug("사용자가 알림을 확인했습니다.");
+ /// }
+ ///
+ /// // 버튼 글자도 바꿔볼까요?
+ /// async UniTask ShowCustomButtonAlert()
+ /// {
+ /// await Alert.Show("레벨 업!", "축하합니다! 레벨 5를 달성했어요!", confirmButtonText: "야호!");
+ /// }
+ ///
+ ///
public static class Alert
{
///
- /// Alert 모달 프리팹의 기본 경로입니다.
+ /// 🎨 알림창의 기본 디자인(프리팹) 파일이 어디 있는지 알려주는 경로예요.
+ /// 특별히 다른 디자인을 쓰고 싶지 않으면 이 기본 디자인을 사용해요.
///
- private const string DefaultAlertPrefabPath = "Prefabs/UI/Modal/Alert";
+ private const string DefaultPrefabPath = "Prefabs/UI/Modal/Alert";
///
- /// 지정된 제목과 메시지로 알림창을 표시합니다.
- /// 사용자가 확인 버튼을 누를 때까지 기다립니다.
+ /// ✨ 지정된 제목과 메시지로 알림창을 화면에 뿅! 하고 보여줘요.
+ /// 사용자가 "확인" 버튼을 누를 때까지 코드는 여기서 잠시 멈춰 기다려요.
///
- /// 알림창의 제목입니다.
- /// 알림창에 표시될 메시지입니다.
- /// 확인 버튼에 표시될 텍스트입니다. null일 경우 LocalizationManager에서 "modal_confirm_button" 키로 조회합니다.
- /// 사용자 정의 알림 프리팹 경로입니다. null일 경우 기본 경로를 사용합니다.
- /// 모달이 닫힐 때 완료되는 UniTask입니다.
+ /// 알림창 맨 위에 크게 보일 '제목'이에요.
+ /// 알림창에 보여줄 '메시지 내용'이에요.
+ /// "확인" 버튼에 보여줄 글자예요. 아무것도 안 적으면 기본 글자("확인" 또는 설정된 언어)가 나와요.
+ /// 만약 특별히 만들어둔 알림창 디자인이 있다면, 그 파일 경로를 여기에 적어주세요. 없으면 기본 디자인을 사용해요.
+ /// 사용자가 확인 버튼을 누르면 완료되는 작업(UniTask)이에요. 특별한 값을 돌려주진 않아요.
+ ///
+ ///
+ /// public class GameManager : MonoBehaviour
+ /// {
+ /// public async void OnPlayerSaveGame()
+ /// {
+ /// // (게임 저장 로직...)
+ /// bool success = true; // 저장 성공했다고 가정
+ ///
+ /// if (success)
+ /// {
+ /// await Alert.Show("저장 완료", "게임 진행 상황이 안전하게 저장되었습니다.", "알겠습니다");
+ /// ULog.Debug("저장 완료 알림을 플레이어가 확인했습니다.");
+ /// }
+ /// else
+ /// {
+ /// await Alert.Show("저장 실패", "오류가 발생하여 저장하지 못했습니다.", "다시 시도");
+ /// // (다시 시도 로직 또는 다른 처리...)
+ /// }
+ /// }
+ /// }
+ ///
+ ///
public static async UniTask Show(
string title,
string message,
string confirmButtonText = null,
string customPrefabPath = null)
{
- string prefabPath = string.IsNullOrEmpty(customPrefabPath) ? DefaultAlertPrefabPath : customPrefabPath;
+ string prefabPath = string.IsNullOrEmpty(customPrefabPath) ? DefaultPrefabPath : customPrefabPath;
- // ModalContent 설정
+ // ModalContent 레시피를 만들어요. 알림창은 취소 버튼이 필요 없으니 숨겨요.
ModalContent content = new ModalContent(prefabPath)
{
Title = title,
Message = message,
ShowCancelButton = false, // Alert에서는 취소 버튼 숨김
- // ConfirmButtonText는 null이면 ModalContent의 getter가 LocalizationManager를 사용함
};
+ // 확인 버튼 글자를 따로 정해줬다면 그걸로 설정해요.
if (!string.IsNullOrEmpty(confirmButtonText))
{
content.ConfirmButtonText = confirmButtonText;
}
- // else인 경우, ModalContent의 ConfirmButtonText getter가
- // LocalizationManager.Instance.GetString("modal_confirm_button")을 사용합니다.
- // 만약 이 키가 아닌 다른 키를 기본값으로 사용하고 싶다면 여기서 설정할 수 있습니다.
- // 예: content.ConfirmButtonText = LocalizationManager.Instance.GetString("alert_ok_button");
+ // 아니면 ModalContent의 기본 설정(다국어 지원 "button_confirm" 키)을 따라요.
+ // 만약 다른 기본 키를 쓰고 싶다면 여기서 설정할 수도 있어요.
+ // 예: content.ConfirmButtonText = LocalizationManager.Instance.GetString("alert_default_ok_button");
- // Modal.Open 호출. Alert은 별도의 결과를 반환하지 않으므로 T는 bool 또는 object 같은 기본 타입을 사용할 수 있습니다.
- // 여기서는 bool을 사용하고, 확인 버튼은 true를 반환하도록 Modal 시스템이 되어있다고 가정합니다.
- // 실제 반환값은 사용하지 않으므로, UniTask을 받고 무시합니다.
+ // Modal 시스템에게 "이 레시피대로 모달 창 열어줘!" 라고 부탁해요.
+ // Alert은 사용자의 선택 결과(true/false)가 중요하지 않으므로, bool 타입으로 받고 결과는 무시해요.
await Modal.Open(content);
}
///
- /// 다국어 키를 사용하여 제목과 메시지를 표시하는 알림창을 엽니다.
+ /// 🌍 다국어(여러 나라 언어)를 지원하는 알림창을 보여줘요.
+ /// 미리 준비된 '언어 키'를 알려주면, 게임 설정 언어에 맞는 글자를 자동으로 찾아서 보여줘요.
///
- /// 제목으로 사용할 다국어 키입니다.
- /// 메시지로 사용할 다국어 키입니다.
- /// 확인 버튼 텍스트로 사용할 다국어 키입니다. null일 경우 "modal_confirm_button"을 사용합니다.
- /// 사용자 정의 알림 프리팹 경로입니다. null일 경우 기본 경로를 사용합니다.
- /// 모달이 닫힐 때 완료되는 UniTask입니다.
+ /// 제목에 사용할 '언어 키'예요. (예: "alert_title_welcome")
+ /// 메시지 내용에 사용할 '언어 키'예요. (예: "alert_message_item_acquired")
+ /// 확인 버튼 글자에 사용할 '언어 키'예요. 안 적으면 기본 키("button_confirm")를 사용해요.
+ /// 특별한 알림창 디자인 파일 경로예요. 없으면 기본 디자인을 사용해요.
+ /// 사용자가 확인 버튼을 누르면 완료되는 작업(UniTask)이에요.
+ ///
+ ///
+ /// public class QuestManager : MonoBehaviour
+ /// {
+ /// public async void OnQuestCompleted(string questNameKey)
+ /// {
+ /// // 예시: 퀘스트 완료 메시지를 현재 설정된 언어로 보여줍니다.
+ /// // titleLocalizationKey: "quest_completed_title" -> "퀘스트 완료" (한국어), "Quest Complete" (영어)
+ /// // messageLocalizationKey: "quest_completed_message" -> "{0} 퀘스트를 완료했습니다!" (한국어), "You have completed the {0} quest!" (영어)
+ /// // 여기서 {0} 부분은 실제 퀘스트 이름으로 바뀔 수 있도록 LocalizationManager에서 처리한다고 가정합니다.
+ ///
+ /// string localizedQuestName = LocalizationManager.Instance.GetString(questNameKey); // 예: "main_quest_01" -> "첫 번째 임무"
+ /// string formattedMessageKey = "quest_completed_message"; // 실제로는 메시지 포맷팅이 필요할 수 있음
+ ///
+ /// // 실제 메시지는 LocalizationManager에서 포맷팅을 지원해야 함
+ /// // 여기서는 간단히 키만 전달하는 것으로 가정
+ /// await Alert.ShowLocalized("quest_completed_title", formattedMessageKey, confirmButtonLocalizationKey: "ui_button_great");
+ /// ULog.Debug("퀘스트 완료 알림을 플레이어가 확인했습니다.");
+ /// }
+ /// }
+ ///
+ ///
public static async UniTask ShowLocalized(
string titleLocalizationKey,
string messageLocalizationKey,
string confirmButtonLocalizationKey = null,
string customPrefabPath = null)
{
+ // 언어 키를 사용해서 실제 보여줄 글자들을 가져와요.
string title = LocalizationManager.Instance.GetString(titleLocalizationKey);
string message = LocalizationManager.Instance.GetString(messageLocalizationKey);
string confirmText = null;
@@ -77,8 +141,9 @@ namespace UVC.UI.Modal
{
confirmText = LocalizationManager.Instance.GetString(confirmButtonLocalizationKey);
}
- // confirmText가 null이면 Show 메서드 내부에서 ModalContent의 기본 로직(modal_confirm_button 키 사용)이 적용됩니다.
+ // confirmText가 null (따로 안 정해줬으면)이면, Show() 메서드 안에서 ModalContent의 기본 글자 로직이 알아서 처리해줘요.
+ // 준비된 글자들로 알림창을 보여달라고 Show()에게 다시 부탁해요.
await Show(title, message, confirmText, customPrefabPath);
}
}
diff --git a/Assets/Scripts/UVC/UI/Modal/Confirm.cs b/Assets/Scripts/UVC/UI/Modal/Confirm.cs
new file mode 100644
index 00000000..ff5e8e9f
--- /dev/null
+++ b/Assets/Scripts/UVC/UI/Modal/Confirm.cs
@@ -0,0 +1,188 @@
+using Cysharp.Threading.Tasks;
+using UVC.Locale; // ButtonText의 기본값을 위해 추가
+using UVC.Log; // ULog 사용 예시를 위해 추가 (필요에 따라)
+
+namespace UVC.UI.Modal
+{
+ ///
+ /// 🤔 사용자에게 "정말 ~하시겠어요?" 하고 물어보고, "예" 또는 "아니오" 선택을 받는 친구예요.
+ /// 중요한 결정이나 되돌릴 수 없는 행동 전에 한 번 더 확인받을 때 사용하면 좋아요.
+ /// 사용자가 어떤 버튼을 눌렀는지 (확인 또는 취소) 알려줘요.
+ ///
+ ///
+ ///
+ /// // 게임 종료 전에 정말 끌 건지 물어보는 예시
+ /// public async void TryExitGame()
+ /// {
+ /// bool wantsToExit = await Confirm.Show("게임 종료", "정말로 게임을 종료하시겠습니까?", "네, 종료합니다", "아니요, 계속할래요");
+ /// if (wantsToExit)
+ /// {
+ /// ULog.Debug("사용자가 게임 종료를 확인했습니다.");
+ /// // Application.Quit(); // 실제 게임 종료 코드
+ /// }
+ /// else
+ /// {
+ /// ULog.Debug("사용자가 게임 종료를 취소했습니다.");
+ /// }
+ /// }
+ ///
+ /// // 아이템 삭제 확인
+ /// public async void TryDeleteItem(string itemName)
+ /// {
+ /// string title = "아이템 삭제";
+ /// string message = $"정말로 '{itemName}' 아이템을 삭제하시겠습니까? 이 행동은 되돌릴 수 없습니다.";
+ ///
+ /// // 기본 버튼 텍스트 사용 (ModalContent에서 설정된 "확인", "취소")
+ /// bool confirmed = await Confirm.Show(title, message);
+ ///
+ /// if (confirmed)
+ /// {
+ /// ULog.Debug($"'{itemName}' 아이템 삭제를 진행합니다.");
+ /// // (아이템 삭제 로직...)
+ /// }
+ /// }
+ ///
+ ///
+ public static class Confirm
+ {
+ ///
+ /// 🎨 확인창의 기본 디자인(프리팹) 파일이 어디 있는지 알려주는 경로예요.
+ ///
+ private const string DefaultPrefabPath = "Prefabs/UI/Modal/Confirm"; // 실제 프로젝트 경로에 맞게 수정하세요.
+
+ ///
+ /// ✨ 지정된 제목과 메시지로 확인창을 화면에 뿅! 하고 보여줘요.
+ /// 사용자가 "확인" 또는 "취소" 버튼을 누를 때까지 코드는 여기서 잠시 멈춰 기다려요.
+ ///
+ /// 확인창 맨 위에 크게 보일 '제목'이에요.
+ /// 확인창에 보여줄 '질문 또는 메시지 내용'이에요.
+ /// "확인" 버튼에 보여줄 글자예요. 안 적으면 기본 글자("확인")가 나와요.
+ /// "취소" 버튼에 보여줄 글자예요. 안 적으면 기본 글자("취소")가 나와요.
+ /// 특별히 만들어둔 확인창 디자인 파일 경로예요. 없으면 기본 디자인을 사용해요.
+ /// 사용자가 "확인"을 누르면 true, "취소"를 누르면 false를 돌려주는 작업(UniTask<bool>)이에요.
+ ///
+ ///
+ /// public class ShopManager : MonoBehaviour
+ /// {
+ /// public async void OnPurchaseItem(string itemName, int price)
+ /// {
+ /// string purchaseTitle = "구매 확인";
+ /// string purchaseMessage = $"{itemName} 아이템을 {price} 골드에 구매하시겠습니까?";
+ ///
+ /// bool confirmed = await Confirm.Show(purchaseTitle, purchaseMessage, "구매", "나중에");
+ ///
+ /// if (confirmed)
+ /// {
+ /// ULog.Debug($"{itemName} 구매를 진행합니다.");
+ /// // (구매 처리 로직...)
+ /// }
+ /// else
+ /// {
+ /// ULog.Debug($"{itemName} 구매를 취소했습니다.");
+ /// }
+ /// }
+ /// }
+ ///
+ ///
+ public static async UniTask Show(
+ string title,
+ string message,
+ string confirmButtonText = null,
+ string cancelButtonText = null,
+ string customPrefabPath = null)
+ {
+ string prefabPath = string.IsNullOrEmpty(customPrefabPath) ? DefaultPrefabPath : customPrefabPath;
+
+ // ModalContent 레시피를 만들어요. 확인창은 확인/취소 버튼이 모두 필요해요.
+ ModalContent content = new ModalContent(prefabPath)
+ {
+ Title = title,
+ Message = message,
+ ShowConfirmButton = true, // Confirm에서는 확인 버튼 항상 표시
+ ShowCancelButton = true // Confirm에서는 취소 버튼 항상 표시
+ };
+
+ // 확인 버튼 글자를 따로 정해줬다면 그걸로 설정해요.
+ if (!string.IsNullOrEmpty(confirmButtonText))
+ {
+ content.ConfirmButtonText = confirmButtonText;
+ }
+
+ // 취소 버튼 글자를 따로 정해줬다면 그걸로 설정해요.
+ if (!string.IsNullOrEmpty(cancelButtonText))
+ {
+ content.CancelButtonText = cancelButtonText;
+ }
+
+ // Modal 시스템에게 "이 레시피대로 모달 창 열어줘!" 라고 부탁하고, 사용자의 선택(true/false)을 기다려요.
+ return await Modal.Open(content);
+ }
+
+ ///
+ /// 🌍 다국어(여러 나라 언어)를 지원하는 확인창을 보여줘요.
+ /// 미리 준비된 '언어 키'를 알려주면, 게임 설정 언어에 맞는 글자를 자동으로 찾아서 보여줘요.
+ ///
+ /// 제목에 사용할 '언어 키'예요. (예: "confirm_title_exit_game")
+ /// 메시지 내용에 사용할 '언어 키'예요. (예: "confirm_message_are_you_sure")
+ /// 확인 버튼 글자에 사용할 '언어 키'예요. 안 적으면 기본 키("button_confirm")를 사용해요.
+ /// 취소 버튼 글자에 사용할 '언어 키'예요. 안 적으면 기본 키("button_cancel")를 사용해요.
+ /// 특별한 확인창 디자인 파일 경로예요. 없으면 기본 디자인을 사용해요.
+ /// 사용자가 "확인"을 누르면 true, "취소"를 누르면 false를 돌려주는 작업(UniTask<bool>)이에요.
+ ///
+ ///
+ /// public class SettingsManager : MonoBehaviour
+ /// {
+ /// public async void OnResetSettings()
+ /// {
+ /// // 예시: 설정 초기화 전에 다국어로 확인을 받습니다.
+ /// // titleLocalizationKey: "settings_reset_title" -> "설정 초기화" (한국어), "Reset Settings" (영어)
+ /// // messageLocalizationKey: "settings_reset_confirm_message" -> "모든 설정을 초기화하시겠습니까?" (한국어), "Are you sure you want to reset all settings?" (영어)
+ ///
+ /// bool confirmed = await Confirm.ShowLocalized(
+ /// "settings_reset_title",
+ /// "settings_reset_confirm_message",
+ /// confirmButtonLocalizationKey: "ui_button_reset", // "초기화"
+ /// cancelButtonLocalizationKey: "ui_button_keep_current" // "유지"
+ /// );
+ ///
+ /// if (confirmed)
+ /// {
+ /// ULog.Debug("설정을 초기화합니다.");
+ /// // (설정 초기화 로직...)
+ /// }
+ /// else
+ /// {
+ /// ULog.Debug("설정 초기화를 취소했습니다.");
+ /// }
+ /// }
+ /// }
+ ///
+ ///
+ public static async UniTask ShowLocalized(
+ string titleLocalizationKey,
+ string messageLocalizationKey,
+ string confirmButtonLocalizationKey = null,
+ string cancelButtonLocalizationKey = null,
+ string customPrefabPath = null)
+ {
+ // 언어 키를 사용해서 실제 보여줄 글자들을 가져와요.
+ string title = LocalizationManager.Instance.GetString(titleLocalizationKey);
+ string message = LocalizationManager.Instance.GetString(messageLocalizationKey);
+ string confirmText = null;
+ string cancelText = null;
+
+ if (!string.IsNullOrEmpty(confirmButtonLocalizationKey))
+ {
+ confirmText = LocalizationManager.Instance.GetString(confirmButtonLocalizationKey);
+ }
+
+ if (!string.IsNullOrEmpty(cancelButtonLocalizationKey))
+ {
+ cancelText = LocalizationManager.Instance.GetString(cancelButtonLocalizationKey);
+ }
+
+ // 준비된 글자들로 확인창을 보여달라고 Show()에게 다시 부탁하고, 사용자의 선택을 기다려요.
+ return await Show(title, message, confirmText, cancelText, customPrefabPath);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/UVC/UI/Modal/Confirm.cs.meta b/Assets/Scripts/UVC/UI/Modal/Confirm.cs.meta
new file mode 100644
index 00000000..a36633b4
--- /dev/null
+++ b/Assets/Scripts/UVC/UI/Modal/Confirm.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 64b63f405dcd3d24fb7253329e140efe
\ No newline at end of file
diff --git a/Assets/Scripts/UVC/UI/Modal/Modal.cs b/Assets/Scripts/UVC/UI/Modal/Modal.cs
index ada25dad..8bd9e740 100644
--- a/Assets/Scripts/UVC/UI/Modal/Modal.cs
+++ b/Assets/Scripts/UVC/UI/Modal/Modal.cs
@@ -7,173 +7,343 @@ using UVC.Log;
namespace UVC.UI.Modal
{
+ ///
+ /// ✨짠! 특별한 알림 상자를 보여주는 마법사, Modal 클래스예요! ✨
+ /// 게임을 하다가 갑자기 "레벨 업!" 메시지가 뜨거나, "정말 게임을 끌 건가요?" 하고 물어보는 창 있죠?
+ /// 그런 창들을 '모달'이라고 불러요. Modal 클래스는 이런 모달 창을 쉽게 만들고 보여줄 수 있게 도와준답니다.
+ /// 마치 요술봉처럼, 필요할 때 "모달 나와라, 뚝딱!" 하고 명령하면 화면에 알림 상자를 뿅! 하고 나타나게 할 수 있어요.
+ /// 그리고 다 봤으면 "모달 들어가라, 뿅!" 하고 사라지게 할 수도 있죠.
+ ///
public static class Modal
{
+ ///
+ /// 📦 현재 열려있는 모달의 내용물(ModalContent)을 가리키는 포인터예요.
+ /// 모달이 열릴 때 설정되고, 닫힐 때 null이 됩니다.
+ /// OnClose 호출 시 사용됩니다.
+ ///
+ private static ModalContent currentContent;
+
+ ///
+ /// 🧙♂️ 현재 화면에 떠 있는 모달 창 자체를 가리키는 비밀 포인터예요.
+ /// 모달이 열리면 여기에 그 모달 창이 저장되고, 닫히면 null(없음)이 돼요.
+ /// 한 번에 하나의 모달만 보여주기 위해 이 포인터를 사용해요.
+ ///
private static GameObject currentModalInstance;
+
+ ///
+ /// 🛡️ 모달 창이 뜰 때 뒤에 있는 다른 버튼들을 누르지 못하게 막아주는 '투명 방패'예요.
+ /// 이 방패도 모달이 열릴 때 나타났다가, 닫히면 사라져요.
+ ///
private static GameObject currentBlockerInstance;
+
+ ///
+ /// 📜 모달 창이 "네!" 또는 "아니오!" 같은 대답을 받을 때까지 기다리는 '약속 증서'예요.
+ /// UniTaskCompletionSource의 줄임말인 tcs는 'Task Completion Source'의 약자랍니다.
+ /// 모달이 열릴 때 이 약속 증서가 만들어지고, 사용자가 버튼을 누르면 여기에 결과가 적혀요.
+ ///
private static IUniTaskSource activeTcs;
+
+ ///
+ /// 🏷️ 모달이 돌려줄 대답의 종류(타입)를 기억하는 '이름표'예요.
+ /// 예를 들어, '예/아니오' 질문이면 bool 타입(참/거짓)이라는 이름표가 붙어요.
+ ///
private static Type activeResultType;
+ ///
+ /// 🖼️ 모달 뒤에 깔릴 기본 '투명 방패' 디자인 파일이 어디 있는지 알려주는 '주소'예요.
+ /// 특별히 다른 방패를 쓰고 싶다고 말하지 않으면 이 기본 방패를 사용해요.
+ ///
private const string DefaultBlockerPrefabPath = "Prefabs/UI/Modal/ModalBlocker";
+ ///
+ /// ✨ 모달아, 열려라! ✨
+ /// 이 마법 주문을 외치면 화면에 새로운 알림 상자(모달)가 뿅! 하고 나타나요.
+ /// 어떤 내용을 보여줄지, 버튼은 어떻게 할지 미리 정해서 알려줘야 해요.
+ ///
+ /// 예를 들어, "정말 게임을 종료할까요?" 라는 질문과 함께 [예], [아니오] 버튼이 있는 모달을 보여주고 싶다고 해봐요.
+ /// 이럴 때 이 Open 마법을 사용하면 된답니다!
+ ///
+ /// 모달이 닫힐 때 어떤 대답을 했는지 (예: '예' 버튼을 눌렀는지, '아니오' 버튼을 눌렀는지) 알려줄 수도 있어요.
+ /// 그 대답의 종류를 여기에 적어주면 돼요. 예를 들어, bool이라고 적으면 '참' 또는 '거짓'으로 대답을 받을 수 있어요.
+ ///
+ /// 모달이 닫힐 때 돌려받을 대답의 종류예요. 예를 들어, '예'/'아니오' 선택은 bool 타입으로 받을 수 있어요.
+ /// 모달에 보여줄 제목, 메시지, 버튼 모양 등을 정한 '모달 내용물 꾸러미'예요.
+ /// 모달이 뜰 때 뒤에 있는 화면을 살짝 가려주는 '가림막'의 디자인 파일 경로예요. 안 써주면 기본 가림막을 사용해요.
+ /// 모달이 닫힐 때 사용자가 선택한 결과(대답)를 돌려줘요. 예를 들어, '예' 버튼을 누르면 true를 돌려줄 수 있어요.
+ ///
+ ///
+ /// // "정말 게임을 종료할까요?" 모달을 열고, 사용자의 대답(true 또는 false)을 기다리는 예시예요.
+ /// async UniTaskVoid ShowExitConfirmModal()
+ /// {
+ /// // 1. 모달에 어떤 내용을 보여줄지 정해요.
+ /// // "MyConfirmModalPrefab" 부분에는 실제 만들어둔 모달 프리팹 파일의 경로를 적어주세요.
+ /// var myModalContent = new ModalContent("Prefabs/UI/MyConfirmModalPrefab")
+ /// {
+ /// Title = "게임 종료",
+ /// Message = "정말로 게임을 종료하시겠어요? 🥺",
+ /// ConfirmButtonText = "네! 끌래요",
+ /// CancelButtonText = "아니요! 더 할래요"
+ /// };
+ ///
+ /// // 2. Modal.Open 마법으로 모달을 열어요! 사용자가 버튼을 누를 때까지 기다렸다가, 그 결과를 알려줘요.
+ /// // 여기서는 사용자가 '네! 끌래요'를 누르면 true, '아니요! 더 할래요'나 닫기 버튼을 누르면 false를 돌려받기로 약속했어요().
+ /// bool userSaidYes = await Modal.Open(myModalContent);
+ ///
+ /// // 3. 사용자의 대답에 따라 다른 행동을 해요.
+ /// if (userSaidYes)
+ /// {
+ /// Debug.Log("흑흑, 게임을 종료합니다... 다음에 또 만나요! 👋");
+ /// // Application.Quit(); // 진짜로 게임을 끄는 코드
+ /// }
+ /// else
+ /// {
+ /// Debug.Log("야호! 게임을 계속합니다! 🥳");
+ /// }
+ /// }
+ ///
+ ///
public static async UniTask Open(ModalContent content, string blockerPrefabPath = DefaultBlockerPrefabPath)
{
+ // 📜 이야기: 모달을 열기 전에, 이미 다른 모달이 열려있는지 확인해요.
+ // 만약 그렇다면, "앗! 이미 다른 모달이 열려있어요!"라고 알려주고 새 모달은 열지 않아요.
+ // 한 번에 하나의 모달만 보여주는 것이 규칙이거든요!
if (currentModalInstance != null)
{
ULog.Warning("[Modal] 다른 모달이 이미 열려있습니다. 새 모달을 열기 전에 기존 모달을 닫아주세요.");
- return default(T);
+ return default(T); // 기본값(예: bool이면 false, 숫자면 0)을 돌려주고 끝내요.
}
+ // 📜 이야기: 새 모달을 위한 '약속 증서(tcs)'를 만들어요.
+ // 이 증서는 나중에 사용자가 버튼을 누르면 그 결과를 기록할 거예요.
+ // 그리고 이 증서와 결과 타입을 마법사의 비밀 도구함에 잘 보관해요.
var tcs = new UniTaskCompletionSource();
activeTcs = tcs;
activeResultType = typeof(T);
+ currentContent = content; // 현재 content 저장
+ // --- 투명 방패(Blocker) 준비 ---
CanvasGroup blockerCanvasGroup = null;
+ // 📜 이야기: '투명 방패' 디자인 파일을 불러와요. Resources.LoadAsync는 비동기(기다리지 않고 다음 일 하기)로 파일을 불러오는 마법이에요.
GameObject blockerPrefabObj = await Resources.LoadAsync(blockerPrefabPath) as GameObject;
if (blockerPrefabObj != null)
{
+ // 화면에서 가장 큰 그림판(Canvas)을 찾아서 그 위에 방패를 놓을 거예요.
Canvas mainCanvasForBlocker = UnityEngine.Object.FindFirstObjectByType