Unity Engine/Unity Server

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

Muru 2023. 12. 5. 15:54

 

 

서버에 연결하고 이름을 설정하며, 방을 생성하고, 참여할수있도록 해보자.


닉네임 설정

//서버에 연결하기 전에 닉네임을 설정하는 단계입니다.
===================================================

//닉네임을 입력할 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를 선언해 멀티플레이어 상호작용에 참여할수있도록하였습니다.