From f3af9c86e65e730ef0c4cf358a1f98208b42eff1 Mon Sep 17 00:00:00 2001 From: Jay <96156114+jaydev00a@users.noreply.github.com> Date: Wed, 26 Mar 2025 18:35:15 +0900 Subject: [PATCH 1/2] =?UTF-8?q?DO-64=20[Feat]=20=ED=95=AD=EB=B3=B5=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/GameUIController.cs | 12 +++++-- Assets/Script/Common/Constants.cs | 4 ++- Assets/Script/Game/GameLogic.cs | 18 ++++++++++- Assets/Script/Game/GameManager.cs | 11 ++++++- Assets/Script/Game/MultiplayManager.cs | 43 ++++++++++++++++++++++++-- 5 files changed, 79 insertions(+), 9 deletions(-) diff --git a/Assets/GameUIController.cs b/Assets/GameUIController.cs index b602f67..b564b96 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(); @@ -37,8 +43,8 @@ public class GameUIController : MonoBehaviour GameManager.Instance.panelManager.OpenConfirmPanel("항복 하시겠습니까?", () => { //TODO: 서버에 항복 전달 및 기타 등등 - - GameManager.Instance.ChangeToMainScene(); + _multiplayManager.RequestSurrender(); + // GameManager.Instance.ChangeToMainScene(); }); } diff --git a/Assets/Script/Common/Constants.cs b/Assets/Script/Common/Constants.cs index 0dda83a..328ac54 100644 --- a/Assets/Script/Common/Constants.cs +++ b/Assets/Script/Common/Constants.cs @@ -16,6 +16,8 @@ StartGame, // 생성한 방에 다른 유저가 참여해서 게임 시작 SwitchAI, // 15초 후 매칭 실패 시 AI 플레이로 전환 알림 ExitRoom, // 자신이 방을 빠져 나왔을 때 - EndGame // 상대방이 접속을 끊거나 방을 나갔을 때 + EndGame, // 상대방이 접속을 끊거나 방을 나갔을 때 + DoSurrender, // 상대방이 항복했을 때 + SurrenderConfirmed // 항복 요청이 성공적으로 전송되었을 때 }; } \ No newline at end of file diff --git a/Assets/Script/Game/GameLogic.cs b/Assets/Script/Game/GameLogic.cs index 497eb19..0c1159f 100644 --- a/Assets/Script/Game/GameLogic.cs +++ b/Assets/Script/Game/GameLogic.cs @@ -235,7 +235,7 @@ public class GameLogic : MonoBehaviour private int _lastRow; private int _lastCol; - private MultiplayManager _multiplayManager; + public MultiplayManager _multiplayManager; private string _roomId; #region Renju Members @@ -419,6 +419,22 @@ 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; } ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,"nicknameB"); diff --git a/Assets/Script/Game/GameManager.cs b/Assets/Script/Game/GameManager.cs index 6ebe1f1..90bacf5 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) diff --git a/Assets/Script/Game/MultiplayManager.cs b/Assets/Script/Game/MultiplayManager.cs index 4c81e88..da8556d 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,8 @@ 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.Connect(); } @@ -109,6 +113,8 @@ public class MultiplayManager : IDisposable private void CreateRoom(SocketIOResponse response) { var data = response.GetValue(); + _roomId = data.roomId; + Debug.Log("roomId CreateRoom할 때 저장? " + _roomId); _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.CreateRoom, data.roomId); } @@ -116,8 +122,8 @@ public class MultiplayManager : IDisposable { var data = response.GetValue(); Debug.Log($"룸에 참여: 룸 ID - {data.roomId}, 상대방 등급 - {data.opponentRating}, 상대방 이름 - {data.opponentNickname}, 흑/백 여부 - {data.isBlack}, 상대방 이미지 인덱스 - {data.opponentImageIndex}"); - - // 필요한 데이터 사용 + _roomId = data.roomId; + Debug.Log("roomId JoinRoom할 때 저장? " + _roomId); _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.JoinRoom, data); } @@ -180,7 +186,38 @@ 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 Dispose() From e7c66d49d9cd69672f16954c61a6224059e420bc Mon Sep 17 00:00:00 2001 From: Jay <96156114+jaydev00a@users.noreply.github.com> Date: Wed, 26 Mar 2025 18:36:37 +0900 Subject: [PATCH 2/2] =?UTF-8?q?DO-64=20[Style]=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EB=B0=8F=20=EB=A1=9C=EA=B7=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/GameUIController.cs | 2 -- Assets/Script/Game/MultiplayManager.cs | 2 -- 2 files changed, 4 deletions(-) diff --git a/Assets/GameUIController.cs b/Assets/GameUIController.cs index b564b96..14d15b5 100644 --- a/Assets/GameUIController.cs +++ b/Assets/GameUIController.cs @@ -42,9 +42,7 @@ public class GameUIController : MonoBehaviour { GameManager.Instance.panelManager.OpenConfirmPanel("항복 하시겠습니까?", () => { - //TODO: 서버에 항복 전달 및 기타 등등 _multiplayManager.RequestSurrender(); - // GameManager.Instance.ChangeToMainScene(); }); } diff --git a/Assets/Script/Game/MultiplayManager.cs b/Assets/Script/Game/MultiplayManager.cs index da8556d..c5a8eab 100644 --- a/Assets/Script/Game/MultiplayManager.cs +++ b/Assets/Script/Game/MultiplayManager.cs @@ -114,7 +114,6 @@ public class MultiplayManager : IDisposable { var data = response.GetValue(); _roomId = data.roomId; - Debug.Log("roomId CreateRoom할 때 저장? " + _roomId); _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.CreateRoom, data.roomId); } @@ -123,7 +122,6 @@ public class MultiplayManager : IDisposable var data = response.GetValue(); Debug.Log($"룸에 참여: 룸 ID - {data.roomId}, 상대방 등급 - {data.opponentRating}, 상대방 이름 - {data.opponentNickname}, 흑/백 여부 - {data.isBlack}, 상대방 이미지 인덱스 - {data.opponentImageIndex}"); _roomId = data.roomId; - Debug.Log("roomId JoinRoom할 때 저장? " + _roomId); _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.JoinRoom, data); }