Photon Engine

[Unity Photon] 공부 1(로비)

때류기 2023. 10. 20. 23:24

안녕하세요.

게임에서 네트워크가 가능한 게임을 만들기 위해서는 서버가 필요합니다.

네트워크를 쉽게 유니티에 적용 할 수 있는 솔루션인 포톤에 대해 배워볼까 합니다.

 

 

정보 출처: https://doc.photonengine.com/ko-kr/pun/current/demos-and-tutorials/pun-basics-tutorial/lobby

 

1 - 로비 | Photon Engine

우선 이 튜토리얼의 핵심인 Photon 클라우드 서버에 connect하는 것과 룸에 참가 또는 필요시 생성에 대한 것을 알아 보겠습니다. 새로운 씬을 생성하여 Launcher.unity로 저장합니다. 새로운 C# 스크립

doc.photonengine.com

 

 

첫 단계로 포톤 클라우드 서버에 connect하는 것과 서버 로비에 참가 또는 필요시 생성에 대한 것을 알아보겠습니다!

using UnityEngine;
using Photon.Pun;
using Photon.Realtime;


//namespace는 필수는 아니나 다른 에셋과 개발자의 코드와의 충돌을 방지하기위해 사용
namespace Com.MyCompany.MyGame
{

    //MonoBehaviourPunCallbacks
    //.photonView와 PUN이 호출할 수 있는 모든 콜백 / 이벤트를 제공하는 클래스.
    //클래스에서 제공하는 이벤트 / 메서드를 재정의하여 사용
    public class Launcher : MonoBehaviourPunCallbacks
    {
        //게임 버전을 나타내는 변수
        //이미 출시되어 프로젝트에 큰 변경사항이 있을 때 까진 "1"을 유지
        private string _gameVersion = "1";

        //방의 최대 입장인원
        [SerializeField] private byte _maxPlayerPerRoom = 4;


        private void Awake()
        {
            //이 값이 true일 때 MasterClient는 PhotonNetwork.LoadLevel()을
            //호출 가능하며 모든 연결된 플레이어들은 동일한 레벨을 자동적으로 로드 가능
            PhotonNetwork.AutomaticallySyncScene = true;
        }

        private void Start()
        {
            Connect();
        }


        public void Connect()
        {
            //포톤 네트워크와 연결이 됬을 경우 true, 연결되지 않았을 경우 false를 반환
            //만약 포톤 네트워크와 연결되었을 경우?
            if (PhotonNetwork.IsConnected)
            {
                //현재 사용되는 로비의 입장 가능한 방에 참여. 입장 가능한 방이 없으면 실패 
                //입장 성공시 OnJoinedRoom함수 호출
                //입장 실패시 OnJoinRandomFailed함수 호출
                PhotonNetwork.JoinRandomRoom();
            }
            //연결되지 않았을 경우
            else
            {
                //게임 버전을 설정한다.
                PhotonNetwork.GameVersion = _gameVersion;

                //Photon Editer에 설정된 값대로 서버 접속을 시작하는 지점
                //접속에 성공하면 OnConnectedToMaster 함수 호출(콜백)
                PhotonNetwork.ConnectUsingSettings();
            }
        }

        //MonoBehaviourPunCallbacks의 함수
        //클라이언트가 마스터 서버에 연결되어 작업을 수행할 준비가 되면 호출
        //PhotonNetwork.ConnectUsingSettings()로 서버 접속이 성공하면 이 함수 호출
        public override void OnConnectedToMaster()
        {
            Debug.Log("서버 접속 성공!");

            //현재 사용되는 로비의 입장 가능한 방에 참여. 입장 가능한 방이 없으면 실패 
            //입장 성공시 OnJoinedRoom함수 호출
            //입장 실패시 OnJoinRandomFailed함수 호출
            PhotonNetwork.JoinRandomRoom();
        }

        //MonoBehaviourPunCallbacks의 함수
        //서버와의 연결이 끊은 후 호출
        //PhotonNetwork.Disconnect()가 성공하면 호출
        public override void OnDisconnected(DisconnectCause cause)
        {
            Debug.LogWarningFormat("서버연결 끊어짐!{0}", cause);
        }

        //MonoBehaviourPunCallbacks의 함수
        //PhotonNetwork.JoinRandomRoom()로 방 참가가 실패하면 호출
        public override void OnJoinRandomFailed(short returnCode, string message)
        {
            Debug.Log("랜덤 매칭 실패!");

            //방을 생성하는 함수
            //변수목록( roomName = 방의 이름, RoomOptions = 최대 입장 가능 인원, 초기 사용자 정의, 룸 속성등을 설정 가능
            //RoomOptions의 자세한 설명 https://doc-api.photonengine.com/en/pun/v1/class_room_options.html
            //typedLobby = null인 경우 룸은 형재 사용되는 로비에 자동 생성[명시하지 않은 경우 "default"]
            PhotonNetwork.CreateRoom("방 이름", new RoomOptions {MaxPlayers = _maxPlayerPerRoom});
        }

        //MonoBehaviourPunCallbacks의 함수
        //방에 참가하면 호출
        //PhotonNetwork.CreateRoom(), PhotonNetwork.JoinedRoom()이 성공하면 호출
        public override void OnJoinedRoom()
        {
            Debug.Log("방 접속 성공!");
        }
    }
}

포톤 서버에 접속 후 랜덤한 방에 접속 시도를 하고 접속가능한 방이 없을 경우 방을 생성하는 클래스의 코드입니다.

 

 

 

'Photon Engine' 카테고리의 다른 글

[Unity Photon] 공부 3(게임 씬)  (0) 2023.10.24
[Unity Photon] 공부 2(로비 UI)  (0) 2023.10.22