diff --git a/Assets/Script/Common/Constants.cs b/Assets/Script/Common/Constants.cs index 83d9046..eb717cc 100644 --- a/Assets/Script/Common/Constants.cs +++ b/Assets/Script/Common/Constants.cs @@ -31,6 +31,7 @@ RevengeConfirmed, // 재대결 수락 전송 확인 RevengeRejected, // 재대결 거절 수신 RevengeRejectionConfirmed, // 재대결 거절 전송 확인 - ReceiveTimeout // 상대방이 타임 아웃일 때 + ReceiveTimeout, // 상대방이 타임 아웃일 때 + OpponentDisconnected }; } \ No newline at end of file diff --git a/Assets/Script/Game/GameLogic.cs b/Assets/Script/Game/GameLogic.cs index 07b35ff..9e80963 100644 --- a/Assets/Script/Game/GameLogic.cs +++ b/Assets/Script/Game/GameLogic.cs @@ -113,12 +113,19 @@ public partial class GameLogic : IDisposable StartGameOnMainThread(); break; case Constants.MultiplayManagerState.ExitRoom: - Debug.Log("## Exit Room"); + Debug.Log("## Exit Room"); // TODO: Exit Room 처리 break; case Constants.MultiplayManagerState.EndGame: Debug.Log("## End Game"); - // TODO: End Room 처리 + ExecuteOnMainThread(() => + { + GameManager.Instance.panelManager.OpenConfirmPanel("상대방의 연결이 끊어졌습니다.", () => + { + GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Win); + EndGame(Enums.GameResult.Win); + }); + }); break; case Constants.MultiplayManagerState.DoSurrender: Debug.Log("상대방의 항복 요청 들어옴"); @@ -264,7 +271,11 @@ public partial class GameLogic : IDisposable }); }); break; - } + case Constants.MultiplayManagerState.OpponentDisconnected: + Debug.Log("상대방 강제 종료"); + // 실제로 실행되지 않음. 상대방 강제 종료 시에는 EndGame으로 처리됨 + break; + } ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,"nicknameB"); }); diff --git a/Assets/Script/Game/GameManager.cs b/Assets/Script/Game/GameManager.cs index d8d7d77..559d58f 100644 --- a/Assets/Script/Game/GameManager.cs +++ b/Assets/Script/Game/GameManager.cs @@ -131,4 +131,10 @@ public class GameManager : Singleton if (_gameLogic == null) return; _gameLogic.RequestDrawChance = false; } + + private void OnApplicationQuit() + { + Debug.Log("앱 종료 감지: 소켓 연결 정리 중..."); + _gameLogic?.Dispose(); + } } \ No newline at end of file diff --git a/Assets/Script/Game/MultiplayManager.cs b/Assets/Script/Game/MultiplayManager.cs index 62a1a29..dec1b84 100644 --- a/Assets/Script/Game/MultiplayManager.cs +++ b/Assets/Script/Game/MultiplayManager.cs @@ -113,7 +113,9 @@ public class MultiplayManager : IDisposable _socket.On("revengeConfirmed", RevengeConfirmed); _socket.On("revengeRejected", RevengeRejected); _socket.On("revengeRejectionConfirmed", RevengeRejectionConfirmed); - + // 강제 종료 처리 + _socket.On("opponentDisconnected", OpponentDisconnected); + _socket.Connect(); } catch (Exception e) @@ -212,6 +214,7 @@ public class MultiplayManager : IDisposable return; } + Debug.Log("방 나감"); _socket.Emit("leaveRoom", new { roomId = _roomId }); _roomId = null; // 방 나가면 roomId 초기화 } @@ -337,6 +340,13 @@ public class MultiplayManager : IDisposable _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.DrawRejectionConfirmed, data.message); } + + private void DerawRejectionConfirmed(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.DrawRejectionConfirmed, data.message); + } #endregion @@ -414,6 +424,13 @@ public class MultiplayManager : IDisposable _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.RevengeRejectionConfirmed, data.message); } + private void OpponentDisconnected(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.OpponentDisconnected, data.message); + } + #endregion public void Dispose()