diff --git a/Assets/GameUIController.cs b/Assets/GameUIController.cs index 9ce3324..e7ddc3b 100644 --- a/Assets/GameUIController.cs +++ b/Assets/GameUIController.cs @@ -62,6 +62,14 @@ public class GameUIController : MonoBehaviour } } + public void OnClickRevengeRequestButton() + { + GameManager.Instance.panelManager.OpenConfirmPanel("재대결 신청을 하시겠습니까?", () => + { + _multiplayManager.RequestRevengeRequest(); + }); + } + public void OnClickSettingsButton() { GameManager.Instance.panelManager.OpenSettingsPanel(); @@ -111,11 +119,11 @@ public class GameUIController : MonoBehaviour { profileImage.sprite = profileImageSprites[3]; } - + profileImage.transform.DOScale(1.5f, 0.3f).SetEase(Ease.InBack).OnComplete(() => { profileImage.transform.DOScale(1f, 0.3f).SetEase(Ease.OutBack); }); } - + } diff --git a/Assets/Resources/Prefabs/Panels/Loading Panel.prefab b/Assets/Resources/Prefabs/Panels/Loading Panel.prefab index b3e660e..9907680 100644 --- a/Assets/Resources/Prefabs/Panels/Loading Panel.prefab +++ b/Assets/Resources/Prefabs/Panels/Loading Panel.prefab @@ -1,5 +1,80 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &634998020045031155 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7672225859872789597} + - component: {fileID: 4740804549096936842} + - component: {fileID: 4136038457757579293} + m_Layer: 5 + m_Name: Image Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &7672225859872789597 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 634998020045031155} + 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: 4501886400186872935} + 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: 1080, y: 1920} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4740804549096936842 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 634998020045031155} + m_CullTransparentMesh: 1 +--- !u!114 &4136038457757579293 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 634998020045031155} + 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: a99fa85777f9a5b4d86b859277707544, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &1888922292368658029 GameObject: m_ObjectHideFlags: 0 @@ -152,7 +227,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &4501886400186872935 RectTransform: m_ObjectHideFlags: 0 @@ -165,6 +240,8 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: + - {fileID: 7672225859872789597} + - {fileID: 5931655356592755266} - {fileID: 7400499721686926711} - {fileID: 3975591051107611802} - {fileID: 5598745296817777379} @@ -197,14 +274,14 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Color: {r: 1, g: 1, b: 1, a: 0} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: a99fa85777f9a5b4d86b859277707544, type: 3} + m_Sprite: {fileID: 0} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -245,6 +322,81 @@ MonoBehaviour: interval: 0.5 flipDuration: 0.3 delayBetweenFlips: 1 +--- !u!1 &3738728334186617240 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5931655356592755266} + - component: {fileID: 4398238821743250823} + - component: {fileID: 1591676098588350328} + m_Layer: 5 + m_Name: Simple Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5931655356592755266 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3738728334186617240} + 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: 4501886400186872935} + 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: 1080, y: 1920} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4398238821743250823 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3738728334186617240} + m_CullTransparentMesh: 1 +--- !u!114 &1591676098588350328 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3738728334186617240} + 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.5882353} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &4677795762614618252 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Resources/Prefabs/Panels/Main Panel.prefab b/Assets/Resources/Prefabs/Panels/Main Panel.prefab index 72c53db..062589c 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: 1 + m_IsActive: 0 --- !u!224 &405965270916774547 RectTransform: m_ObjectHideFlags: 0 @@ -1713,7 +1713,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: tester + m_text: "\uBC15\uD638\uB7AD" 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: 0 + m_IsActive: 1 --- !u!224 &8172929902404983356 RectTransform: m_ObjectHideFlags: 0 diff --git a/Assets/Resources/Prefabs/[Canvas] Game UI.prefab b/Assets/Resources/Prefabs/[Canvas] Game UI.prefab index 294c097..312f796 100644 --- a/Assets/Resources/Prefabs/[Canvas] Game UI.prefab +++ b/Assets/Resources/Prefabs/[Canvas] Game UI.prefab @@ -443,7 +443,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -50, y: -85} + m_AnchoredPosition: {x: -50, y: -20} m_SizeDelta: {x: 238, y: 150} m_Pivot: {x: 1, y: 1} --- !u!222 &2837002930647588383 @@ -573,6 +573,7 @@ RectTransform: - {fileID: 4020956126151567600} - {fileID: 3928015243027423495} - {fileID: 3685916492953640732} + - {fileID: 2209730002497357653} - {fileID: 5290633878409985} m_Father: {fileID: 2843270827267453358} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -980,6 +981,140 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 +--- !u!1 &3263750824585473305 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3175828719531940865} + - component: {fileID: 1400882773468757735} + - component: {fileID: 7944951171029972067} + 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 &3175828719531940865 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3263750824585473305} + 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: 2209730002497357653} + 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: 9.0771} + m_SizeDelta: {x: 0, y: -18.1542} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1400882773468757735 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3263750824585473305} + m_CullTransparentMesh: 1 +--- !u!114 &7944951171029972067 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3263750824585473305} + 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: "\uC7AC\uB300\uACB0" + 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: 4284115536 + m_fontColor: {r: 0.3137255, g: 0.4156863, b: 0.3529412, 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: 45 + m_fontSizeBase: 45 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 0 + m_fontSizeMax: 0 + m_fontStyle: 1 + 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: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + 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 &3273831091645394289 GameObject: m_ObjectHideFlags: 0 @@ -1820,6 +1955,139 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 250, y: 300} m_Pivot: {x: 0, y: 0.5} +--- !u!1 &5063415558040939697 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2209730002497357653} + - component: {fileID: 2929683793708511395} + - component: {fileID: 3322322569906840127} + - component: {fileID: 743677256700942471} + m_Layer: 5 + m_Name: Revenge Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2209730002497357653 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5063415558040939697} + 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: 3175828719531940865} + m_Father: {fileID: 4044003808430543235} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -50, y: -170} + m_SizeDelta: {x: 238, y: 150} + m_Pivot: {x: 1, y: 1} +--- !u!222 &2929683793708511395 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5063415558040939697} + m_CullTransparentMesh: 1 +--- !u!114 &3322322569906840127 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5063415558040939697} + 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 &743677256700942471 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5063415558040939697} + 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: 3322322569906840127} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 3933575647777291622} + m_TargetAssemblyTypeName: GameUIController, Assembly-CSharp + m_MethodName: OnClickRevengeRequestButton + 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 &5258332010899716781 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Script/Game/GameLogic.cs b/Assets/Script/Game/GameLogic.cs index cc21d96..ef919c5 100644 --- a/Assets/Script/Game/GameLogic.cs +++ b/Assets/Script/Game/GameLogic.cs @@ -247,8 +247,11 @@ public class GameLogic : IDisposable private int _lastRow; private int _lastCol; + // 멀티 플레이 관련 public MultiplayManager _multiplayManager; private string _roomId; + private string opponentNickname; + private int opponentImageIndex; #region Renju Members @@ -331,6 +334,7 @@ public class GameLogic : IDisposable // break; case Enums.GameType.MultiPlay: // 메인 스레드에서 실행 - UI 업데이트는 메인 스레드에서 실행 필요 + bool isFirstPlayer; UnityMainThreadDispatcher.Instance().Enqueue(() => { GameManager.Instance.panelManager.OpenLoadingPanel(true, true); @@ -355,13 +359,15 @@ public class GameLogic : IDisposable } // 선공, 후공 처리 - bool isFirstPlayer = joinRoomData.isBlack; + isFirstPlayer = joinRoomData.isBlack; + opponentNickname = joinRoomData.opponentNickname; + opponentImageIndex = joinRoomData.opponentImageIndex; if (isFirstPlayer) { Debug.Log("해당 플레이어가 선공 입니다"); firstPlayerState = new PlayerState(true, _multiplayManager, joinRoomData.roomId); - secondPlayerState = new MultiPlayerState(false, _multiplayManager); + secondPlayerState = new MultiPlayerState(false, _multiplayManager); UnityMainThreadDispatcher.Instance().Enqueue(() => { GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, joinRoomData.opponentNickname); @@ -413,7 +419,8 @@ public class GameLogic : IDisposable } // 선공, 후공 처리 isFirstPlayer = startGameData.isBlack; - + opponentNickname = startGameData.opponentNickname; + opponentImageIndex = startGameData.opponentImageIndex; if (isFirstPlayer) { Debug.Log("해당 플레이어가 선공 입니다"); @@ -481,7 +488,7 @@ public class GameLogic : IDisposable Debug.Log("상대방의 무승부 요청 들어옴"); UnityMainThreadDispatcher.Instance().Enqueue(() => { - GameManager.Instance.panelManager.OpenDrawConfirmPanel("무승부 요청을 승락하시겠습니까?", () => + GameManager.Instance.panelManager.OpenDrawConfirmPanel("무승부 요청을 승낙하시겠습니까?", () => { GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Draw); EndGame(Enums.GameResult.Draw); @@ -528,23 +535,69 @@ public class GameLogic : IDisposable case Constants.MultiplayManagerState.RevengeRequestSent: Debug.Log("재대결 요청: 전송 완료"); break; - case Constants.MultiplayManagerState.RevengeAccepted: - Debug.Log("재대결 요청: 승낙이 들어옴"); - InitBoardForRevenge(); + case Constants.MultiplayManagerState.ReceiveRevengeRequest: + Debug.Log("상대방의 재대결 요청이 들어옴"); UnityMainThreadDispatcher.Instance().Enqueue(() => { - + GameManager.Instance.panelManager.OpenDrawConfirmPanel("재대결 요청을 승낙하시겠습니까?", () => + { + _multiplayManager.AcceptRevenge(); + }, () => + { + _multiplayManager.RejectRevenge(); + }); + }); + break; + case Constants.MultiplayManagerState.RevengeAccepted: + Debug.Log("재대결 요청: 승낙이 들어옴"); + var revengeAcceptedData = data as RevengeData; + + // TODO: 응답값 없을 때 서버에서 다시 받아오기 or AI 플레이로 넘기는 처리 필요 + if (revengeAcceptedData == null) + { + Debug.Log("RevengeAccepted 응답값이 null 입니다"); + return; + } + + // 선공, 후공 처리 + isFirstPlayer = revengeAcceptedData.isBlack; + + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + // TODO: 응답 들어오기 전까지 로딩 + GameManager.Instance.panelManager.OpenConfirmPanel("상대방이 재대결 요청을 승낙하였습니다.\n게임이 다시 시작됩니다.", () => + { + InitBoardForRevenge(isFirstPlayer); + }); }); break; case Constants.MultiplayManagerState.RevengeConfirmed: Debug.Log("재대결 요청: 승낙 완료"); - InitBoardForRevenge(); + var revengConfirmedData = data as RevengeData; + + // TODO: 응답값 없을 때 서버에서 다시 받아오기 or AI 플레이로 넘기는 처리 필요 + if (revengConfirmedData == null) + { + Debug.Log("RevengeConfirmed 응답값이 null 입니다"); + return; + } + + // 선공, 후공 처리 + isFirstPlayer = revengConfirmedData.isBlack; + + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.panelManager.OpenConfirmPanel("재대결 요청을 승낙하였습니다.\n게임이 다시 시작됩니다.", () => + { + InitBoardForRevenge(isFirstPlayer); + }); + }); break; case Constants.MultiplayManagerState.RevengeRejected: Debug.Log("재대결 요청: 거부가 들어옴"); UnityMainThreadDispatcher.Instance().Enqueue(() => { - GameManager.Instance.panelManager.OpenConfirmPanel("재대결 요청을 거부하였습니다.", () => { }); + GameManager.Instance.panelManager.OpenConfirmPanel("상대방이 재대결 요청을 거부하였습니다.", () => { }); }); break; case Constants.MultiplayManagerState.RevengeRejectionConfirmed: @@ -566,12 +619,13 @@ public class GameLogic : IDisposable } } - private void InitBoardForRevenge() + private void InitBoardForRevenge(bool isFirstPlayer) { //보드 초기화 _board = new Enums.PlayerType[15, 15]; _totalStoneCounter = 0; - RequestDrawChance = true; + stoneController.InitStones(); + RequestDrawChance = false; selectedRow = -1; selectedCol = -1; @@ -584,6 +638,32 @@ public class GameLogic : IDisposable //timer 초기화 fioTimer.InitTimer(); + + Debug.Log("&&&&UserManager.Instance.imageIndex" + UserManager.Instance.imageIndex + "opponentImageIndex?: " + opponentImageIndex); + if (isFirstPlayer) + { + Debug.Log("해당 플레이어가 선공 입니다"); + firstPlayerState = new PlayerState(true, _multiplayManager, _roomId); + secondPlayerState = new MultiPlayerState(false, _multiplayManager); + GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, opponentNickname); + GameManager.Instance.InitProfileImages(UserManager.Instance.imageIndex, opponentImageIndex); + + // 리플레이 데이터 업데이트 + ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname, opponentNickname, UserManager.Instance.imageIndex, opponentImageIndex); + } + else + { + Debug.Log("해당 플레이어가 후공 입니다"); + firstPlayerState = new MultiPlayerState(true, _multiplayManager); + secondPlayerState = new PlayerState(false, _multiplayManager, _roomId); + GameManager.Instance.InitPlayersName(opponentNickname, UserManager.Instance.Nickname); + GameManager.Instance.InitProfileImages(opponentImageIndex, UserManager.Instance.imageIndex); + + // 리플레이 데이터 업데이트 + ReplayManager.Instance.InitReplayData(opponentNickname, UserManager.Instance.Nickname, opponentImageIndex, UserManager.Instance.imageIndex); + } + // 첫 번째 플레이어(유저)부터 시작 + SetState(firstPlayerState); } //AI닉네임 랜덤 생성 diff --git a/Assets/Script/Game/GameManager.cs b/Assets/Script/Game/GameManager.cs index b2dca0b..3890a27 100644 --- a/Assets/Script/Game/GameManager.cs +++ b/Assets/Script/Game/GameManager.cs @@ -122,7 +122,7 @@ public class GameManager : Singleton public bool GetRequestDrawChance() { - if (_gameLogic == null){ return false;} + if (_gameLogic == null) return false; return _gameLogic.RequestDrawChance; } diff --git a/Assets/Script/Game/MultiplayManager.cs b/Assets/Script/Game/MultiplayManager.cs index d82358f..07ffb5a 100644 --- a/Assets/Script/Game/MultiplayManager.cs +++ b/Assets/Script/Game/MultiplayManager.cs @@ -61,6 +61,14 @@ public class MessageData public string message { get; set; } } +public class RevengeData +{ + [JsonProperty("message")] + public string message { get; set; } + [JsonProperty("isBlack")] + public Boolean isBlack { get; set; } +} + public class MultiplayManager : IDisposable { private SocketIOUnity _socket; @@ -100,7 +108,7 @@ public class MultiplayManager : IDisposable _socket.On("drawRejectionConfirmed", DrawRejectionConfirmed); // 재대결 관련 _socket.On("receiveRevengeRequest", ReceiveRevengeRequest); - _socket.On("revengeRequestSent", DrawRequestSent); + _socket.On("revengeRequestSent", RevengeRequestSent); _socket.On("revengeAccepted", RevengeAccepted); _socket.On("revengeConfirmed", RevengeConfirmed); _socket.On("revengeRejected", RevengeRejected); @@ -337,6 +345,7 @@ public class MultiplayManager : IDisposable public void RequestRevengeRequest() { + Debug.Log("RequestRevengeRequest: " + _roomId); if (string.IsNullOrEmpty(_roomId)) { Debug.LogError("requestDraw 호출 실패: _roomId가 설정되지 않음"); @@ -371,16 +380,16 @@ public class MultiplayManager : IDisposable private void RevengeAccepted(SocketIOResponse response) { - var data = response.GetValue(); + var data = response.GetValue(); - _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.RevengeAccepted, data.message); + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.RevengeAccepted, data); } private void RevengeConfirmed(SocketIOResponse response) { - var data = response.GetValue(); - - _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.RevengeConfirmed, data.message); + var data = response.GetValue(); + Debug.Log("data??: " + data.isBlack + data.message); + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.RevengeConfirmed, data); } public void RejectRevenge()