diff --git a/Assets/GameUIController.cs b/Assets/GameUIController.cs index b602f67..9ce3324 100644 --- a/Assets/GameUIController.cs +++ b/Assets/GameUIController.cs @@ -17,11 +17,17 @@ public class GameUIController : MonoBehaviour [SerializeField] private Image profileImageB; [SerializeField] private Sprite[] profileImageSprites; //0. 기본 드래곤 1. 기본 호랑이 2.아이보리 드래곤 3. 아이보리 호랑이 [SerializeField] private Sprite[] indicatorSprites; //0. active 1. inactive - private Sprite _originalSpriteA; private Sprite _originalSpriteB; + private MultiplayManager _multiplayManager; + + private void Start() + { + _multiplayManager = GameManager.Instance.GetMultiplayManager(); + } + public void OnClickConfirmButton() { GameManager.Instance.OnClickConfirmButton(); @@ -36,12 +42,26 @@ public class GameUIController : MonoBehaviour { GameManager.Instance.panelManager.OpenConfirmPanel("항복 하시겠습니까?", () => { - //TODO: 서버에 항복 전달 및 기타 등등 - - GameManager.Instance.ChangeToMainScene(); + _multiplayManager.RequestSurrender(); }); } + public void OnClickDrawRequestButton() + { + if (GameManager.Instance.GetRequestDrawChance()) + { + GameManager.Instance.panelManager.OpenConfirmPanel("무승부 신청을 하시겠습니까?", () => + { + _multiplayManager.RequestDraw(); + }); + GameManager.Instance.SetRequestDrawChanceFalse(); + } + else + { + GameManager.Instance.panelManager.OpenConfirmPanel("무승부 요청이 제한돼있습니다.",()=>{}); + } + } + public void OnClickSettingsButton() { GameManager.Instance.panelManager.OpenSettingsPanel(); diff --git a/Assets/Resources/Prefabs/Effects/Draw Effect Panel.prefab b/Assets/Resources/Prefabs/Effects/Draw Effect Panel.prefab index c1d50fe..de8681f 100644 --- a/Assets/Resources/Prefabs/Effects/Draw Effect Panel.prefab +++ b/Assets/Resources/Prefabs/Effects/Draw Effect Panel.prefab @@ -527,7 +527,7 @@ GameObject: - component: {fileID: 8635639988778983738} - component: {fileID: 4545556044007292713} - component: {fileID: 6152865991947934791} - - component: {fileID: 3813612584874639807} + - component: {fileID: -2390623514170132953} m_Layer: 5 m_Name: Draw Effect Panel m_TagString: Untagged @@ -576,7 +576,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0, g: 0, b: 0, a: 0.5882353} + m_Color: {r: 0, g: 0, b: 0, a: 0.74509805} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -625,7 +625,7 @@ MonoBehaviour: tigerOpenEyes: {fileID: 1508819185250841244} tigerCloseEyes: {fileID: 399504369641388738} flipDuration: 0.3 ---- !u!61 &3813612584874639807 +--- !u!61 &-2390623514170132953 BoxCollider2D: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} diff --git a/Assets/Resources/Prefabs/Effects/Lose Effect Panel.prefab b/Assets/Resources/Prefabs/Effects/Lose Effect Panel.prefab index d845fd9..23d30fc 100644 --- a/Assets/Resources/Prefabs/Effects/Lose Effect Panel.prefab +++ b/Assets/Resources/Prefabs/Effects/Lose Effect Panel.prefab @@ -450,7 +450,7 @@ GameObject: - component: {fileID: 8635639988778983738} - component: {fileID: 4545556044007292713} - component: {fileID: 3229800624310508893} - - component: {fileID: 6984539173991577744} + - component: {fileID: -8338910938938253639} m_Layer: 5 m_Name: Lose Effect Panel m_TagString: Untagged @@ -500,7 +500,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0, g: 0, b: 0, a: 0.5882353} + m_Color: {r: 0, g: 0, b: 0, a: 0.74509805} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -547,7 +547,7 @@ MonoBehaviour: characterOpenEyes: {fileID: 1632927645355555415} characterCloseEyes: {fileID: 3881260292094838299} depressedEffect: {fileID: 155037671892554820} ---- !u!61 &6984539173991577744 +--- !u!61 &-8338910938938253639 BoxCollider2D: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} diff --git a/Assets/Resources/Prefabs/Effects/Win Effect Panel.prefab b/Assets/Resources/Prefabs/Effects/Win Effect Panel.prefab index a1f88a4..da4c3e8 100644 --- a/Assets/Resources/Prefabs/Effects/Win Effect Panel.prefab +++ b/Assets/Resources/Prefabs/Effects/Win Effect Panel.prefab @@ -788,7 +788,7 @@ GameObject: - component: {fileID: 8635639988778983738} - component: {fileID: 3127148509640414758} - component: {fileID: 4545556044007292713} - - component: {fileID: 7229651074095795597} + - component: {fileID: -8628578634938139601} m_Layer: 5 m_Name: Win Effect Panel m_TagString: Untagged @@ -838,7 +838,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0, g: 0, b: 0, a: 0.5882353} + m_Color: {r: 0, g: 0, b: 0, a: 0.74509805} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -867,7 +867,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 9b132148519758c42824252ec9a2d3a4, type: 3} m_Name: m_EditorClassIdentifier: - bannerObj: {fileID: 0} + bannerObj: {fileID: 7291411618834705046} bannerText: {fileID: 5108301403921453943} interval: 0.1 haloEffectImg: {fileID: 376994097320605198} @@ -891,7 +891,7 @@ CanvasGroup: m_Interactable: 1 m_BlocksRaycasts: 1 m_IgnoreParentGroups: 0 ---- !u!61 &7229651074095795597 +--- !u!61 &-8628578634938139601 BoxCollider2D: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} diff --git a/Assets/Resources/Prefabs/Panels/Draw Confirm Panel.prefab b/Assets/Resources/Prefabs/Panels/Draw Confirm Panel.prefab new file mode 100644 index 0000000..e943069 --- /dev/null +++ b/Assets/Resources/Prefabs/Panels/Draw Confirm Panel.prefab @@ -0,0 +1,852 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1788897315818053684 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7542555801726495289} + - component: {fileID: 2282488759583336750} + - component: {fileID: 773857893073654059} + m_Layer: 5 + m_Name: Messege Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7542555801726495289 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1788897315818053684} + 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: 1049729465715420315} + 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: 38} + m_SizeDelta: {x: 480, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2282488759583336750 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1788897315818053684} + m_CullTransparentMesh: 1 +--- !u!114 &773857893073654059 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1788897315818053684} + 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: messege text + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 85a19688db53c77469fc4406b01045da, type: 2} + m_sharedMaterial: {fileID: -2477908578676791210, guid: 85a19688db53c77469fc4406b01045da, 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: 36 + m_fontSizeBase: 36 + 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_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 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 &2317228258542092256 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 965302526599391686} + - component: {fileID: 8494676347912440962} + - component: {fileID: 1257633341820217709} + - component: {fileID: 1753961836956471979} + m_Layer: 5 + m_Name: Yes Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &965302526599391686 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2317228258542092256} + 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: 1946490149580320571} + m_Father: {fileID: 1049729465715420315} + 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: -100, y: -120} + m_SizeDelta: {x: 140, y: 80} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8494676347912440962 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2317228258542092256} + m_CullTransparentMesh: 1 +--- !u!114 &1257633341820217709 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2317228258542092256} + 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.9607844, b: 0.8980393, 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: 05a670e614d7817429ee256ceb7efbe6, 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 &1753961836956471979 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2317228258542092256} + 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: 2 + 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: 21300000, guid: 1cc2af2fc6476554ca42fb2ddfd7727f, type: 3} + m_PressedSprite: {fileID: 21300000, guid: 1cc2af2fc6476554ca42fb2ddfd7727f, type: 3} + 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: 1257633341820217709} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 4442644643121240978} + m_TargetAssemblyTypeName: DrawConfirmPanelController, Assembly-CSharp + m_MethodName: OnClickConfirmButton + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &3698158704839373389 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9064896642958720613} + - component: {fileID: 2999493526827262555} + - component: {fileID: 7391042004064192362} + 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 &9064896642958720613 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3698158704839373389} + 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: 985363981920635096} + 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: 7.5} + m_SizeDelta: {x: 0, y: -15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2999493526827262555 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3698158704839373389} + m_CullTransparentMesh: 1 +--- !u!114 &7391042004064192362 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3698158704839373389} + 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: "\uC544\uB2C8\uC694" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 85a19688db53c77469fc4406b01045da, type: 2} + m_sharedMaterial: {fileID: -2477908578676791210, guid: 85a19688db53c77469fc4406b01045da, 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: 36 + m_fontSizeBase: 36 + 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_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 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 &4661890517030743811 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1946490149580320571} + - component: {fileID: 3931044922440075362} + - component: {fileID: 555572636850183268} + 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 &1946490149580320571 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4661890517030743811} + 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: 965302526599391686} + 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: 7.4999886} + m_SizeDelta: {x: 0, y: -15.000023} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3931044922440075362 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4661890517030743811} + m_CullTransparentMesh: 1 +--- !u!114 &555572636850183268 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4661890517030743811} + 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: "\uC608" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 85a19688db53c77469fc4406b01045da, type: 2} + m_sharedMaterial: {fileID: -2477908578676791210, guid: 85a19688db53c77469fc4406b01045da, 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: 36 + m_fontSizeBase: 36 + 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_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 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 &8145365568262946399 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5614572128744664879} + - component: {fileID: 3728636385802151783} + - component: {fileID: 3609920769045485995} + - component: {fileID: 949980890983110046} + - component: {fileID: 4442644643121240978} + m_Layer: 5 + m_Name: Draw Confirm Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5614572128744664879 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8145365568262946399} + 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: 1049729465715420315} + 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!222 &3728636385802151783 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8145365568262946399} + m_CullTransparentMesh: 1 +--- !u!114 &3609920769045485995 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8145365568262946399} + 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.74509805} + 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!225 &949980890983110046 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8145365568262946399} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &4442644643121240978 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8145365568262946399} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1ebb6563d04ba2b44b06891880cbe0b6, type: 3} + m_Name: + m_EditorClassIdentifier: + panelRectTransform: {fileID: 1049729465715420315} + messageText: {fileID: 773857893073654059} +--- !u!1 &8611399693750823341 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1049729465715420315} + - component: {fileID: 6012768702964141829} + - component: {fileID: 5029524648726594707} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1049729465715420315 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8611399693750823341} + 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: 7542555801726495289} + - {fileID: 965302526599391686} + - {fileID: 985363981920635096} + m_Father: {fileID: 5614572128744664879} + 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: 600, y: 400} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6012768702964141829 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8611399693750823341} + m_CullTransparentMesh: 1 +--- !u!114 &5029524648726594707 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8611399693750823341} + 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: e89f6694961e7574b98368e14934a8b1, 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 &8664974708086771355 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 985363981920635096} + - component: {fileID: 6738990646649674804} + - component: {fileID: 4523293559331202638} + - component: {fileID: 3091834035832018361} + m_Layer: 5 + m_Name: No Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &985363981920635096 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8664974708086771355} + 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: 9064896642958720613} + m_Father: {fileID: 1049729465715420315} + 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: 100, y: -120} + m_SizeDelta: {x: 140, y: 80} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6738990646649674804 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8664974708086771355} + m_CullTransparentMesh: 1 +--- !u!114 &4523293559331202638 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8664974708086771355} + 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.9607844, b: 0.8980393, 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: 05a670e614d7817429ee256ceb7efbe6, 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 &3091834035832018361 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8664974708086771355} + 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: 2 + 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: 21300000, guid: 1cc2af2fc6476554ca42fb2ddfd7727f, type: 3} + m_PressedSprite: {fileID: 21300000, guid: 1cc2af2fc6476554ca42fb2ddfd7727f, type: 3} + 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: 4523293559331202638} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 4442644643121240978} + m_TargetAssemblyTypeName: DrawConfirmPanelController, Assembly-CSharp + m_MethodName: OnClickCloseButton + 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 diff --git a/Assets/Resources/Prefabs/Panels/Draw Confirm Panel.prefab.meta b/Assets/Resources/Prefabs/Panels/Draw Confirm Panel.prefab.meta new file mode 100644 index 0000000..5ca8bf0 --- /dev/null +++ b/Assets/Resources/Prefabs/Panels/Draw Confirm Panel.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a498b5b3f7af42d4d974507473a6f8a0 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/Panels/Main Panel.prefab b/Assets/Resources/Prefabs/Panels/Main Panel.prefab index ca0fdef..72c53db 100644 --- a/Assets/Resources/Prefabs/Panels/Main Panel.prefab +++ b/Assets/Resources/Prefabs/Panels/Main Panel.prefab @@ -1457,7 +1457,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &405965270916774547 RectTransform: m_ObjectHideFlags: 0 @@ -1713,7 +1713,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: "\uD654\uB791\uB098\uBE44" + m_text: tester m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 85a19688db53c77469fc4406b01045da, type: 2} m_sharedMaterial: {fileID: -2477908578676791210, guid: 85a19688db53c77469fc4406b01045da, type: 2} @@ -1799,7 +1799,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &8172929902404983356 RectTransform: m_ObjectHideFlags: 0 diff --git a/Assets/Resources/Prefabs/Panels/Setting Panel.prefab b/Assets/Resources/Prefabs/Panels/Setting Panel.prefab index 0b9d12b..54538f0 100644 --- a/Assets/Resources/Prefabs/Panels/Setting Panel.prefab +++ b/Assets/Resources/Prefabs/Panels/Setting Panel.prefab @@ -14,7 +14,7 @@ GameObject: - component: {fileID: 6789969287113785900} - component: {fileID: 413977444317235173} m_Layer: 5 - m_Name: Switch + m_Name: BGM Switch m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -762,7 +762,7 @@ GameObject: - component: {fileID: 3464089222698319368} - component: {fileID: 8434701791193156984} m_Layer: 5 - m_Name: Switch + m_Name: SFX Switch m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 diff --git a/Assets/Resources/Prefabs/[Canvas] Game UI.prefab b/Assets/Resources/Prefabs/[Canvas] Game UI.prefab index 1be1e23..294c097 100644 --- a/Assets/Resources/Prefabs/[Canvas] Game UI.prefab +++ b/Assets/Resources/Prefabs/[Canvas] Game UI.prefab @@ -36,7 +36,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 50, y: -85} + m_AnchoredPosition: {x: 50, y: -20} m_SizeDelta: {x: 238, y: 150} m_Pivot: {x: 0, y: 1} --- !u!222 &4747539784995484548 @@ -338,7 +338,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: "\uC7AC\uB300\uACB0" + m_text: "\uBB34\uC2B9\uBD80" m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 85a19688db53c77469fc4406b01045da, type: 2} m_sharedMaterial: {fileID: -2477908578676791210, guid: 85a19688db53c77469fc4406b01045da, type: 2} @@ -789,7 +789,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &3928015243027423495 RectTransform: m_ObjectHideFlags: 0 @@ -807,7 +807,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 50, y: -85} + m_AnchoredPosition: {x: 50, y: -170} m_SizeDelta: {x: 238, y: 150} m_Pivot: {x: 0, y: 1} --- !u!222 &3058652260737614200 @@ -894,7 +894,7 @@ MonoBehaviour: m_Calls: - m_Target: {fileID: 3933575647777291622} m_TargetAssemblyTypeName: GameUIController, Assembly-CSharp - m_MethodName: OnClickRetryButton + m_MethodName: OnClickDrawRequestButton m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} diff --git a/Assets/Resources/Sounds.meta b/Assets/Resources/Sounds.meta new file mode 100644 index 0000000..faa8993 --- /dev/null +++ b/Assets/Resources/Sounds.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9fc9c29bf8c5aa040aaeace773096d1b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Click Sound.mp3 b/Assets/Resources/Sounds/Click Sound.mp3 similarity index 100% rename from Assets/Resources/Click Sound.mp3 rename to Assets/Resources/Sounds/Click Sound.mp3 diff --git a/Assets/Resources/Click Sound.mp3.meta b/Assets/Resources/Sounds/Click Sound.mp3.meta similarity index 100% rename from Assets/Resources/Click Sound.mp3.meta rename to Assets/Resources/Sounds/Click Sound.mp3.meta diff --git a/Assets/Resources/Close Sound.mp3 b/Assets/Resources/Sounds/Close Sound.mp3 similarity index 100% rename from Assets/Resources/Close Sound.mp3 rename to Assets/Resources/Sounds/Close Sound.mp3 diff --git a/Assets/Resources/Close Sound.mp3.meta b/Assets/Resources/Sounds/Close Sound.mp3.meta similarity index 100% rename from Assets/Resources/Close Sound.mp3.meta rename to Assets/Resources/Sounds/Close Sound.mp3.meta diff --git a/Assets/Resources/Coins_ADD_Sound.wav b/Assets/Resources/Sounds/Coins ADD Sound.wav similarity index 100% rename from Assets/Resources/Coins_ADD_Sound.wav rename to Assets/Resources/Sounds/Coins ADD Sound.wav diff --git a/Assets/Resources/Coins_ADD_Sound.wav.meta b/Assets/Resources/Sounds/Coins ADD Sound.wav.meta similarity index 100% rename from Assets/Resources/Coins_ADD_Sound.wav.meta rename to Assets/Resources/Sounds/Coins ADD Sound.wav.meta diff --git a/Assets/Resources/Coins_Empty_Sound.wav b/Assets/Resources/Sounds/Coins Empty Sound.wav similarity index 100% rename from Assets/Resources/Coins_Empty_Sound.wav rename to Assets/Resources/Sounds/Coins Empty Sound.wav diff --git a/Assets/Resources/Coins_Empty_Sound.wav.meta b/Assets/Resources/Sounds/Coins Empty Sound.wav.meta similarity index 100% rename from Assets/Resources/Coins_Empty_Sound.wav.meta rename to Assets/Resources/Sounds/Coins Empty Sound.wav.meta diff --git a/Assets/Resources/Coins_Remove_Sound.wav b/Assets/Resources/Sounds/Coins Remove Sound.wav similarity index 100% rename from Assets/Resources/Coins_Remove_Sound.wav rename to Assets/Resources/Sounds/Coins Remove Sound.wav diff --git a/Assets/Resources/Coins_Remove_Sound.wav.meta b/Assets/Resources/Sounds/Coins Remove Sound.wav.meta similarity index 100% rename from Assets/Resources/Coins_Remove_Sound.wav.meta rename to Assets/Resources/Sounds/Coins Remove Sound.wav.meta diff --git a/Assets/Resources/Game bgm2.mp3 b/Assets/Resources/Sounds/Game bgm2.mp3 similarity index 100% rename from Assets/Resources/Game bgm2.mp3 rename to Assets/Resources/Sounds/Game bgm2.mp3 diff --git a/Assets/Resources/Game bgm2.mp3.meta b/Assets/Resources/Sounds/Game bgm2.mp3.meta similarity index 100% rename from Assets/Resources/Game bgm2.mp3.meta rename to Assets/Resources/Sounds/Game bgm2.mp3.meta diff --git a/Assets/Resources/lose sound.mp3 b/Assets/Resources/Sounds/lose sound.mp3 similarity index 100% rename from Assets/Resources/lose sound.mp3 rename to Assets/Resources/Sounds/lose sound.mp3 diff --git a/Assets/Resources/lose sound.mp3.meta b/Assets/Resources/Sounds/lose sound.mp3.meta similarity index 100% rename from Assets/Resources/lose sound.mp3.meta rename to Assets/Resources/Sounds/lose sound.mp3.meta diff --git a/Assets/Resources/main bgm.mp3 b/Assets/Resources/Sounds/main bgm.mp3 similarity index 100% rename from Assets/Resources/main bgm.mp3 rename to Assets/Resources/Sounds/main bgm.mp3 diff --git a/Assets/Resources/main bgm.mp3.meta b/Assets/Resources/Sounds/main bgm.mp3.meta similarity index 100% rename from Assets/Resources/main bgm.mp3.meta rename to Assets/Resources/Sounds/main bgm.mp3.meta diff --git a/Assets/Resources/stone sound 3.mp3 b/Assets/Resources/Sounds/stone sound 3.mp3 similarity index 100% rename from Assets/Resources/stone sound 3.mp3 rename to Assets/Resources/Sounds/stone sound 3.mp3 diff --git a/Assets/Resources/stone sound 3.mp3.meta b/Assets/Resources/Sounds/stone sound 3.mp3.meta similarity index 100% rename from Assets/Resources/stone sound 3.mp3.meta rename to Assets/Resources/Sounds/stone sound 3.mp3.meta diff --git a/Assets/Resources/win sound.mp3 b/Assets/Resources/Sounds/win sound.mp3 similarity index 100% rename from Assets/Resources/win sound.mp3 rename to Assets/Resources/Sounds/win sound.mp3 diff --git a/Assets/Resources/win sound.mp3.meta b/Assets/Resources/Sounds/win sound.mp3.meta similarity index 100% rename from Assets/Resources/win sound.mp3.meta rename to Assets/Resources/Sounds/win sound.mp3.meta diff --git a/Assets/Script/Common/AudioManager.cs b/Assets/Script/Common/AudioManager.cs index 017cccf..01465c9 100644 --- a/Assets/Script/Common/AudioManager.cs +++ b/Assets/Script/Common/AudioManager.cs @@ -1,21 +1,12 @@ -using UnityEngine; +using System.Collections.Generic; +using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.Timeline; public class AudioManager : Singleton { - [Header("BGM")] - [SerializeField] private AudioClip mainBgm; - [SerializeField] private AudioClip gameBgm; - [Header("SFX")] - [SerializeField] private AudioClip clickSound; - [SerializeField] private AudioClip closeSound; - [SerializeField] private AudioClip coinsAddSound; - [SerializeField] private AudioClip coinsEmptySound; - [SerializeField] private AudioClip coinsRemoveSound; - [SerializeField] private AudioClip winSound; - [SerializeField] private AudioClip loseSound; - [SerializeField] private AudioClip stoneSound; + private AudioClip mainBgm; + private AudioClip gameBgm; [HideInInspector] public AudioSource bgmAudioSource; // BGM을 위한 AudioSource private AudioSource sfxAudioSource; // SFX를 위한 AudioSource @@ -25,13 +16,40 @@ public class AudioManager : Singleton [HideInInspector]public bool isPlayBGM; [HideInInspector]public bool isPlaySFX; - private void Awake() + private Dictionary audioClips = new Dictionary(); + + + protected override void Awake() { base.Awake(); // 부모 클래스의 Awake 호출 // BGM과 SFX를 위한 별도의 AudioSource 생성 bgmAudioSource = gameObject.AddComponent(); sfxAudioSource = gameObject.AddComponent(); + + //Sounds폴더 내의 모든 오디오클립 로드 + AudioClip[] clips = Resources.LoadAll("Sounds"); + + foreach (AudioClip clip in clips) + { + audioClips[clip.name] = clip; + } + + Debug.Log($"총 {audioClips.Count}개의 오디오클립이 로드됨."); + + } + + public AudioClip GetAudioClip(string clipName) + { + if (audioClips.TryGetValue(clipName, out AudioClip clip)) + { + return clip; + } + else + { + Debug.LogError($"패널 '{clipName}'을 찾을 수 없습니다."); + } + return null; } // 시작 시 BGM을 자동으로 재생 @@ -39,12 +57,15 @@ public class AudioManager : Singleton { isPlayBGM = UserManager.IsPlayBGM; isPlaySFX = UserManager.IsPlaySFX; + PlayBGM(); } // 메인 BGM을 재생하는 함수 public void PlayMainBGM() { + mainBgm = GetAudioClip("main bgm"); + if (bgmAudioSource != null && mainBgm != null && !bgmAudioSource.isPlaying) { bgmAudioSource.clip = mainBgm; @@ -56,6 +77,8 @@ public class AudioManager : Singleton public void PlayGameBGM() { + gameBgm = GetAudioClip("Game bgm2"); + if (bgmAudioSource != null && gameBgm != null && !bgmAudioSource.isPlaying) { bgmAudioSource.clip = gameBgm; @@ -101,10 +124,9 @@ public class AudioManager : Singleton // 클릭 사운드(SFX) 재생 public void PlayClickSound() { - if (isPlaySFX && sfxAudioSource != null) { - sfxAudioSource.PlayOneShot(clickSound, sfxVolume); + sfxAudioSource.PlayOneShot(GetAudioClip("Click Sound"), sfxVolume); } } @@ -113,7 +135,7 @@ public class AudioManager : Singleton { if (isPlaySFX && sfxAudioSource != null) { - sfxAudioSource.PlayOneShot(closeSound, sfxVolume); + sfxAudioSource.PlayOneShot(GetAudioClip("Close Sound"), sfxVolume); } } @@ -121,7 +143,7 @@ public class AudioManager : Singleton { if (isPlaySFX && sfxAudioSource!=null) { - sfxAudioSource.PlayOneShot(coinsAddSound, sfxVolume); + sfxAudioSource.PlayOneShot(GetAudioClip("Coins ADD Sound"), sfxVolume); } } @@ -129,7 +151,7 @@ public class AudioManager : Singleton { if (isPlaySFX && sfxAudioSource!=null) { - sfxAudioSource.PlayOneShot(coinsEmptySound, sfxVolume); + sfxAudioSource.PlayOneShot(GetAudioClip("Coins Empty Sound"), sfxVolume); } } @@ -137,7 +159,7 @@ public class AudioManager : Singleton { if (isPlaySFX && sfxAudioSource!=null) { - sfxAudioSource.PlayOneShot(coinsRemoveSound, sfxVolume); + sfxAudioSource.PlayOneShot(GetAudioClip("Coins Remove Sound"), sfxVolume); } } @@ -145,7 +167,7 @@ public class AudioManager : Singleton { if (isPlaySFX && sfxAudioSource!=null) { - sfxAudioSource.PlayOneShot(loseSound, sfxVolume); + sfxAudioSource.PlayOneShot(GetAudioClip("lose sound"), sfxVolume); } } @@ -153,7 +175,7 @@ public class AudioManager : Singleton { if (isPlaySFX && sfxAudioSource!=null) { - sfxAudioSource.PlayOneShot(winSound, sfxVolume); + sfxAudioSource.PlayOneShot(GetAudioClip("win sound"), sfxVolume); } } @@ -161,7 +183,7 @@ public class AudioManager : Singleton { if (isPlaySFX && sfxAudioSource!=null) { - sfxAudioSource.PlayOneShot(stoneSound, sfxVolume); + sfxAudioSource.PlayOneShot(GetAudioClip("stone sound3"), sfxVolume); } } } \ No newline at end of file diff --git a/Assets/Script/Common/CoinsPanelController.cs b/Assets/Script/Common/CoinsPanelController.cs index 7d3c38e..b184828 100644 --- a/Assets/Script/Common/CoinsPanelController.cs +++ b/Assets/Script/Common/CoinsPanelController.cs @@ -53,7 +53,7 @@ public class CoinsPanelController : MonoBehaviour _coinsRect.sizeDelta = new Vector2(100 + textLength * 30f, 100f); } - private void ChangeTextAnimation(bool isAdd, Action action) + private void ChangeTextAnimation(int coinAdd, bool isAdd, Action action) { float duration = 0.2f; float yPos = 40f; @@ -64,8 +64,8 @@ public class CoinsPanelController : MonoBehaviour if (isAdd) { var currentHeartCount = coinsCountText.text; - coinsCountText.text = (int.Parse(currentHeartCount) + 500).ToString(); - // 코인 텍스트 100씩 증가 + coinsCountText.text = (int.Parse(currentHeartCount) + coinAdd).ToString(); + // 코인 텍스트 증가 } else { @@ -98,22 +98,19 @@ public class CoinsPanelController : MonoBehaviour _canvasGroup.blocksRaycasts = false; //코인 중복 추가 방지 코드 Sequence sequence = DOTween.Sequence(); - // i += a 반복 횟수 조절, 100개 단위로 상승 차감 시 100으로 설정 - for (int i = 0; i < coinsCount; i+=500) + sequence.AppendCallback(() => { - sequence.AppendCallback(() => + ChangeTextAnimation(coinsCount,true, ()=> { - ChangeTextAnimation(true, ()=> - { - _coinsCount += 500; - action?.Invoke(); - }); - - // 효과음 재생 - AudioManager.Instance.PlayCoinsAddSound(); + _coinsCount += coinsCount; + action?.Invoke(); }); - sequence.AppendInterval(0.5f); - } + + // 효과음 재생 + AudioManager.Instance.PlayCoinsAddSound(); + }); + sequence.AppendInterval(0.5f); + sequence.OnComplete(() => { _canvasGroup.blocksRaycasts = true; //구매 후 클릭 활성화 @@ -152,7 +149,7 @@ public class CoinsPanelController : MonoBehaviour coinsRemoveImageObject.transform.DOScale(3f, 1f); coinsRemoveImageObject.GetComponent().DOFade(0f, 1f) - .OnComplete( ()=>ChangeTextAnimation(false, ()=> + .OnComplete( ()=>ChangeTextAnimation(0,false, ()=> { //감소된 코인 적용 _coinsCount -= 100; diff --git a/Assets/Script/Common/Constants.cs b/Assets/Script/Common/Constants.cs index 0dda83a..d7e84ab 100644 --- a/Assets/Script/Common/Constants.cs +++ b/Assets/Script/Common/Constants.cs @@ -16,6 +16,15 @@ StartGame, // 생성한 방에 다른 유저가 참여해서 게임 시작 SwitchAI, // 15초 후 매칭 실패 시 AI 플레이로 전환 알림 ExitRoom, // 자신이 방을 빠져 나왔을 때 - EndGame // 상대방이 접속을 끊거나 방을 나갔을 때 + EndGame, // 상대방이 접속을 끊거나 방을 나갔을 때 + DoSurrender, // 상대방이 항복했을 때 + SurrenderConfirmed, // 항복 요청이 성공적으로 전송되었을 때 + ReceiveDrawRequest, + DrawRequestSent, + DrawAccepted, + DrawConfirmed, + DrawRejected, + DrawRejectionConfirmed, + ReceiveTimeout // 상대방이 타임 아웃일 때 }; } \ No newline at end of file diff --git a/Assets/Script/Game/GameLogic.cs b/Assets/Script/Game/GameLogic.cs index 497eb19..d2d0037 100644 --- a/Assets/Script/Game/GameLogic.cs +++ b/Assets/Script/Game/GameLogic.cs @@ -20,7 +20,6 @@ public abstract class BasePlayerState public void ProcessMove(GameLogic gameLogic, Enums.PlayerType playerType, int row, int col) { gameLogic.fioTimer.PauseTimer(); - gameLogic.SetNewBoardValue(playerType, row, col); gameLogic.CountStoneCounter(); @@ -32,6 +31,13 @@ public abstract class BasePlayerState if (gameLogic.CheckGameWin(playerType, row, col)) { var gameResult = playerType == Enums.PlayerType.PlayerA? Enums.GameResult.Win:Enums.GameResult.Lose; + if (gameLogic.gameType == Enums.GameType.MultiPlay) + { + if (gameLogic.firstPlayerState.GetType() != typeof(PlayerState)) + { + gameResult = gameResult == Enums.GameResult.Win ? Enums.GameResult.Lose : Enums.GameResult.Win; + } + } GameManager.Instance.panelManager.OpenEffectPanel(gameResult); gameLogic.EndGame(gameResult); } @@ -171,7 +177,7 @@ public class MultiPlayerState: BasePlayerState gameLogic.UpdateForbiddenMoves(); #endregion - // gameLogic.currentTurn = _playerType; + gameLogic.currentTurn = _playerType; // gameLogic.stoneController.OnStoneClickedDelegate = (row, col) => // { // HandleMove(gameLogic, row, col); @@ -211,7 +217,7 @@ public class MultiPlayerState: BasePlayerState } } -public class GameLogic : MonoBehaviour +public class GameLogic : IDisposable { private Enums.PlayerType[,] _board; public StoneController stoneController; @@ -220,6 +226,12 @@ public class GameLogic : MonoBehaviour //총 착수된 돌 카운터 public int _totalStoneCounter; public int TotalStoneCounter{get{return _totalStoneCounter;}} + //무승부 요청 가능 여부 + private bool _requestDrawChance; + public bool RequestDrawChance{ + get { return _requestDrawChance;} + set { _requestDrawChance = value;} + } public BasePlayerState firstPlayerState; public BasePlayerState secondPlayerState; @@ -235,9 +247,10 @@ public class GameLogic : MonoBehaviour private int _lastRow; private int _lastCol; - private MultiplayManager _multiplayManager; + public MultiplayManager _multiplayManager; private string _roomId; + #region Renju Members // 렌주룰 금수 검사기 private RenjuForbiddenMoveDetector _forbiddenDetector; @@ -253,6 +266,7 @@ public class GameLogic : MonoBehaviour this.stoneController = stoneController; this.gameType = gameType; _totalStoneCounter = 0; + RequestDrawChance = true; selectedRow = -1; selectedCol = -1; @@ -272,17 +286,24 @@ public class GameLogic : MonoBehaviour //timer 시간초과시 진행 함수 this.fioTimer.OnTimeout = () => { - if (currentTurn == Enums.PlayerType.PlayerA) + // 현재 턴의 플레이어가 로컬(유저)인지 확인 + bool isCurrentPlayerLocal = (currentTurn == Enums.PlayerType.PlayerA && firstPlayerState is PlayerState) || + (currentTurn == Enums.PlayerType.PlayerB && secondPlayerState is PlayerState); + + if (isCurrentPlayerLocal) // 내가 타임 오버일 때 { - GameManager.Instance.panelManager.OpenConfirmPanel($"Game Over: {Enums.PlayerType.PlayerB} Win", - () =>{}); + if (this.gameType == Enums.GameType.MultiPlay) // 멀티플레이인 경우 + { + _multiplayManager?.SendTimeout(); + } + GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Lose); EndGame(Enums.GameResult.Lose); } - else if (currentTurn == Enums.PlayerType.PlayerB) + else // 로컬에서 자신의 타이머 기준으로 상대방이 타임 오버일 때 { - GameManager.Instance.panelManager.OpenConfirmPanel($"Game Over: {Enums.PlayerType.PlayerA} Win", - () =>{}); - EndGame(Enums.GameResult.Win); + // TODO: 컨펌 패널 OK 버튼 삭제? + GameManager.Instance.panelManager.OpenConfirmPanel("상대방의 응답을 기다리는 중입니다", + () => { } ); } }; } @@ -341,23 +362,34 @@ public class GameLogic : MonoBehaviour Debug.Log("해당 플레이어가 선공 입니다"); firstPlayerState = new PlayerState(true, _multiplayManager, joinRoomData.roomId); secondPlayerState = new MultiPlayerState(false, _multiplayManager); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, joinRoomData.opponentNickname); + GameManager.Instance.InitProfileImages(UserManager.Instance.imageIndex, joinRoomData.opponentImageIndex); + + // 리플레이 데이터 업데이트 + ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname, joinRoomData.opponentNickname, UserManager.Instance.imageIndex, joinRoomData.opponentImageIndex); + }); } else { Debug.Log("해당 플레이어가 후공 입니다"); firstPlayerState = new MultiPlayerState(true, _multiplayManager); secondPlayerState = new PlayerState(false, _multiplayManager, joinRoomData.roomId); + + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.InitPlayersName(joinRoomData.opponentNickname, UserManager.Instance.Nickname); + GameManager.Instance.InitProfileImages(joinRoomData.opponentImageIndex, UserManager.Instance.imageIndex); + + // 리플레이 데이터 업데이트 + ReplayManager.Instance.InitReplayData(joinRoomData.opponentNickname, UserManager.Instance.Nickname, joinRoomData.opponentImageIndex, UserManager.Instance.imageIndex); + }); } // 메인 스레드에서 실행 - UI 업데이트는 메인 스레드에서 실행 필요 UnityMainThreadDispatcher.Instance().Enqueue(() => { - GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, joinRoomData.opponentNickname); - GameManager.Instance.InitProfileImages(UserManager.Instance.imageIndex, joinRoomData.opponentImageIndex); - - // 리플레이 데이터 업데이트 - ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname, joinRoomData.opponentNickname, UserManager.Instance.imageIndex, joinRoomData.opponentImageIndex); - // 로딩 패널 열려있으면 닫기 GameManager.Instance.panelManager.CloseLoadingPanel(); @@ -386,24 +418,34 @@ public class GameLogic : MonoBehaviour { Debug.Log("해당 플레이어가 선공 입니다"); firstPlayerState = new PlayerState(true, _multiplayManager, _roomId); - secondPlayerState = new MultiPlayerState(false, _multiplayManager); + secondPlayerState = new MultiPlayerState(false, _multiplayManager); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, startGameData.opponentNickname); + GameManager.Instance.InitProfileImages(UserManager.Instance.imageIndex, startGameData.opponentImageIndex); + + // 리플레이 데이터 업데이트 + ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname, startGameData.opponentNickname, UserManager.Instance.imageIndex, startGameData.opponentImageIndex); + }); } else { Debug.Log("해당 플레이어가 후공 입니다"); firstPlayerState = new MultiPlayerState(true, _multiplayManager); secondPlayerState = new PlayerState(false, _multiplayManager, _roomId); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.InitPlayersName(startGameData.opponentNickname, UserManager.Instance.Nickname); + GameManager.Instance.InitProfileImages(startGameData.opponentImageIndex, UserManager.Instance.imageIndex); + + // 리플레이 데이터 업데이트 + ReplayManager.Instance.InitReplayData(startGameData.opponentNickname, UserManager.Instance.Nickname, startGameData.opponentImageIndex, UserManager.Instance.imageIndex); + }); } // 메인 스레드에서 실행 - UI 업데이트는 메인 스레드에서 실행 필요 UnityMainThreadDispatcher.Instance().Enqueue(() => { - GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, startGameData.opponentNickname); - GameManager.Instance.InitProfileImages(UserManager.Instance.imageIndex, startGameData.opponentImageIndex); - - // 리플레이 데이터 업데이트 - ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname, startGameData.opponentNickname, UserManager.Instance.imageIndex, startGameData.opponentImageIndex); - // 로딩 패널 열려있으면 닫기 GameManager.Instance.panelManager.CloseLoadingPanel(); @@ -419,6 +461,70 @@ public class GameLogic : MonoBehaviour Debug.Log("## End Game"); // TODO: End Room 처리 break; + case Constants.MultiplayManagerState.DoSurrender: + Debug.Log("상대방의 항복 요청 들어옴"); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Win); + EndGame(Enums.GameResult.Win); + }); + break; + case Constants.MultiplayManagerState.SurrenderConfirmed: + Debug.Log("항복 요청 전송 완료"); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Lose); + EndGame(Enums.GameResult.Lose); + }); + break; + case Constants.MultiplayManagerState.ReceiveDrawRequest: + Debug.Log("상대방의 무승부 요청 들어옴"); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.panelManager.OpenDrawConfirmPanel("무승부 요청을 승락하시겠습니까?", () => + { + GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Draw); + EndGame(Enums.GameResult.Draw); + _multiplayManager.AcceptDraw(); + }, () => + { + _multiplayManager.RejectDraw(); + }); + }); + break; + case Constants.MultiplayManagerState.DrawRequestSent: + Debug.Log("무승부 요청 전송 완료"); + break; + case Constants.MultiplayManagerState.DrawAccepted: + Debug.Log("무승부 요청이 승락이 들어옴"); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Draw); + EndGame(Enums.GameResult.Draw); + }); + break; + case Constants.MultiplayManagerState.DrawConfirmed: + Debug.Log("무승부 요청 승락 완료"); + break; + case Constants.MultiplayManagerState.DrawRejected: + Debug.Log("무승부 요청이 거부가 들어옴"); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.panelManager.OpenConfirmPanel("무승부 요청을 거부하였습니다.", () => { }); + }); + break; + case Constants.MultiplayManagerState.DrawRejectionConfirmed: + Debug.Log("무승부 요청 거부 완료"); + + break; + case Constants.MultiplayManagerState.ReceiveTimeout: + Debug.Log("상대방이 타임 아웃 됨"); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Win); + EndGame(Enums.GameResult.Win); + }); + break; } ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,"nicknameB"); @@ -441,7 +547,6 @@ public class GameLogic : MonoBehaviour return AI_NAMIES[index]; } - public void SwitchToSinglePlayer() { _multiplayManager?.Dispose(); diff --git a/Assets/Script/Game/GameManager.cs b/Assets/Script/Game/GameManager.cs index 6ebe1f1..b2dca0b 100644 --- a/Assets/Script/Game/GameManager.cs +++ b/Assets/Script/Game/GameManager.cs @@ -19,13 +19,22 @@ public class GameManager : Singleton [NonSerialized] public PanelManager panelManager; [NonSerialized] public AudioManager audioManager; + + private MultiplayManager _multiplayManager; protected override void Awake() { base.Awake(); InitPanels(); } - + + public MultiplayManager GetMultiplayManager() + { + _multiplayManager = _gameLogic._multiplayManager; + if (_multiplayManager == null) Debug.Log("MultiplayManager가 null입니다"); + return _multiplayManager; + } + private void InitPanels() { if (panelManager == null) @@ -81,13 +90,13 @@ public class GameManager : Singleton _camera = GameObject.FindObjectOfType().gameObject; _gameUIController = GameObject.FindObjectOfType(); _gameLogic = new GameLogic(_stoneController, _gameType, fioTimer); - } InitPanels(); } //임시 재시작 재대결 public void RetryGame() { + if (_gameLogic == null) return; _gameLogic.ResetBoard(); _stoneController.InitStones(); _gameLogic.SetState(_gameLogic.firstPlayerState); @@ -110,4 +119,16 @@ public class GameManager : Singleton if (_gameUIController == null) return; _gameUIController.SetTurnIndicator(isFirstPlayer); } + + public bool GetRequestDrawChance() + { + if (_gameLogic == null){ return false;} + return _gameLogic.RequestDrawChance; + } + + public void SetRequestDrawChanceFalse() + { + if (_gameLogic == null) return; + _gameLogic.RequestDrawChance = false; + } } \ No newline at end of file diff --git a/Assets/Script/Game/MultiplayManager.cs b/Assets/Script/Game/MultiplayManager.cs index 4c81e88..ca9846d 100644 --- a/Assets/Script/Game/MultiplayManager.cs +++ b/Assets/Script/Game/MultiplayManager.cs @@ -67,6 +67,8 @@ public class MultiplayManager : IDisposable private event Action _onMultiplayStateChanged; public Action OnOpponentMove; + private string _roomId; + public MultiplayManager(Action onMultiplayStateChanged) { _onMultiplayStateChanged = onMultiplayStateChanged; @@ -86,6 +88,15 @@ public class MultiplayManager : IDisposable _socket.On("exitRoom", ExitRoom); _socket.On("endGame", EndGame); _socket.On("doOpponent", DoOpponent); + _socket.On("doSurrender", DoSurrender); + _socket.On("surrenderConfirmed", SurrenderConfirmed); + _socket.On("receiveTimeout", ReceiveTimeout); + _socket.On("receiveDrawRequest", ReceiveDrawRequest); + _socket.On("drawRequestSent", DrawRequestSent); + _socket.On("drawAccepted", DrawAccepted); + _socket.On("drawConfirmed", DrawConfirmed); + _socket.On("drawRejected", DrawRejected); + _socket.On("drawRejectionConfirmed", DrawRejectionConfirmed); _socket.Connect(); } @@ -109,6 +120,7 @@ public class MultiplayManager : IDisposable private void CreateRoom(SocketIOResponse response) { var data = response.GetValue(); + _roomId = data.roomId; _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.CreateRoom, data.roomId); } @@ -116,8 +128,7 @@ public class MultiplayManager : IDisposable { var data = response.GetValue(); Debug.Log($"룸에 참여: 룸 ID - {data.roomId}, 상대방 등급 - {data.opponentRating}, 상대방 이름 - {data.opponentNickname}, 흑/백 여부 - {data.isBlack}, 상대방 이미지 인덱스 - {data.opponentImageIndex}"); - - // 필요한 데이터 사용 + _roomId = data.roomId; _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.JoinRoom, data); } @@ -180,7 +191,134 @@ public class MultiplayManager : IDisposable public void LeaveRoom(string roomId) { - _socket.Emit("leaveRoom", new { roomId }); + if (string.IsNullOrEmpty(_roomId)) + { + Debug.LogError("LeaveRoom 호출 실패: _roomId가 설정되지 않음"); + return; + } + + _socket.Emit("leaveRoom", new { roomId = _roomId }); + _roomId = null; // 방 나가면 roomId 초기화 + } + + public void RequestSurrender() + { + if (string.IsNullOrEmpty(_roomId)) + { + Debug.LogError("LeaveRoom 호출 실패: _roomId가 설정되지 않음"); + return; + } + _socket.Emit("requestSurrender",new { roomId = _roomId }); + } + + private void DoSurrender(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.DoSurrender, data.message); + } + + private void SurrenderConfirmed(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.SurrenderConfirmed, data.message); + } + + /// + /// 타임 아웃 요청 + /// + public void SendTimeout() + { + if (string.IsNullOrEmpty(_roomId)) + { + Debug.LogError("LeaveRoom 호출 실패: _roomId가 설정되지 않음"); + return; + } + _socket.Emit("sendTimeout",new { roomId = _roomId }); + } + + /// + /// 타임 아웃 수신 + /// + /// + private void ReceiveTimeout(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.ReceiveTimeout, data.message); + } + + public void RequestDraw() + { + if (string.IsNullOrEmpty(_roomId)) + { + Debug.LogError("requestDraw 호출 실패: _roomId가 설정되지 않음"); + return; + } + _socket.Emit("requestDraw",new { roomId = _roomId }); + } + + private void ReceiveDrawRequest(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.ReceiveDrawRequest, data.message); + } + + private void DrawRequestSent(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.DrawRequestSent, data.message); + } + + public void AcceptDraw() + { + if (string.IsNullOrEmpty(_roomId)) + { + Debug.LogError("acceptDraw 호출 실패: _roomId가 설정되지 않음"); + return; + } + _socket.Emit("acceptDraw", new { roomId = _roomId }); + } + + private void DrawAccepted(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.DrawAccepted, data.message); + } + + private void DrawConfirmed(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.DrawConfirmed, data.message); + } + + public void RejectDraw() + { + if (string.IsNullOrEmpty(_roomId)) + { + Debug.LogError("rejectDraw 호출 실패: _roomId가 설정되지 않음"); + return; + } + _socket.Emit("rejectDraw", new { roomId = _roomId }); + } + + private void DrawRejected(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.DrawRejected, data.message); + } + + private void DrawRejectionConfirmed(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.DrawRejectionConfirmed, data.message); } public void Dispose() diff --git a/Assets/Script/Main/NetworkManager.cs b/Assets/Script/Main/NetworkManager.cs index aca1bf4..b49ffd9 100644 --- a/Assets/Script/Main/NetworkManager.cs +++ b/Assets/Script/Main/NetworkManager.cs @@ -227,8 +227,13 @@ public class NetworkManager : Singleton } } } - - public IEnumerator GetLeaderboard(Action success, Action failure) + + public void GetLeaderboard(Action> success, Action failure) + { + StartCoroutine(GetLeaderboardCoroutine(success, failure)); + } + + public IEnumerator GetLeaderboardCoroutine(Action> success, Action failure) { using (UnityWebRequest www = new UnityWebRequest(Constants.ServerURL + "/leaderboard", UnityWebRequest.kHttpVerbGET)) @@ -256,10 +261,15 @@ public class NetworkManager : Singleton } else { - var result = www.downloadHandler.text; - var scores = JsonUtility.FromJson(result); - - success?.Invoke(scores); + // 성공적으로 데이터를 받아온 경우 + string jsonResponse = www.downloadHandler.text; // 응답으로 받은 JSON 데이터 + + // JSON을 ScoreInfo 리스트로 파싱 + ScoreListWrapper wrapper = JsonUtility.FromJson(jsonResponse); + List leaderboardItems = wrapper.leaderboardDatas; + + // Show 메서드를 통해 데이터를 표시 + success?.Invoke(leaderboardItems); } } } @@ -511,36 +521,4 @@ public class NetworkManager : Singleton } } } - - public void GetLeaderboardData(Action> success, Action failure) - { - StartCoroutine(GetLeaderboardDataCoroutine(success, failure)); - } - - private IEnumerator GetLeaderboardDataCoroutine(Action> success, Action failure) - { - string url = Constants.ServerURL + "/leaderboard/"; // 서버의 리더보드 데이터 URL - - UnityWebRequest www = UnityWebRequest.Get(url); // GET 요청으로 데이터 받기 - yield return www.SendWebRequest(); // 요청 전송 대기 - - // 요청이 실패했을 때 - if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError) - { - Debug.LogError("Error: " + www.error); - failure?.Invoke(); - } - else - { - // 성공적으로 데이터를 받아온 경우 - string jsonResponse = www.downloadHandler.text; // 응답으로 받은 JSON 데이터 - - // JSON을 ScoreInfo 리스트로 파싱 - ScoreListWrapper wrapper = JsonUtility.FromJson(jsonResponse); - List leaderboardItems = wrapper.leaderboardDatas; - - // Show 메서드를 통해 데이터를 표시 - success?.Invoke(leaderboardItems); - } - } } \ No newline at end of file diff --git a/Assets/Script/UI/Effect/WinEffectController.cs b/Assets/Script/UI/Effect/WinEffectController.cs index 76c09a5..1948fc9 100644 --- a/Assets/Script/UI/Effect/WinEffectController.cs +++ b/Assets/Script/UI/Effect/WinEffectController.cs @@ -27,6 +27,16 @@ public class WinEffectController : EffectController Invoke(nameof(PopupObject), 0.3f); } + protected override void ShowPanel() + { + CanvasGroup canvasGroup = gameObject.GetComponent() ?? gameObject.AddComponent(); + + canvasGroup.alpha = 0f; + canvasGroup.DOFade(1f, 1f); + bannerObj.transform.DOScale(Vector3.zero, 0f); + bannerObj.transform.DOScale(Vector3.one, 1f); + } + private void RotateHaloObject() { // 무한 회전 효과 diff --git a/Assets/Script/UI/PanelChildController/SwitchController.cs b/Assets/Script/UI/PanelChildController/SwitchController.cs index 8df8317..d95f4e5 100644 --- a/Assets/Script/UI/PanelChildController/SwitchController.cs +++ b/Assets/Script/UI/PanelChildController/SwitchController.cs @@ -19,7 +19,6 @@ public class SwitchController : MonoBehaviour private RectTransform _handleRectTransform; private Image _backgroundImage; - private AudioSource _audioSource; private bool _isOn; @@ -27,7 +26,6 @@ public class SwitchController : MonoBehaviour { _handleRectTransform = handleImage.GetComponent(); _backgroundImage = GetComponent(); - _audioSource = GetComponent(); } private void Start() @@ -35,7 +33,15 @@ public class SwitchController : MonoBehaviour //초기 상태는 false _handleRectTransform.anchoredPosition = new Vector2(-14, 0); _backgroundImage.color = OffColor; - _isOn = false; + + if (gameObject.name == "SFX Switch") + { + _isOn = UserManager.IsPlaySFX; + } + else if (gameObject.name == "BGM Switch") + { + _isOn = UserManager.IsPlayBGM; + } } //스위치 상태 변경 함수 diff --git a/Assets/Script/UI/PanelController/DrawConfirmPanelController.cs b/Assets/Script/UI/PanelController/DrawConfirmPanelController.cs new file mode 100644 index 0000000..4ff1379 --- /dev/null +++ b/Assets/Script/UI/PanelController/DrawConfirmPanelController.cs @@ -0,0 +1,39 @@ +using System.Collections; +using System.Collections.Generic; +using TMPro; +using UnityEngine; + +public class DrawConfirmPanelController : PanelController +{ + [SerializeField] private TMP_Text messageText; //자식 텍스트 변수 + + public delegate void OnConfirmButtonClick(); + private OnConfirmButtonClick onConfirmButtonClick; + + public delegate void OnContradictButtonClick(); + private OnContradictButtonClick onContradictButtonClick; + + public void Show(string message, OnConfirmButtonClick onConfirmButtonClick, OnContradictButtonClick onContradictButtonClick) + { + messageText.text = message; + this.onConfirmButtonClick = onConfirmButtonClick; + this.onContradictButtonClick = onContradictButtonClick; + base.Show(); + } + + /// + /// Confirm 버튼 클릭시 호출되는 함수 + /// + public void OnClickConfirmButton() + { + Hide(() => onConfirmButtonClick?.Invoke()); + } + + /// + /// X 버튼 클릭시 호출되는 함수 + /// + public void OnClickCloseButton() + { + Hide(() => onContradictButtonClick?.Invoke()); + } +} \ No newline at end of file diff --git a/Assets/Script/UI/PanelController/DrawConfirmPanelController.cs.meta b/Assets/Script/UI/PanelController/DrawConfirmPanelController.cs.meta new file mode 100644 index 0000000..66429a1 --- /dev/null +++ b/Assets/Script/UI/PanelController/DrawConfirmPanelController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1ebb6563d04ba2b44b06891880cbe0b6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Script/UI/PanelController/LeaderBoardController.cs b/Assets/Script/UI/PanelController/LeaderBoardController.cs index 6143beb..dd2de8f 100644 --- a/Assets/Script/UI/PanelController/LeaderBoardController.cs +++ b/Assets/Script/UI/PanelController/LeaderBoardController.cs @@ -27,7 +27,7 @@ public class LeaderBoardController : MonoBehaviour if (isLeaderboardLoaded) return; // 이미 리더보드가 로드되었으면 중복 호출 방지 leaderboardPanel.SetActive(true); - NetworkManager.Instance.GetLeaderboardData((leaderboardItems) => + NetworkManager.Instance.GetLeaderboard((leaderboardItems) => { Show(leaderboardItems); }, () => { }); diff --git a/Assets/Script/UI/PanelController/PanelManager.cs b/Assets/Script/UI/PanelController/PanelManager.cs index cbfc844..c8592d9 100644 --- a/Assets/Script/UI/PanelController/PanelManager.cs +++ b/Assets/Script/UI/PanelController/PanelManager.cs @@ -187,6 +187,18 @@ public class PanelManager : MonoBehaviour } } + public void OpenDrawConfirmPanel(string message, + DrawConfirmPanelController.OnConfirmButtonClick onConfirmButtonClick, + DrawConfirmPanelController.OnContradictButtonClick onContradictButtonClick) + { + if (_canvas != null) + { + var drawConfirmPanelObject = GetPanel("Draw Confirm Panel"); + drawConfirmPanelObject.GetComponent() + .Show(message, onConfirmButtonClick, onContradictButtonClick); + } + } + public void OpenSettingsPanel() { if (_canvas != null) @@ -262,7 +274,7 @@ public class PanelManager : MonoBehaviour shopItems.Add(shopItem); } } - GameManager.Instance.panelManager.OpenShopPanel(shopItems); + OpenShopPanel(shopItems); } //승급 패널 생성