DO-79 [Feat] 강제 종료 처리

This commit is contained in:
Sehyeon 2025-03-28 13:21:52 +09:00
parent a06f9809de
commit 9abc67f9c6
4 changed files with 40 additions and 5 deletions

View File

@ -31,6 +31,7 @@
RevengeConfirmed, // 재대결 수락 전송 확인
RevengeRejected, // 재대결 거절 수신
RevengeRejectionConfirmed, // 재대결 거절 전송 확인
ReceiveTimeout // 상대방이 타임 아웃일 때
ReceiveTimeout, // 상대방이 타임 아웃일 때
OpponentDisconnected
};
}

View File

@ -118,7 +118,14 @@ public partial class GameLogic : IDisposable
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,6 +271,10 @@ public partial class GameLogic : IDisposable
});
});
break;
case Constants.MultiplayManagerState.OpponentDisconnected:
Debug.Log("상대방 강제 종료");
// 실제로 실행되지 않음. 상대방 강제 종료 시에는 EndGame으로 처리됨
break;
}
ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,"nicknameB");
});

View File

@ -131,4 +131,10 @@ public class GameManager : Singleton<GameManager>
if (_gameLogic == null) return;
_gameLogic.RequestDrawChance = false;
}
private void OnApplicationQuit()
{
Debug.Log("앱 종료 감지: 소켓 연결 정리 중...");
_gameLogic?.Dispose();
}
}

View File

@ -113,6 +113,8 @@ public class MultiplayManager : IDisposable
_socket.On("revengeConfirmed", RevengeConfirmed);
_socket.On("revengeRejected", RevengeRejected);
_socket.On("revengeRejectionConfirmed", RevengeRejectionConfirmed);
// 강제 종료 처리
_socket.On("opponentDisconnected", OpponentDisconnected);
_socket.Connect();
}
@ -212,6 +214,7 @@ public class MultiplayManager : IDisposable
return;
}
Debug.Log("방 나감");
_socket.Emit("leaveRoom", new { roomId = _roomId });
_roomId = null; // 방 나가면 roomId 초기화
}
@ -338,6 +341,13 @@ public class MultiplayManager : IDisposable
_onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.DrawRejectionConfirmed, data.message);
}
private void DerawRejectionConfirmed(SocketIOResponse response)
{
var data = response.GetValue<MessageData>();
_onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.DrawRejectionConfirmed, data.message);
}
#endregion
#region
@ -414,6 +424,13 @@ public class MultiplayManager : IDisposable
_onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.RevengeRejectionConfirmed, data.message);
}
private void OpponentDisconnected(SocketIOResponse response)
{
var data = response.GetValue<MessageData>();
_onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.OpponentDisconnected, data.message);
}
#endregion
public void Dispose()