Unity/Unity 개발

Photon PUN2의 로비 및 룸 구조 이해

leedh1211 2025. 6. 13. 04:49

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 반영도 달라져야 한다.