새소식

💻 Programming (프로그래밍)/Unity | C#

[Unity] 포톤(Photon) 코드 정리

  • -

1. 포톤 접속

Photon Network Class 공식문서

- 서버 설정

PhotonNetwork.GameVersion = this.gameVersion;
PhotonNetwork.SendRate = 60;
PhotonNetwork.SerializationRate = 30;

PhotonNetwork.AutomaticallySyncScene = true;
PhotonNetwork.ConnectUsingSettings();

 

GameVersion : 게임버전에 따라서 사람들을 매칭시켜줍니다.

SendRate : 초당 몇 번 Package를 전송하는지 횟수 입니다.

SerializationRate : 초당 몇 번 OnPhotonSerialize 이 실행하는지 횟수 입니다.

AutomaticallySyncScene : true 일 시, PhotonNetwork.LoadLevel 을 사용 시에 마스터 클라이언트는 모든 참가자를 동일한 레벨로 자동으로 넘어가게 해줍니다.

 

ConnectUsingSettings() :  Photon Editer에 설정된 값대로 포톤 사용자들을 서버에 연결시켜 줍니다.

 

 

- 방 설정

PhotonNetwork.LocalPlayer.NickName = userIdText.text; // 현재 플레이어 닉네임 설정하기.

RoomOptions roomOptions = new RoomOptions();
roomOptions.CleanupCacheOnLeave = true;
roomOptions.MaxPlayers = 2; // 인원 지정.
roomOptions.CustomRoomProperties = new ExitGames.Client.Photon.Hashtable() { { "userSex", userSex } }; // 성별 지정.
roomOptions.CustomRoomPropertiesForLobby = new string[] { "userSex" }; // 여기에 키 값을 등록해야, 필터링이 가능하다.

// 방 참가를 시도하고, 실패하면 생성해서 참가함.
PhotonNetwork.JoinRandomOrCreateRoom(
    expectedCustomRoomProperties: new ExitGames.Client.Photon.Hashtable() { { "userSex", !userSex } }, expectedMaxPlayers: 2, // 참가할 때의 기준.
    roomOptions: roomOptions // 생성할 때의 기준.
);

PhotonNetwork.LocalPlayer.NickName : 플레이어의 닉네임을 설정합니다.

 

roomOptions.CleanupCacheOnLeave: 플레이어가 방 나갈시, 나간 플레이어 이벤트를 실행하지 못하게 해줍니다.

roomOptions.CustomRoomProperties = new ExitGames.Client.Photon.Hashtable() { { "userSex", userSex } };

: 룸의 프로퍼티를 설정하는 과정이며, Hashtable 값으로 {"key name", value} 로 설정됩니다.

roomOptions.CustomRoomPropertiesForLobby: 이 key값에 해당하는 동일한 프로퍼티에만 접속할 수 있습니다.

 

PhotonNetwork.JoinRandomOrCreateRoom() : 방 참가를 시도하고, 실패하면 직접 생성하여 참가합니다.

 

public override void OnPlayerEnteredRoom(Player newPlayer)
{
    if(PhotonNetwork.IsMasterClient)
    {
        if (PhotonNetwork.CurrentRoom.PlayerCount == PhotonNetwork.CurrentRoom.MaxPlayers) PhotonNetwork.LoadLevel("Game");
    }
}

 

OnPlayerEnteredRoom () : 포톤 콜백함수로, 플레이어가 방에 참가시에 실행되는 함수입니다.

PhotonNetwork.CurrentRoom.PlayerCount : 현재 참가한 방의 플레이어의 수입니다.

PhotonNetwork.CurrentRoom.MaxPlayers :  현재 참가한 방의 플레이어 최대 수 입니다.

PhotonNetwork.LoadLevel("scene 명") : 마스터 클라이언트가 방에 참가한 모든 플레이어들을 특정 Scene을 로드해줍니다

 

+ 추가사항

PhotonNetwork.LeaveRoom() : 플레이어를 방에서 나가게 해줍니다.

 

2. 게임 시

- 플레이어 프리팹 스폰

// 플레이어 스폰 기능
    void SpwanPlayer()
    {
        if (PhotonNetwork.IsMasterClient)
        {
            player_game1 = PhotonNetwork.Instantiate(_characters[PlayerPrefs.GetInt("Character") - 1], spawnPostion.position, Quaternion.identity);
            PV.RPC("setPlayer", RpcTarget.OthersBuffered, player_game1.GetPhotonView().ViewID, true);
        }
        else
        {
            player_game2 = PhotonNetwork.Instantiate(_characters[PlayerPrefs.GetInt("Character") - 1], spawnPostion.position, Quaternion.identity);
            PV.RPC("setPlayer", RpcTarget.OthersBuffered, player_game2.GetPhotonView().ViewID, false);
        }
    }

    [PunRPC]
    void setPlayer(int ID, bool isMaster)
    {
        if (isMaster)
        {
            player_game1 = PhotonView.Find(ID).gameObject;
            Debug.Log("마스터 플레이어는 리모트에 player1전달완료");
        }
        else
        {
            player_game2 = PhotonView.Find(ID).gameObject;
            Debug.Log("리모트 플레이어는 마스터에 player2전달완료");
        }
    }

플레이어를 생성하는 경우, PhotonNetwork.Instantiate("프리팹 명", postion, rotation) 을 사용합니다.

이때 주의할점은 스폰하고자 하는 플레이어 캐릭터가 Resource 명의 폴더안에 프리팹으로 되어있어야 합니다.

** 이때 서로 동기화 하고 싶은 오브젝트 안에는 Photon View 컴포넌트를 꼭 꼭 넣어줍시다.

 

 

PhotonView 컴포넌트를 저는 PV로 명명하였습니다.

Public PhotonView PV;


PV.RPC("RPC 함수명", 타겟, 파라미터들)을 사용하여 [PunRPC]로 된 함수를 실행시킬 수 있습니다.

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.