네트워크 동기화

램해·2025년 7월 11일
0

지금까지는 개인 플레이 위주로 공부를 했었지만 지금부터는 멀티플레이를 위한 공부를 진행한다.
그러기 위해서는 유니티의 Photon이라는 멀티플레이어 서버 공부를 해야한다.

Photon

Photon Unity Networking(PUN)는 유니티 멀티플레이어를 위한 패키지입니다. 직관적이고 유용한 기능이 많기에 현업에서도 사용중입니다.

매치메이킹

포톤 서버에 접속한 여러 접속자들이 같은 룸 안에 참가해서 게임을 즐길 수 있게 하는 시스템
장점 :
서버에게 매칭되는 룸을 선정받는 빠른참가 기능.
룸의 목록을 얻어 사용자가 선택한 룸에 참가하는 기능
친구를 따라 룸에 입장하는 기능.

매치메이킹을 통해 룸에 들어온 접속자들의 동기화를 통해 실시간 네트워크 게임을 구성할 수 있습니다. 네트워크 게임에서는 다른 클라이언트들에게 자신의 로컬 상태를 최신의 상태로 유지시켜 주는 것이 게임의 전부입니다.

포톤 구현 컨셉

PhotonNetwork.ConnectUsingSettings();   // 접속 시도 요청
PhotonNetwork.Disconnect();             // 접속 해제 요청

PhotonNetwork.CreateRoom("RoomName");   // 방 생성 요청
PhotonNetwork.JoinRoom("RoomName");     // 방 입장 요청
PhotonNetwork.LeaveRoom();              // 방 퇴장 요청

PhotonNetwork.JoinLobby();              // 로비 입장 요청
PhotonNetwork.LeaveLobby();             // 로비 퇴장 요청

PhotonNetwork.LoadLevel("SceneName");   // 씬 전환 요청

bool isConnected = PhotonNetwork.IsConnected;           // 접속 여부 확인
bool isInRoom = PhotonNetwork.InRoom;                   // 방 입장 여부 확인
bool isLobby = PhotonNetwork.InLobby;                   // 로비 입장 여부 확인
ClientState state = PhotonNetwork.NetworkClientState;   // 클라이언트 상태 확인
Player player = PhotonNetwork.LocalPlayer;              // 포톤 플레이어 정보 확인
Room players = PhotonNetwork.CurrentRoom;               // 현재 방 정보 확인

public class NetworkManager : MonoBehaviourPunCallbacks
{
  public override void OnConnected() { }                          // 포톤 접속시 호출됨
  public override void OnConnectedToMaster() { }                  // 마스터 서버 접속시 호출됨
  public override void OnDisconnected(DisconnectCause cause) { }  // 접속 해제시 호출됨

  public override void OnCreatedRoom() { }    // 방 생성시 호출됨
  public override void OnJoinedRoom() { }     // 방 입장시 호출됨
  public override void OnLeftRoom() { }       // 방 퇴장시 호출됨
  public override void OnPlayerEnteredRoom(Player newPlayer) { }  // 새로운 플레이어가 방 입장시 호출됨
  public override void OnPlayerLeftRoom(Player otherPlayer) { }   // 다른 플레이어가 방 퇴장시 호출됨
  public override void OnCreateRoomFailed(short returnCode, string message) { }   // 방 생성 실패시 호출됨
  public override void OnJoinRoomFailed(short returnCode, string message) { }     // 방 입장 실패시 호출됨

  public override void OnJoinedLobby() { }    // 로비 입장시 호출됨
  public override void OnLeftLobby() { }      // 로비 퇴장시 호출됨
  public override void OnRoomListUpdate(List<RoomInfo> roomList) { }  // 방 목록 변경시 호출됨
}

아래의 코드를 통해서 방의 정보와 플레이어의 정보를 변경하거나 확인할 수 있습니다.
Room room = PhotonNetwork.CurrentRoom;  // 현재 참가한 룸을 확인

// 룸 커스텀 프로퍼티 설정
ExitGames.Client.Photon.Hashtable roomProperty = new ExitGames.Client.Photon.Hashtabl> ();
roomProperty["Map"] = "Select Map";
room.SetCustomProperties(roomProperty);

// 룸 커스텀 프로퍼티 확인
string curMap = (string)room.CustomProperties["Map"];

Player player = PhotonNetwork.LocalPlayer;  // 자신 플레이어를 확인

// 플레이어 커스텀 프로퍼티 설정
ExitGames.Client.Photon.Hashtable playerProperty = new ExitGames.Client.Photon> Hashtable();
playerProperty["Ready"] = true;
player.SetCustomProperties(playerProperty);

// 플레이어 커스텀 프로퍼티 확인
bool ready = (bool)player.CustomProperties["Ready"];

아래의 콜백함수를 통해서 방의 정보와 플레이어의 정보가 변경되는 상황을 확인할 수 있습니다.
public class NetworkManager : MonoBehaviourPunCallbacks
{
    public override void OnRoomPropertiesUpdate(ExitGames.Client.Photon.Hashtable propertiesThatChanged)
    {
        // 현재 참여한 방의 프로퍼티가 업데이트시 호출됨
    }

    public override void OnPlayerPropertiesUpdate(Player targetPlayer, ExitGames.Client.Photon.Hashtable changedProps)
    {
        // 같은 방의 플레이어의 프로퍼티가 업데이트시 호출됨
    }
}

방장이 관리 할 수 있게 하는 소스코드
public class NetworkManager : MonoBehaviourPunCallbacks
{
   public void GameStart()
   {
      // 자신 플레이어가 방장이 아닌 경우 반환하여 아래의 코드가 실행되지 않도록 함
      if (PhotonNetwork.LocalPlayer.IsMasterClient == false)
           return;
    
      // 방장만이 실행할 수 있는 소스코드
      PhotonNetwork.AutomaticallySyncScene = true;    // 모든 방구성원이 같은 씬으로 > 이동하도록 동기화함
       PhotonNetwork.LoadLevel("GameScene");          // 네트워크를 통해 씬을 이동하도록 > 신청함
    }
}

0개의 댓글