본문 바로가기

유니티(Unity)/Unity

[Unity] 유니티 포톤 서버(Photon Unity Networking) - 기본 연결 설정

유니티로 만든 콘텐츠가 네트워크를 지원하게 하려면(멀티플레이가 가능하려면) 서버가 필요합니다. 이러한 서버를 쉽게 구축할 수 있도록 도와주는 유니티 패키지가 있는데, 그것이 바로 Photon Unity Networking 입니다. Photon 클라우드 서버를 제공해 네트워크 환경을 구축할 수 있도록 해주는 패키지입니다. 과정을 차근차근 따라가면서 알아보도록 해보겠습니다!

 


 

새로운 유니티 프로젝트를 생성하고 에셋 스토어를 열어줍니다. 그리고 PUN 2를 검색해서 패키지를 프로젝트에 임포트 해주세요.

 

https://assetstore.unity.com/packages/tools/network/pun-2-free-119922

 

PUN 2 - FREE | 네트워크 | Unity Asset Store

Get the PUN 2 - FREE package from Photon Engine and speed up your game development process. Find this & other 네트워크 options on the Unity Asset Store.

assetstore.unity.com

 

 

임포트를 하시면 아래와 같은 창이 뜨면서 ID나 Email을 입력하라고 나옵니다.

 

 

계정이 없으면 Email을 입력하면 새로 만들어준다고 하니 Email을 입력해줍니다. 메일 주소를 입력한 후 AppId 지정이 끝나면 Setup Project를 눌러 설치를 마칩니다.

 

입력한 메일의 메일함을 확인하시면, 비밀번호를 설정하라는 메일이 하나 와 있습니다.

 

 

하라니까 하죠! SET PASSWORD AND START를 누르시면 바로 비밀번호 설정 사이트로 이동합니다. 설정을 완료하시면 다음과 같이 대쉬보드 화면이 열립니다.

 

아래의 PUN에 있는 App ID가 계속 쓰이게 될 AppID입니다. 

 

유니티로 돌아와서, 이제 Photon 클라우드 서버에 연결하는 작업이 필요합니다. 먼저 GameObject - Create Empty를 눌러서 빈 오브젝트를 생성해줍니다. 저는 이름을 TestNetwork라고 했습니다. 이어서 TestNetwork에 Add Component로 새로운 스크립트를 생성해줍니다. 저는 스크립트의 이름도 TestNetwork로 지정했습니다.

 

 

TestNetwork를 열어서 코드를 편집해줍니다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;

public class TestNetwork : MonoBehaviour
{
    // Awake()는 게임이 시작되기 전에 실행됨. 즉, 가장 먼저 실행 된다.
    private void Awake()
    {
        // 마스터 클라이언트가 PhotonNetwork.LoadLevel()을 호출할 수 있도록 하고,
        // 같은 룸에 있는 모든 클라이언트가 레벨을 동기화하게 함
        PhotonNetwork.AutomaticallySyncScene = true;
    }

    // Start is called before the first frame update
    void Start()
    {
        Connect();
    }

    /// <summary>
    /// 연결 프로세스를 시작.
    /// 이미 연결이 되어있다면, 무작위 룸으로
    /// 연결이 되지 않았다면 다시 연결
    /// </summary>
    public void Connect()
    {
        // 연결 되었는지를 체크해서, 룸에 참여할지 재연결을 시도할지 결정
        if (PhotonNetwork.IsConnected)
        {
            // 랜덤 룸에 접속.
            // 접속에 실패하면 OnJoinRandomFailed()이 실행되어 실패 알림.
            PhotonNetwork.JoinRandomRoom();
        }
        else
        {
            // 서버 연결에 실패하면 서버에 연결 시도
            PhotonNetwork.ConnectUsingSettings();
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

 

위 코드를 계속 수정해 나가면서 글을 이어나가겠습니다.

 

기본적으로 유니티의 클래스는 부모 클래스 MonoBehavior를 상속받아 사용합니다. 스크립트에 주로 사용되는 Awake, Start와 Update 등이 MonoBehavior에 있는 함수입니다. PUN을 편리하게 사용, 관리하기 위해서 이 부모 클래스를 MonoBehaviorPunCallbacks로 변경해줍니다. MonoBehaviorPunCallbacks 클래스에는 PUN에서 호출할 수 있는 모든 콜백 인터페이스와 이벤트가 담겨있습니다. 물론 이 MonoBehaviorPunCallbacks도 MonoBehavior에서 상속받는 클래스입니다!

 

public class TestNetwork : MonoBehaviourPunCallbacks

 

서버 연결과 방 입장을 조금 더 다듬어 보겠습니다.

 

서버에 연결되었는지와 연결이 끊어졌는지를 확인해주는 함수를 불러오겠습니다. MonoBehaviourPunCallbacks에는 이를 판별해주는 함수가 미리 선언되어있습니다. OnConnectedToMasterOnDisconnected입니다. 오버라이딩해 새로 선언해줘도 되고, 있는 그대로를 사용해도 됩니다. (진행하기 전에 미리 using Photon.Realtime을 추가해줘야 합니다.)

 

// 클라이언트가 마스터에 연결되면 호출됨
public override void OnConnectedToMaster()
{
    Debug.Log("클라이언트가 마스터에 연결됨");
    // 마스터에 연결되면 방에 랜덤으로 입장
    PhotonNetwork.JoinRandomRoom();
}

// 클라이언트가 어떤 방식으로든 연결이 끊어지면 호출됨
public override void OnDisconnected(DisconnectCause cause)
{
    Debug.LogWarningFormat("서버와의 연결이 끊어짐. 사유 : {0}", cause);
}

 

서버에 연결이 되었으면 무작위 방에 입장되게 했습니다. 이 과정에서 당연히 오류가 발생할 수 있습니다! 주석에서도 언급되었듯, 방에 입장이 실패하게 된다면 OnJoinRandomFailed가 호출됩니다. 반대로 입장에 성공하면 OnJoinedRoom이 호출이 됩니다.

 

// 랜덤 방 입장에 실패할 경우 호출됨
public override void OnJoinRandomFailed(short returnCode, string message)
{
    Debug.Log("랜덤 방 입장에 실패함. 새로운 방 생성");
    // 랜덤 방 입장에 실패하면 서버 연결이 끊기지 않았다면, 방이 가득 찼거나 방이 없거나이므로 방을 새로 생성
    PhotonNetwork.CreateRoom(null, new RoomOptions());
}

// 방에 입장하면 호출됨 
public override void OnJoinedRoom()
{
    Debug.Log("방 입장 완료");
}

 

기본적인 서버 연결과 방 입장에 대한 코드 작성은 끝났습니다.

 

코드를 다 작성했다면 유니티 씬으로 돌아옵니다.

 

[선택사항?] - 디버깅 레벨 지정하기

더보기

메뉴 바에서 Window - Photon Unity Networking - Highlight Photon Server Settings를 눌러서 PhotonServerSettings 창을 열어줍니다.

 

PhotonServerSettings 창에서 PUN Logging을 찾아 디버깅 레벨을 Full로 변경해줍니다.

 

 

 

에디터 실행을 눌러서 이때까지의 과정을 테스트합니다. 콘솔창의 디버그 메시지의 출력을 확인합니다!

 

 

도중에 인터넷 연결을 끊어 disconnect도 테스트 해봅니다.

 

 


 

[Reference]

https://doc.photonengine.com/ko-kr/pun/current/getting-started/pun-intro