포톤은 무작위 입장 함수인 JoinRandomRoom()와 아무방도 없다면 OnJoinRandomFailed() 콜백함수를 제공한다. PhotonManager 스크립트를 다음과 같이 수정한다.
// 로비에 접속 후 호출되는 콜백 함수
public override void OnJoinedLobby() {
Debug.Log($"PhotonNetwork.InLobby = {PhotonNetwork.InLobby}");
PhotonNetwork.JoinRandomRoom();
}
// 랜덤한 룸 입장이 실패했을 경우 호출되는 콜백 함수
public override void OnJoinRandomFailed(short returnCode, string message) {
Debug.Log($"JoinRandom Filed {returnCode}:{message}");
}
실행해보면 방이 없기 때문에 당연히 OnJoinRandomFailed() 콜백함수가 실행되면 입장할수 없다는 메시지가 나올것이다
CreateRoom함수
입장할 수 없다는 메시지 아래 방을 만드는 코드를 추가해보자. 만들 룸의 옵션을 설정후 CreateRoom()을 이용해 만든다.
// 랜덤한 룸 입장이 실패했을 경우 호출되는 콜백 함수
public override void OnJoinRandomFailed(short returnCode, string message) {
Debug.Log($"JoinRandom Filed {returnCode}:{message}");
// 룸의 속성 정의
RoomOptions ro = new RoomOptions();
ro.MaxPlayers = 20; // 룸에 입장할 수 있는 최대 접속자 수
ro.IsOpen = true; // 룸의 오픈 여부
ro.IsVisible = true; // 로비에서 룸 목록에 노출시킬 여부
// 룸 생성
PhotonNetwork.CreateRoom("My Room", ro);
}
생성이 완료되는 OnCreatedRoom 콜백함수가 호출되며 실패하면 OnCreateRoomFailed()가 호출된다
// 룸 생성이 완료된 후 호출되는 콜백 함수
public override void OnCreatedRoom() {
Debug.Log("Created Room");
Debug.Log($"Room Name = {PhotonNetwork.CurrentRoom.Name}");
}
룸을 만든 유저는 자동으로 방장이되어 방에 입장하면서 OnJoinedRoom콜백 함수가 호출된다. PlayerCount는 1번이다.
// 룸에 입장한 후 호출되는 콜백 함수
public override void OnJoinedRoom() {
Debug.Log($"PhotonNetwork.InRoom = {PhotonNetwork.InRoom}");
Debug.Log($"Player Count = {PhotonNetwork.CurrentRoom.PlayerCount}");
}
OnJoinedRoom()함수를 다음과 같이 변경해 룸에 접속한 사용자 정보를 얻어오자 NickName은 동일할수 있고 ActorNumber는 고유하다.
// 룸에 입장한 후 호출되는 콜백 함수
public override void OnJoinedRoom() {
Debug.Log($"PhotonNetwork.InRoom = {PhotonNetwork.InRoom}");
Debug.Log($"Player Count = {PhotonNetwork.CurrentRoom.PlayerCount}");
foreach (var player in PhotonNetwork.CurrentRoom.Players) {
Debug.Log($"{player.Value.NickName} , {player.Value.ActorNumber}");
}
}
실행해보면 방을 잘 만들어서 입장하는 걸 볼 수 있다.
PhotonManager스크립트의 전체코드
using UnityEngine;
using TMPro;
using Photon.Pun; //포톤 API를 위한 네임스페이스
using Photon.Realtime; //포톤 API를 위한 네임스페이스
using System.Collections.Generic;
public class PhotonManager : MonoBehaviourPunCallbacks {
private readonly string version = "1.0"; // 게임의 버전
private string userId = "Zack"; // 유저의 닉네임
void Awake() {
PhotonNetwork.AutomaticallySyncScene = true; // 마스터 클라이언트의 씬 자동 동기화 옵션
PhotonNetwork.GameVersion = version; // 게임 버전 설정
PhotonNetwork.NickName = userId; //접속 유저의 닉네임 설정
Debug.Log(PhotonNetwork.SendRate);// 포톤 서버와의 데이터의 초당 전송 횟수
PhotonNetwork.ConnectUsingSettings(); // 포톤 서버 접속
}
public override void OnConnectedToMaster() {
Debug.Log("Connected to Master!");
Debug.Log($"PhotonNetwork.InLobby = {PhotonNetwork.InLobby}");
PhotonNetwork.JoinLobby();
}
// 로비에 접속 후 호출되는 콜백 함수
public override void OnJoinedLobby() {
Debug.Log($"PhotonNetwork.InLobby = {PhotonNetwork.InLobby}");
PhotonNetwork.JoinRandomRoom();
}
// 랜덤한 룸 입장이 실패했을 경우 호출되는 콜백 함수
public override void OnJoinRandomFailed(short returnCode, string message) {
Debug.Log($"JoinRandom Filed {returnCode}:{message}");
// 룸의 속성 정의
RoomOptions ro = new RoomOptions();
ro.MaxPlayers = 20; // 룸에 입장할 수 있는 최대 접속자 수
ro.IsOpen = true; // 룸의 오픈 여부
ro.IsVisible = true; // 로비에서 룸 목록에 노출시킬 여부
// 룸 생성
PhotonNetwork.CreateRoom("My Room", ro);
}
// 룸 생성이 완료된 후 호출되는 콜백 함수
public override void OnCreatedRoom() {
Debug.Log("Created Room");
Debug.Log($"Room Name = {PhotonNetwork.CurrentRoom.Name}");
}
// 룸에 입장한 후 호출되는 콜백 함수
public override void OnJoinedRoom() {
Debug.Log($"PhotonNetwork.InRoom = {PhotonNetwork.InRoom}");
Debug.Log($"Player Count = {PhotonNetwork.CurrentRoom.PlayerCount}");
foreach (var player in PhotonNetwork.CurrentRoom.Players) {
Debug.Log($"{player.Value.NickName} , {player.Value.ActorNumber}");
}
}
}
'유니티게임강좌 > 포톤클라우드 네트워크' 카테고리의 다른 글
[포톤클라우드] RPC를 활용한 총 발사 로직 (0) | 2023.04.05 |
---|---|
[포톤클라우드] 주인공 캐릭터의 네트워크 기능 구현 (0) | 2023.04.03 |
[포톤클라우드] 포톤 서버 접속 (0) | 2023.03.28 |
[포톤클라우드] 포톤 프로젝트 설정 (0) | 2023.03.28 |
[포톤클라우드] 시네머신을 활용한 카메라 컨트롤 (0) | 2023.03.28 |