From a50cd8d5346ce91dae275585f54e3a130619eb14 Mon Sep 17 00:00:00 2001 From: Jay <96156114+jaydev00a@users.noreply.github.com> Date: Fri, 28 Mar 2025 10:23:16 +0900 Subject: [PATCH 1/2] =?UTF-8?q?DO-77=20[Feat]=20=EB=A8=B8=EC=A7=80=20?= =?UTF-8?q?=ED=9B=84=20GameLogic.cs=20=EC=9E=AC=EB=8C=80=EA=B2=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Script/Game/GameLogic.cs | 134 +++++++++++++++++++++++++++++--- 1 file changed, 124 insertions(+), 10 deletions(-) diff --git a/Assets/Script/Game/GameLogic.cs b/Assets/Script/Game/GameLogic.cs index e4b1dbf..ed917ab 100644 --- a/Assets/Script/Game/GameLogic.cs +++ b/Assets/Script/Game/GameLogic.cs @@ -14,6 +14,9 @@ public partial class GameLogic : IDisposable private RenjuForbiddenMoveDetector _forbiddenDetector; // 렌주룰 금수 검사기 private List _forbiddenMoves = new (); // 현재 금수 위치 목록 private string _roomId; + private string _opponentNickname; + private int _opponentImageIndex; + private bool isFirstPlayer; #endregion @@ -73,7 +76,6 @@ public partial class GameLogic : IDisposable MultiPlayManager = new MultiplayManager((state, data) => { Debug.Log($"## {state}"); - switch (state) { case Constants.MultiplayManagerState.CreateRoom: @@ -83,12 +85,12 @@ public partial class GameLogic : IDisposable case Constants.MultiplayManagerState.JoinRoom: Debug.Log("## Join Room"); var joinRoomData = data as JoinRoomData; - + _roomId = joinRoomData.roomId; // TODO: 응답값 없을 때 서버에서 다시 받아오기 or AI 플레이로 넘기는 처리 필요 if (!ValidateRoomData(joinRoomData, "Join Room")) return; // 플레이어 셋업 - SetupPlayer(joinRoomData.isBlack, joinRoomData.roomId, joinRoomData.opponentNickname, joinRoomData.opponentImageIndex); + SetupPlayer(joinRoomData.isBlack, _roomId, joinRoomData.opponentNickname, joinRoomData.opponentImageIndex); // 메인 스레드에서 실행 - UI 업데이트는 메인 스레드에서 실행 필요 StartGameOnMainThread(); @@ -138,7 +140,7 @@ public partial class GameLogic : IDisposable Debug.Log("상대방의 무승부 요청 들어옴"); ExecuteOnMainThread(() => { - GameManager.Instance.panelManager.OpenDrawConfirmPanel("무승부 요청을 승락하시겠습니까?", () => + GameManager.Instance.panelManager.OpenDrawConfirmPanel("무승부 요청을 승낙하시겠습니까?", () => { GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Draw); EndGame(Enums.GameResult.Draw); @@ -153,7 +155,7 @@ public partial class GameLogic : IDisposable Debug.Log("무승부 요청 전송 완료"); break; case Constants.MultiplayManagerState.DrawAccepted: - Debug.Log("무승부 요청이 승락이 들어옴"); + Debug.Log("무승부 요청이 승낙이 들어옴"); ExecuteOnMainThread(() => { GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Draw); @@ -161,7 +163,7 @@ public partial class GameLogic : IDisposable }); break; case Constants.MultiplayManagerState.DrawConfirmed: - Debug.Log("무승부 요청 승락 완료"); + Debug.Log("무승부 요청 승낙 완료"); break; case Constants.MultiplayManagerState.DrawRejected: Debug.Log("무승부 요청이 거부가 들어옴"); @@ -182,7 +184,87 @@ public partial class GameLogic : IDisposable EndGame(Enums.GameResult.Win); }); break; - } + case Constants.MultiplayManagerState.RevengeRequestSent: + Debug.Log("재대결 요청: 전송 완료"); + break; + case Constants.MultiplayManagerState.ReceiveRevengeRequest: + Debug.Log("상대방의 재대결 요청이 들어옴"); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.panelManager.OpenDrawConfirmPanel("상대방의 재대결 요청을\n승낙하시겠습니까?", () => + { + 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(() => + { + GameManager.Instance.panelManager.OpenConfirmPanel("상대방이\n재대결을 승낙하였습니다.\n게임이 다시 시작됩니다.", () => + { + InitBoardForRevenge(isFirstPlayer); + }); + }); + break; + case Constants.MultiplayManagerState.RevengeConfirmed: + Debug.Log("재대결 요청: 승낙 완료"); + 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승낙하였습니다.\n게임이 다시 시작됩니다.", () => + { + InitBoardForRevenge(isFirstPlayer); + }); + }); + break; + case Constants.MultiplayManagerState.RevengeRejected: + Debug.Log("재대결 요청: 거부가 들어옴"); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.panelManager.OpenConfirmPanel("상대방이\n재대결 요청을\n거부하였습니다.", () => + { + GameManager.Instance.panelManager.CloseLoadingPanel(); + }); + }); + break; + case Constants.MultiplayManagerState.RevengeRejectionConfirmed: + Debug.Log("재대결 요청: 거부 완료"); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.panelManager.OpenConfirmPanel("재대결 요청을\n거부하였습니다.", () => + { + GameManager.Instance.panelManager.CloseLoadingPanel(); + }); + }); + break; + } ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,"nicknameB"); }); @@ -192,15 +274,18 @@ public partial class GameLogic : IDisposable private void SetupPlayer(bool isBlack, string roomId, string opponentNickname, int opponentImageIndex) { // 선공, 후공 처리 - var isFirstPlayer = isBlack; + isFirstPlayer = isBlack; + _opponentNickname = opponentNickname; + _opponentImageIndex = opponentImageIndex; + if (isFirstPlayer) { Debug.Log("해당 플레이어가 선공 입니다"); FirstPlayerState = new PlayerState(true, MultiPlayManager, roomId); SecondPlayerState = new MultiPlayerState(false, MultiPlayManager); - UpdateUIForFirstPlayer(opponentNickname, opponentImageIndex); + UpdateUIForFirstPlayer(_opponentNickname, _opponentImageIndex); } else { @@ -208,7 +293,7 @@ public partial class GameLogic : IDisposable FirstPlayerState = new MultiPlayerState(true, MultiPlayManager); SecondPlayerState = new PlayerState(false, MultiPlayManager, roomId); - UpdateUIForSecondPlayer(opponentNickname, opponentImageIndex); + UpdateUIForSecondPlayer(_opponentNickname, _opponentImageIndex); } } @@ -343,6 +428,35 @@ public partial class GameLogic : IDisposable }; } } + + private void InitBoardForRevenge(bool isFirstPlayer) + { + //보드 초기화 + _board = new Enums.PlayerType[15, 15]; + _totalStoneCounter = 0; + StoneController.InitStones(); + RequestDrawChance = false; + + SelectedRow = -1; + SelectedCol = -1; + _lastRow = -1; + _lastCol = -1; + + // 금수 감지기 초기화 + _forbiddenDetector.RenjuForbiddenMove(_board); + + //timer 초기화 + FioTimer.InitTimer(); + + // 플레이어 셋업 + SetupPlayer(isFirstPlayer, _roomId, _opponentNickname, _opponentImageIndex); + + // 로딩 패널 열려 있으면 닫기 + GameManager.Instance.panelManager.CloseLoadingPanel(); + + // 메인 스레드에서 실행 - UI 업데이트는 메인 스레드에서 실행 필요 + StartGameOnMainThread(); + } #endregion From 1843df59ee96fcaf26b1818c77656bb24e3df7ca Mon Sep 17 00:00:00 2001 From: Jay <96156114+jaydev00a@users.noreply.github.com> Date: Fri, 28 Mar 2025 10:34:54 +0900 Subject: [PATCH 2/2] =?UTF-8?q?DO-77=20[REFACTOR]=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=EB=82=B4=EC=9A=A9=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Script/Game/GameLogic.cs | 126 ++++++++++++++++---------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/Assets/Script/Game/GameLogic.cs b/Assets/Script/Game/GameLogic.cs index ed917ab..07b35ff 100644 --- a/Assets/Script/Game/GameLogic.cs +++ b/Assets/Script/Game/GameLogic.cs @@ -187,83 +187,83 @@ public partial class GameLogic : IDisposable case Constants.MultiplayManagerState.RevengeRequestSent: Debug.Log("재대결 요청: 전송 완료"); break; - case Constants.MultiplayManagerState.ReceiveRevengeRequest: - Debug.Log("상대방의 재대결 요청이 들어옴"); - UnityMainThreadDispatcher.Instance().Enqueue(() => + case Constants.MultiplayManagerState.ReceiveRevengeRequest: + Debug.Log("상대방의 재대결 요청이 들어옴"); + ExecuteOnMainThread(() => + { + GameManager.Instance.panelManager.OpenDrawConfirmPanel("상대방의 재대결 요청을\n승낙하시겠습니까?", () => { - GameManager.Instance.panelManager.OpenDrawConfirmPanel("상대방의 재대결 요청을\n승낙하시겠습니까?", () => - { - MultiPlayManager.AcceptRevenge(); - }, () => - { - MultiPlayManager.RejectRevenge(); - }); + MultiPlayManager.AcceptRevenge(); + }, () => + { + MultiPlayManager.RejectRevenge(); }); - break; - case Constants.MultiplayManagerState.RevengeAccepted: - Debug.Log("재대결 요청: 승낙이 들어옴"); - var revengeAcceptedData = data as RevengeData; + }); + break; + case Constants.MultiplayManagerState.RevengeAccepted: + Debug.Log("재대결 요청: 승낙이 들어옴"); + var revengeAcceptedData = data as RevengeData; - // TODO: 응답값 없을 때 서버에서 다시 받아오기 or AI 플레이로 넘기는 처리 필요 - if (revengeAcceptedData == null) + // TODO: 응답값 없을 때 서버에서 다시 받아오기 or AI 플레이로 넘기는 처리 필요 + if (revengeAcceptedData == null) + { + Debug.Log("RevengeAccepted 응답값이 null 입니다"); + return; + } + + // 선공, 후공 처리 + isFirstPlayer = revengeAcceptedData.isBlack; + + ExecuteOnMainThread(() => + { + GameManager.Instance.panelManager.OpenConfirmPanel("상대방이\n재대결을 승낙하였습니다.\n게임이 다시 시작됩니다.", () => { - Debug.Log("RevengeAccepted 응답값이 null 입니다"); - return; - } - - // 선공, 후공 처리 - isFirstPlayer = revengeAcceptedData.isBlack; - - UnityMainThreadDispatcher.Instance().Enqueue(() => - { - GameManager.Instance.panelManager.OpenConfirmPanel("상대방이\n재대결을 승낙하였습니다.\n게임이 다시 시작됩니다.", () => - { - InitBoardForRevenge(isFirstPlayer); - }); + InitBoardForRevenge(isFirstPlayer); }); - break; - case Constants.MultiplayManagerState.RevengeConfirmed: - Debug.Log("재대결 요청: 승낙 완료"); - var revengConfirmedData = data as RevengeData; + }); + break; + case Constants.MultiplayManagerState.RevengeConfirmed: + Debug.Log("재대결 요청: 승낙 완료"); + var revengConfirmedData = data as RevengeData; - // TODO: 응답값 없을 때 서버에서 다시 받아오기 or AI 플레이로 넘기는 처리 필요 - if (revengConfirmedData == null) - { - Debug.Log("RevengeConfirmed 응답값이 null 입니다"); - return; - } + // TODO: 응답값 없을 때 서버에서 다시 받아오기 or AI 플레이로 넘기는 처리 필요 + if (revengConfirmedData == null) + { + Debug.Log("RevengeConfirmed 응답값이 null 입니다"); + return; + } - // 선공, 후공 처리 - isFirstPlayer = revengConfirmedData.isBlack; + // 선공, 후공 처리 + isFirstPlayer = revengConfirmedData.isBlack; - UnityMainThreadDispatcher.Instance().Enqueue(() => + ExecuteOnMainThread(() => + { + GameManager.Instance.panelManager.OpenConfirmPanel("재대결 요청을\n승낙하였습니다.\n게임이 다시 시작됩니다.", () => { - GameManager.Instance.panelManager.OpenConfirmPanel("재대결 요청을\n승낙하였습니다.\n게임이 다시 시작됩니다.", () => - { - InitBoardForRevenge(isFirstPlayer); - }); + InitBoardForRevenge(isFirstPlayer); }); - break; - case Constants.MultiplayManagerState.RevengeRejected: - Debug.Log("재대결 요청: 거부가 들어옴"); - UnityMainThreadDispatcher.Instance().Enqueue(() => + }); + break; + case Constants.MultiplayManagerState.RevengeRejected: + Debug.Log("재대결 요청: 거부가 들어옴"); + ExecuteOnMainThread(() => + { + GameManager.Instance.panelManager.OpenConfirmPanel("상대방이\n재대결 요청을\n거부하였습니다.", () => { - GameManager.Instance.panelManager.OpenConfirmPanel("상대방이\n재대결 요청을\n거부하였습니다.", () => - { - GameManager.Instance.panelManager.CloseLoadingPanel(); - }); + GameManager.Instance.panelManager.CloseLoadingPanel(); }); - break; - case Constants.MultiplayManagerState.RevengeRejectionConfirmed: - Debug.Log("재대결 요청: 거부 완료"); - UnityMainThreadDispatcher.Instance().Enqueue(() => + }); + break; + case Constants.MultiplayManagerState.RevengeRejectionConfirmed: + Debug.Log("재대결 요청: 거부 완료"); + ExecuteOnMainThread(() => + { + GameManager.Instance.panelManager.OpenConfirmPanel("재대결 요청을\n거부하였습니다.", () => { - GameManager.Instance.panelManager.OpenConfirmPanel("재대결 요청을\n거부하였습니다.", () => - { - GameManager.Instance.panelManager.CloseLoadingPanel(); - }); + GameManager.Instance.panelManager.CloseLoadingPanel(); }); - break; + }); + break; } ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,"nicknameB"); });