1. 📌 학습 동기
Photon PUN2를 이용한 멀티플레이 시스템을 구현하면서, 로비와 룸의 구조, 마스터 클라이언트의 개념, 방 생성 및 갱신 로직에 대한 이해가 부족하여 구조적인 헷갈림이 생겼고, 두 클라이언트 간 방 정보가 제대로 갱신되지 않는 문제가 있어 전체 흐름을 정리할 필요가 생겼다.
2. 📚 학습 내용
✅ Photon 연결 흐름
PhotonNetwork.ConnectUsingSettings(); // 마스터 서버에 연결
OnConnectedToMaster() // 연결 성공 시 콜백
PhotonNetwork.JoinLobby(); // 로비에 진입
✅ 마스터 클라이언트 vs 마스터 서버
항목설명
| 마스터 서버 | 모든 클라이언트가 처음 연결하는 중앙 서버. Lobby는 여기 소속 |
| 마스터 클라이언트 | Room에 입장한 첫 유저. 방 내에서 특수 권한을 가짐 (예: 시작 버튼 권한 등) |
✔ 로비는 서버 개념이라 마스터 클라이언트가 없어도 진입 가능
✔ 마스터 클라이언트는 Room이 있어야만 존재
✅ 방 생성과 입장 구조
PhotonNetwork.CreateRoom("roomName", roomOptions); // 방 생성 → 자동으로 해당 Room에 입장함 → OnJoinedRoom() 호출됨
※ IsVisible = false 이면 방은 비공개 상태로 Room List에 나타나지 않음
※ 방 생성 직후 자동으로 입장하므로 JoinRoom()은 필요 없음
✅ 방 리스트 갱신 흐름
public override void OnRoomListUpdate(List<RoomInfo> roomList)
- Lobby에 있는 사람만 호출됨
- Room에 있는 사람은 방 목록 갱신을 받지 못함
- 따라서 Room 내 유저에게 방 변경 알림이 필요하면 RaiseEvent 사용 고려
✅ 방 나가기
PhotonNetwork.LeaveRoom(); // Room 나가기 → OnLeftRoom() 호출됨 →
PhotonNetwork.JoinLobby(); // 로비 복귀 가능
✅ 방 삭제
- Room 안에 아무도 없으면 자동으로 삭제됨
- 다시 로비로 돌아온 사람들은 삭제된 Room이 리스트에서 사라진다
3. 🛠️ 이슈 트러블슈팅 및 해결
- ✅ 문제: 두 개의 클라이언트를 실행했는데 한 쪽에서 만든 방이 다른 쪽에 보이지 않음
- ✅ 원인: RoomList는 Lobby에 있을 때만 갱신됨. Room 내부에 있는 유저는 OnRoomListUpdate()를 받지 않음
- ✅ 해결: Room 내부 유저에게도 방 생성/삭제 정보를 주려면 RaiseEvent 또는 서버 이벤트 연동이 필요
4. 🤔 느낀 점
Photon PUN2의 구조는 단순해보이지만 서버-로비-룸-클라이언트의 흐름을 명확히 이해하지 못하면 구현 도중 많은 혼란을 겪게 된다. 특히 마스터 클라이언트와 마스터 서버의 개념을 구분하는 것이 핵심이며, 방 목록이 어디서 어떻게 갱신되는지에 따라 UI 반영도 달라져야 한다.
'Unity > Unity 개발' 카테고리의 다른 글
| Unity 공통 alert, confirm 매니저 제작 (1) | 2025.07.01 |
|---|---|
| 룬 / 스킬 시스템 구조 통합 방향 설계 (0) | 2025.06.30 |
| Unity 클라이언트와 서버 연동 전략 (0) | 2025.06.12 |
| MySQL 기반 인벤토리/계정 시스템 설계 (1) | 2025.06.12 |
| Node.js 기반 게임 API 서버 설계 (0) | 2025.06.12 |