소개

Photon Unity Networking (PUN)은 멀티플레이어 게임용 유니티 패키지입니다. 유연한 매치메이킹을 통해 플레이어들은 객체들이 네트워크를 통해 동기화될 수 있는 룸으로 이끌어 줍니다. RPC, 사용자 정의 속성 또는 "저 수준" Photon 이벤트들은 이 기능의 일부입니다. 빠르고 (선택적으로) 신뢰할 수 있는 커뮤니케이션은 전용 Photon 서버를 통해 이루어지므로 클라이언트들은 1 대 1 연결이 필요하지 않습니다.

PUN 기본적으로 Unity가 지원하는 모든 플랫폼으로 엑스포트되며 다음 두 가지 옵션이 있습니다:

PUN FREE

PUN FREE 다양한 데모, 사전 구축된 스크립트와 참조 문서가 있는 무료 패키지. 기본적으로 모든 플랫폼에 엑스포트.

PUN 2 FREE 받기

PUN PLUS>

PUN FREE Unity Plugin PUN FREE와 동일한 컨텐츠, 추가적으로 Photon Cloud 100명 동시접속 사용자 플랜(약. 40k MAU, 60개월 유효).

Get PUN 2 PLUS

PUN의 구조

일반적으로 PUN 패키지의 구조에 대해서는 신경 쓸 필요가 없으나, 다음과 같이 이루어져 있습니다. PUN 패키지는 다음 세 가지 API 레이어로 구성되어 있습니다.

  • 최상위 레벨은 PUN 코드로, 네트워크 객체, RPC 등과 같은 Unity의 기능을 구현합니다.
  • 두 번째 레벨은 Photon 서버, 매칭메이킹, 콜백 등과 관련된 로직이 포함되어 있습니다. 이 레벨은 실시간 API입니다. 이것 자체를 사용할 수 있습니다. PUN과 실시간 API(LoadBalancing API로 알려져 있는) 간에 주제가 많이 겹치는 것을 볼 수 있지만 괜찮습니다.
  • 가장 낮은 레벨은 DLL 파일들로 이루어져 있으며, 직렬화/비직렬화, 프로토콜등과 같은 것으로 구성되어 있습니다.

Back To Top

시작하기

PUN을 최대로 활용하려면 일부 프로그래밍을 해야 합니다. 이 페이지에서는 몇 가지 중요한 코드 일부를 개략적으로 살펴보겠습니다.

올바르게 시작하려면, "PUN 기본 자습서"를 진행하십시오.

Back To Top

연결과 콜백

ConnectUsingSettings은 즉시 온라인 상태로 만들어줍니다: 이 함수는 PhotonServerSettings 에셋에서 모든 중요한 설정내용들을 가져와 처리합니다.

PhotonNetwork.ConnectUsingSettings();

PUN은 콜백을 사용하여 클라이언트가 언제 연결을 설정했는지, 룸에 참여했는지 등을 알려줍니다.

예:IConnectionCallbacks.OnConnectedToMaster.

편의를 위해 PUN에는 MonoBehaviourPunCallbacks MonoBehaviour가 있습니다. 이것은 중요 콜백 인터페이스를 구현하고 자동으로 등록하므로 사용자는 콜백 인터페이스를 상속하여 특정 콜백 메소드를 재정의할 수 있습니다.

    // ...
    public class YourClass : MonoBehaviourPunCallbacks
    {
        // ...
        public override void OnConnectedToMaster()
        {
            Debug.Log("OnConnectedToMaster() was called by PUN.");
            PhotonNetwork.JoinRandomRoom();
        }
        // ...
    }
    // ...

클래스에서 선택적으로 IConnectionCallbacks 을 구현하고 PhotonNetwork.AddCallbackTarget 를 통해 콜백용으로 인스턴스를 등록합니다.

Back To Top

매치메이킹

OnConnectedToMaster 내에서 기존에 있는 룸에 참여하거나 룸을 생성할 수 있습니다. 다음 코드는 게임을 시작하거나 참여하기 위한 메소드 가능한 호출을 나타냅니다.

    // Join room "someRoom"
    PhotonNetwork.JoinRoom("someRoom");
    //Fails if "someRoom" is not existing, closed or full. Error callback: IMatchmakingCallbacks.OnJoinRoomFailed
    // Tries to join any random game:
    PhotonNetwork.JoinRandomRoom();
    //Fails if there are no open games. Error callback: IMatchmakingCallbacks.OnJoinRandomFailed
    // Create this room.
    PhotonNetwork.CreateRoom("MyMatch");
    // Fails if "MyMatch" room already exists and calls: IMatchmakingCallbacks.OnCreateRoomFailed

친구들이 같이 플레이하기를 원하고 PUN 외부(Photon Chat 페이스북 등)에서 소통할 방법을 가지고 있을 때, 룸 이름을 만들어 JoinOrCreateRoom 을 사용할 수 있습니다. 이 룸에 매치되는 플레이어가 아무도 없어야한다면, 매치메이킹에서 보이지 않도록 하십시오.

    RoomOptions roomOptions = new RoomOptions();
    roomOptions.IsVisible = false;
    roomOptions.MaxPlayers = 4;
    PhotonNetwork.JoinOrCreateRoom(nameEveryFriendKnows, roomOptions, TypedLobby.Default);

JoinOrCreateRoom 을 통해, 룸은 필요시 생성되므로 누가 먼저인지는 문제되지 않습니다. 만약 룸이 가득찼다면 IMatchmakingCallbacks.OnJoinRoomFailed 가 호출됩니다(구현하고 어디인가 등록해놓았다면)

매치메이킹에 대해서는 당사의 지침서를 읽어 주십시오.

Back To Top

게임 로직

GameObject들은 PhotonView 컴포넌트에서 "networked GameObjects" 로써 인스턴스화될 수 있습니다. 객체와 소유자(또는 컨트롤러)를 식별합니다. 제어를 하고 있는 플레이어가 다른 모든 사용자를 업데이트합니다.

전형적으로, PhotonView를 프리팹에 추가하여 Observed 컴포넌트를 선택하고 인스턴스 생성을 위해 PhotonNetwork.Instantiate 를 사용할 수 있을 것 입니다.

PhotonView 의 Observed 컴포넌트는 초당 몇 회의 네트워크 객체 상태의 쓰기(그리고 읽기)에 책임을 갖고 있습니다. 이렇게 하기 위해서는, 스크립트는 반드시 OnPhotonSerializeView를 정의하는 IPunObservable을 구현해야 하는데, 다음과 같습니다:

    // used as Observed component in a PhotonView, this only reads/writes the position
    public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.IsWriting)
        {
            Vector3 pos = transform.localPosition;
            stream.Serialize(ref pos);
        }
        else
        {
            Vector3 pos = Vector3.zero;
            stream.Serialize(ref pos);  // pos gets filled-in. must be used somewhere
        }
    }

클라이언트는 특정 네트워크 객체상에 때로 발생하는 모든 것에 대하여 원격 프로시져 호출을 할 수 있습니다.

    // defining a method that can be called by other clients:
    [PunRPC]
    public void OnAwakeRPC(byte myParameter)
    {
        //Debug.Log(string.Format("RPC: 'OnAwakeRPC' Parameter: {0} PhotonView: {1}", myParameter, this.photonView));
    }
    // calling the RPC somewhere else
    photonView.RPC("OnAwakeRPC", PhotonTargets.All, (byte)1);

GameObjects와는 별개로, 나만의 이벤트를 전송할 수도 있습니다:

    PhotonNetwork.RaiseEvent(eventCode, eventContent, raiseEventOptions, SendOptions.SendReliable);

PUN의 RPC와 RaiseEvent에 대해 더 알아보기를 읽어주십시오.

Back To Top

데모와 자습서

PUN 패키지에서, 재사용 또는 분석하여 다시 사용할 수 있는 몇 개의 데모와 유용한 스크립트를 찾을 수 있습니다.

올바르게 시작하려면, "PUN 기본 자습서" 를 잘 읽어 보고 코드를 잘 분석해 보십시오.

기술문서 TOP으로 돌아가기