포톤(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();
}
공식 문서
포톤 방 설정
방에 대한 설정을 해주기 위해서는 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가 높으면 더 많은 전송이 발생한다
'PROGRAMING📚 > Unity📑' 카테고리의 다른 글
[UNITY]비동기 프로그램 만들기: async / await (1) | 2024.04.05 |
---|---|
[UNITY]파일 선택 다이얼로그 사용하기: EditorUtility.OpenFilePanel 함수 사용법 (1) | 2024.04.02 |
[UNITY]Photon PUN2(4) - 플레이어 세팅 (0) | 2024.03.18 |
[UNITY]Photon Pun2 (3) - 캐릭터 설정 해주기 (1) | 2024.03.18 |
[UNITY]Photon PUN2 (2) - 서버 만들기 스크립트 작성 (0) | 2024.03.18 |
댓글