본문 바로가기
PROGRAMING📚/Unity📑

[UNITY]포톤(PUN2) 콜백 코드 정리

별찌루 2024. 4. 2.
728x90
반응형

포톤(PUN2) 콜백 코드 정리 

 

포톤에서 제공하는 콜백함수를 사용하기 위해서는

상단에 using Photon.Pun; 을 선언해주고

MonoBehaviour  MonoBehaviourPunCallbacks 로 변경해줌

 

using Photon.Pun;

public class NetworkManager : MonoBehaviourPunCallbacks

 

크게 사용하는 콜백함수를 정리하면

 

서버 연결

방 생성하기

방 참여하기

방 만들기/참여

랜덤으로 방 참가하기

방 나가기

 

다음 기능을 구현할 수 있다


서버 연결하기

 

PhotonNetwork.ConnectUsingSettings();

Photon Editer 에 설정된 값으로 포톤 사용자들을 서버에 연결 시켜준다고함

  public void Connect() => PhotonNetwork.ConnectUsingSettings();

서버를 연결해야지 방을 만들고 생성하는 기본 기능들을 구현 할 수 있다

서버에 연결이 되고 나면

    public void Connect() => PhotonNetwork.ConnectUsingSettings();
    public override void OnConnectedToMaster()
    {
        Debug.Log("서버 접속 완료");
        JoinLobby(); //로비 접속
    }
    
    public void JoinLobby() => PhotonNetwork.JoinLobby();
    public override void OnJoinedLobby()
    {
        Debug.Log("로비 접속 완료");
    }

 

OnConnectedToMaster() 라는 함수 안에 자동으로 들어 온다

 

서버에 연결이 되면 로비에 접속 할 수 있게 하였는데

로비에 접속 되어 있지 않으면 생성된 방 리스트를 업데이트 할 때 필요한

콜백 함수( public override void OnRoomListUpdate(List<RoomInfo> roomList))가 동작을 하지않음

 

 public override void OnRoomListUpdate(List<RoomInfo> roomList)

 


방 생성하기

PhotonNetwork.CreateRoom(string roomName,[RoomOptions roomOptions = null],[TypedLobby typedLobby = null],[string[] expectedUsers = null])

 

방을 생성하기 위해서는 위의 함수를 사용해야 한다

 

PhotonNetwork.CreateRoom(LobbyUIManager.Instance.RoomNumber_inf.text, new RoomOptions { MaxPlayers = 6 });

    public override void OnCreatedRoom()
    {
        Debug.Log("방 만들기 완료");
    }

 

위와 같이 입력하면 최대 6명의 플레이어가 해당 방에 들어올수 있도록 설정을 해두었다

방이 생성되면 public override void OnCreatedRoom() 콜백 함수가 동작한다 

 

만약 이미 존재하는 방이거나 방을 생성하는데 실패하면

다음 콜백함수로 들어가면서 그 다음 동작에 대한 코드를 작성 할 수 있다

   public override void OnCreateRoomFailed(short returnCode, string message)
    {
        Debug.Log("방 만들기 실패");
    }

방 참여하기

 PhotonNetwork.JoinRoom("참가하고 싶은 방 이름");

 

PhotonNetwork.JoinRoom 을 사용하면 해당하는 방이 존재하는 경우

방에 참가가 가능하게 된다

방에 참가 하게 되면  OnJoinedRoom() 콜백 함수가 호출 되고

 

    public override void OnJoinedRoom()
    {
        Debug.Log("방 참가 완료");
        PhotonNetwork.LoadLevel("Room01");
    }

 

게임씬을 불러오게 하고 싶을 경우

SceneManager.LoadScene() 이 아니라 포톤에서 제공하는

 PhotonNetwork.LoadLevel("Room01"); 을 사용해서 게임 씬을 불러온다


방 만들기/참여

 

방 이름을 작성했을 때, 해당하는 방이있으면 해당방으로 참가하고

없을 경우 방을 만들어서 참여할 수 있도록 만드는 콜백함수

PhotonNetwork.JoinOrCreateRoom("방이름", new RoomOptions { MaxPlayers = 6 }, null);

 

해당하는 방이없는 경우

 OnCreatedRoom()으로 들어갔다가 OnJoinedRoom()를 호출한다

    public override void OnCreatedRoom()
    {
        Debug.Log("방 만들기 완료");
    }
    public override void OnJoinedRoom()
    {
        Debug.Log("방 참가 완료");
        PhotonNetwork.LoadLevel("Room01");
    }

랜덤으로 방 참가하기

 

이미 생성되어 있는 방에 랜덤으로 참가하고 싶은 기능은

PhotonNetwork.JoinRandomRoom();
PhotonNetwork.JoinRandomOrCreateRoom();

 

PhotonNetwork.JoinRandomRoom(); 함수를 사용해서 기능 구현이 가능하다

랜덤으로 방 참가를 실패 했을 경우

    public override void OnJoinRandomFailed(short returnCode, string message)
    {
         Debug.Log("랜덤 방 참가 실패");
    }

 

PhotonNetwork.JoinRandomOrCreateRoom();을 사용하면 방이 없는 경우

랜덤으로 방을 생성해서 참가 하게 된다


방 나가기

 

PhotonNetwork.LeaveRoom(); 는 플레이어를 방에서 나가게 해준다

 

 public override void OnLeftRoom() 

로컬 사용자/클라이언트가 방에서 나갔을 때 호출 됩니다.

	PhotonNetwork.LeaveRoom();

    public override void OnLeftRoom()
    {
        base.OnLeftRoom();
    }

 

 

공식 문서

 

Photon Unity Networking: Photon.PunBehaviour Class Reference

이 클래스는 .photonView 와 PUN 이 호출 할 수 있는 모든 콜백/이벤트들을 제공 합니다. 필요한 이벤트/메소드를 오버라이드하여 사용하세요. More... 이 클래스는 .photonView 와 PUN 이 호출 할 수 있는

doc-api.photonengine.com


포톤 방 설정

 

 

Photon Unity Networking 2: RoomOptions Class Reference

Wraps up common room properties needed when you create rooms. Read the individual entries for more details. More... Wraps up common room properties needed when you create rooms. Read the individual entries for more details. This directly maps to the fields

doc-api.photonengine.com

 

방에 대한 설정을 해주기 위해서는 RoomOptions 라는 클래스를 사용해서 설정을 해주어야한다

방 마다 다른 값을 적용 하려면 새로운 생성자를 하나 만들어준다

 

RoomOptions roomOptions = new RoomOptions();

 

RoomOptions.MaxPlayers 는 방안에 존재 할 수있는 플레이어의 수를 지정해줄 수 있다

0 은 플레이어의 수에 제한없이 방안에 들어올 수 있다

 

RoomOptions.CleanupCacheOnLeave 는 플레이어가 방을 나갈 때, 사용자의 이벤트 및 속성을 룸에서 제거할 때 사용된다

기본값으로 True가 사용되고 있다 해당 값을 False로 하는 경우 방을 무한정 사용하기 때문에 로드하는데 오래 걸릴 수 있다

 

RoomOptions.CustomRoomProperties 는 설정할 룸의 사용자 지정 속성으로

포톤에서는 각 방에 대해 일부 기본 속성을 제공하지만 때로는 게임의 특정 요구 사항에 따라서 사용자 지정 속성이 필요할 수있다

예를 들어 게임 맵 이름, 난이도, 게임 모드  등과 같은 정보를 방에 추가 할  있다

 

RoomOptions.CustomRoomPropertiesForLobby 는 로비에서 표시 될 때, 사용자의 정의 방 속성을 어떤 것으로 설정 할지 결정을 한다

로비에서 방을 표시 할 때, 사용자 지정 방 속성을 사용해서 각 방을 식별하고 필터링 할 수 있게 도와준다

"CustomRoomPropertiesForLobby" 설정을 사용해서 로비에서 표시할 사용자 정의 방 속성을 지정 할 수 있다 

 

RoomOptions.CustomRoomProperties / RoomOptions.CustomRoomPropertiesForLobby 응용 예시

	RoomOptions options = new RoomOptions();
        options.MaxPlayers = (byte)maxPlayers;

        // CustomRoomProperties 설정
        ExitGames.Client.Photon.Hashtable customRoomProperties = new ExitGames.Client.Photon.Hashtable();
        customRoomProperties.Add("Map", mapName); // 맵 이름
        options.CustomRoomProperties = customRoomProperties;
        
        // 로비에서 사용할 CustomRoomProperties
        options.CustomRoomPropertiesForLobby = new string[] { "Map" };
        // 방 생성 또는 업데이트
       PhotonNetwork.JoinOrCreateRoom(roomName, options, TypedLobby.Default);
  // 방 목록을 갱신할 때 호출되는 함수
    public override void OnRoomListUpdate(List<RoomInfo> roomList)
    {
        foreach (RoomInfo room in roomList)
        {
            // 방 속성 중 "Map" 키를 사용하여 맵 이름을 확인
            string mapName = (string)room.CustomProperties["Map"];
            Debug.Log("Room: " + room.Name + ", Map: " + mapName);
        }
    }

 

 

PhotonNetwork.InRoom 은 클라이언트가 방에 들어와 있는 경우 True 로 반환하고 아닌 경우 False 를 반환한다

 

PhotonNetwork.CountOfPlayers 는 현재 접속한 클라이언트의 수를 확인 할 수 있음 

PhotonNetwork.CountOfRooms 는 현재 생성 되어있는 룸의 갯수를 확인 할 수 있음

PhotonNetwork.CountOfPlayersInRooms 는 모든 방에 있는 플레이어의 인원을 확인 할 수 있음

PhotonNetwork.InLobby 는 로컬 클라이언트가 로비에 들어와 있는 상태인지 확인 할 수 있다

PhotonNetwork.IsConnected 는 포톤 서버에 연결 되어있는지 확인 할 수 있다

 

PhotonNetwork.LocalPlayer.NickName 는 플레이어의 닉네임을 설정하거나 가져올 수 있다

 

 

PhotonNetwork.PlayerList 는 현재 방에 있는 플레이어의 목록을 가져올 수 있다

포톤에서 제공하는  PhotonNetwork.CurrentRoom.Players 로 제공하지만 Dictionary 로 사용된다

포톤에서는 PhotonNetwork.PlayerList로 사용하는 것은 비효율적이라 추천하지 않는다고 한다

 

PhotonNetwork.PlayerList 를 다음과 같이 사용하면

PhotonNetwork.PlayerList[i].NickName 는 플레이어의 리스트의 이름을 가져올 수 도 있다

 

PhotonNetwork.CurrentRoom.PlayerCount를 사용해서 현재 방에 존재하는 플레이어의 수를 확인 할 수 있다

PhotonNetwork.CurrentRoom.Name 는 현재 방의 이름을 가져올 수 있다 

PhotonNetwork.CurrentRoom.PlayerCount 는 현재 방의 인원수를 의미한다

PhotonNetwork.CurrentRoom.MaxPlayers 는 현재 방의 최대 인원수를 확인 할 수 있다

 

 


서버 설정

 

PhotonNetwork.GameVersion = this.gameVersion; 에서

gameVersion 은 포톤 게임 버전을 설정하기 위한 변수로 같은 게임 버전 끼리만 공유가 된다

PhotonNetwork.GameVersion 은 포톤의 게임 버전을 설정 할 수 있다

 

PhotonNetwork.AutomaticallySyncScene 는 마스터 클라이언트와 일반 클라이언트의 레벨을 동기화 할지에 대한 여부를 물어보고

True 인 경우, 마스터 클라이언트에서 레벨을 변경 할 시 모든 클라이언트들이 자동으로 동일한 레벨을 불러온다

 

PhotonNetwork.ConnectUsingSettings() 는 포톤 서버와의 연결이 되었는지 확인하는 메소드로 연결에 성공하면

콜백 메소드인 OnConnectedToMaster가 실행이 된다

 

PhotonNetwork.SendRate 는 PhotonHandler가 대기열에 있는 경우 초당 몇 번 데이터를 보낼지 정의한다

 

PhotonNetwork.SerializationRate제어되는 개체에 대해 PhotonViews에서

초당 OnPhotonSerialize를 호출할 횟수를 정의한다

OnPhotonSerialize에 작성된 업데이트는 일시적으로 대기열에 들어가서 다음 LateUpdate에 전송된다

SerializationRate가 높으면 더 많은 전송이 발생한다

 

 

 

728x90
반응형

댓글