[유니티] 포톤을 이용한 서버연결 및 방 생성

서버에 연결하고 이름을 설정하며, 방을 생성하고, 참여할수있도록 해보자.
닉네임 설정
//서버에 연결하기 전에 닉네임을 설정하는 단계입니다.
===================================================
//닉네임을 입력할 InputField
public TMP_InputField userNameInput;
//연결중임을 알릴 TMP
public TMP_Text buttonText;
public void OnClickConnect()
{
//넣어야하는 닉네임은 무조건 1글자 이상으로 설정
if (usernameInput.text.Length >= 1)
{
//InputField에 넣은 이름을 포톤 이름으로 설정
PhotonNetwork.NickName = usernameInput.text;
//접속중이라고 UI에 표시
buttonText.text = "접속중..."
//실제로 서버에 연결시키기
PhotonNetwork.ConnectUsingSettings();
}
}
OnClickConnect라는 버튼을 호출시에 PhotonNetwork에 정상적으로 연결이 될겁니다. 이제 정사적으로 이동되었는지, 로비로 연결시켜보겠습니다.
using UnityEngine.SceneManagement;
//모노비헤비어를 포톤콜백으로 상속시키며, 특정 이벤트가 생길때 Photon에 자동 호출됩니다.
public class ConnectToServer : MonobehaviourPunCallbacks
{
//..중간 생략
//서버에 연결되었다면 Photon에서 자동으로 호출된다.
public override void OnConnectedToMaster()
{
SceneManager.LoadScene("LobbyScene");
}
}
이제 로비씬으로 전환이됩니다.
로비씬
using Photon.Pun;
using Photon.Realtime;
public class LobbyManager : MonobehaviourPunCallbacks //PunCallbacks추가
{
//방 생성시 입력칸
public TMP_InputField roomInputField;
//실제 방 제목
public TMP_Text roomName;
//화면에 보여질 로비 및 방
public GameObject lobbyPanel;
public GameObject roomPanel;
public void Start
{
//Scene전환후 곧바로 Photon 로비 내부에 접속
PhotonNetwork.JoinLobby();
}
}
기본 세팅은 끝났다. 씬 전환되면 바로 Photon에 접속이 되었다. 이제 방을 생성해보자.
// 서버 연결하는 곳과 마찬가지로 방제목 글자 설정수이다.
if (roomTitleInputField.text.Length >= 2)
{
//생성하려는 방의 이름을 전달
PhotonNetwork.CreateRoom(roomTitleInputField.text);
}
방이 생성은 되겠지만, 심심하다. 옵션을 추가해보자. 옵션은 공식홈페이지 부분을 참고했다.
//옵션을 추가해보자.
if (roomTitleInputField.text.Length >= 2)
{
//1:1게임을 만드므로 2명을 최대로.
PhotonNetwork.CreateRoom(roomTitleInputField.textnew RoomOptions() { MaxPlayers = 2 }));
}
그럼 방에 접속을 해보자.
public override void OnJoinedRoom()
{
roomName.text = "방 제목: " + PhotonNetwork.CurrentRoomName;
//방에 들어왔다면 로비 화면은 꺼준다
lobbyPanel.SetActive(false);
//방 패널은 켜줌
roomPanel.SetActive(true);
}
방이 실제로 생성되는지 확인하기 위하여, 방을 화면에 띄워보도록하자.
방을 만들 네모난 프리팹을 하나 만들어주고, 다음과 같은 스크립트를 만들어준다.
//방 생성
public class GameRoom : Monobehaviour
{
public TMP_Text roomName;
public void SetRoomName(string _roomName)
{
//방제목은 설정한 이름이 되도록
roomName.text = _roomName;
}
}
방 항목이 Scroll View에 표시되도록 List 배열을 만들고, 프리팹을 담을 공간과 생성될 위치도 선언해준다.
//LobbyManager
private List<GameRoom> gameRoomList = new List<GameRoom>();
public GameRoom gameRoomPrefab;
public Transform content;
//...중간 생략
//생성 및 파괴등 방 목록에 변화가 있을때마다 Photon에서 자동으로 호출됨
//매개변수 List<GameRoom>을 통해 방 목록 검색
public override void OnRoomListUpdate(List<GameRoom> roomlist)
{
UpdateRoomList(roomlist)
}
private void UpdateRoomList(List<GameRoom> list)
{
//현재 요소, 목록 전부 삭제
foreach(GameRoom room in gameRoomList)
Destroy(room.gameObjectT);
gameRoomList.Clear();
//업데이트 된 방 항목 보여주기
foreach (GameRoom room in list)
{
//방생성
GameRoom newRoom = Instantiate(gameRoomPrefab, content, Quaternion.identity);
//방 이름 참조
newRoom.SetRoomName(room.Name);
//방 목록에 새로운 방 추가
gameRoomList.Add(newRoom)
}
}
요약하자면, List<GameRoom> gameRoomList에서 방 목록을 들고있게하고, OnRoomListUpdate에서 업데이트를 받을때마다 Photon의 방 목록이 콜백받아 업데이트되는 구조이다. 콜백을 받았다면 삭제 후 방 항목 인스턴스화를 해주는것.

인스턴스화를 받아 방을 생성을 했다면 실제로 다른화면에서는 저렇게 표시가 될겁니다.
GameRoom에서 설정한 TMP_Text이름을 받고, 화면에 gameRoomPrefab이 표시가 되는식으로요. 이제 왼쪽에 프리팹을 클릭하면 방에 접속까지 해봅시다.
//방 프리팹
public class GameRoom : Monobehaviour
{
public TMP_Text roomName;
private LobbyManager lobbyManager;
private void Awake()
{
lobbyManager = FindObjectOfType<LobbyManager>();
}
public void SetRoomName(string _roomName)
{
//방 제목 설정
roomName.text = _roomName;
}
public void OnClickRooms()
{
//버튼 호출: 클릭시 방에 접속
lobbyManager.JoinRoom(roomName.text);
}
}
LobbyManager에서 실제로 JoinRoom 메서드만 만들어주면 됩니다.
// LobbyManager입니다.
public void JoinRoom(string roomName)
{
PhotonNetwork.JoinRoom(roomName);
}

네. 이제 클릭하면 방에 실제로 접속이 되고있습니다. 물론 빌드를 했다는 가정하에 말이죠.
이제 우측아래에 나가기 버튼이 보일텐데, 나가기까지 만들어봅시다.
// LobbyManager입니다.
public void JoinRoom(string roomName)
{
PhotonNetwork.JoinRoom(roomName);
}
public void OnClickLeaveRoom()
{
PhotonNetwork.LeaveRoom();
}
//로컬 사용자 및 클라이언트가 방에서 나갔을때 호출됩니다.
public override void OnLeftRoom()
{
//방은 꺼주고, 로비패널 활성화
roomPanel.SetActive(false);
lobbyPanel.SetActive(true);
}
//멀티플레이 상호작용을 위한 연결
public override void OnConnectedToMaster()
{
PhotonNetwork.JoinLobby();
}
네 완료되었습니다. JoinRoom을 통해 실제로 방에 참여를하고, OnclickLeaveRoom과 OnLeftRoom으로 방을 떠나고 비활성화해줍니다. 이 모든것을 동기화하고 상호작용하기위해 OnConnectToMater를 선언해 멀티플레이어 상호작용에 참여할수있도록하였습니다.