This document is about: PUN 2
SWITCH TO

PUN Classic (v1), PUN 2, Bolt는 휴업 모드입니다. Unity2022에 대해서는 PUN 2에서 서포트하지만, 신기능의 추가는 없습니다. 현재 이용중인 고객님의 PUN 및 Bolt 프로젝트는 중단되지 않고, 퍼포먼스나 성능이 떨어지는 일도 없습니다. 앞으로의 새로운 프로젝트에는 Photon Fusion 또는 Quantum을 사용해 주십시오.

소개

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 파일들로 이루어져 있으며, 직렬화/비직렬화, 프로토콜등과 같은 것으로 구성되어 있습니다.

시작하기

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

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

연결과 콜백

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

C#

PhotonNetwork.ConnectUsingSettings();

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

예:IConnectionCallbacks.OnConnectedToMaster.

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

C#

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

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

매치메이킹

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

C#

    // Join room "someRoom"
    PhotonNetwork.JoinRoom("someRoom");
    //Fails if "someRoom" is not existing, closed or full. Error callback: IMatchmakingCallbacks.OnJoinRoomFailed

C#

    // Tries to join any random game:
    PhotonNetwork.JoinRandomRoom();
    //Fails if there are no open games. Error callback: IMatchmakingCallbacks.OnJoinRandomFailed

C#

    // Create this room.
    PhotonNetwork.CreateRoom("MyMatch");
    // Fails if "MyMatch" room already exists and calls: IMatchmakingCallbacks.OnCreateRoomFailed

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

C#

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

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

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

게임 로직

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

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

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

C#

    // 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
        }
    }

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

C#

    // 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));
    }

C#

    // calling the RPC somewhere else
    photonView.RPC("OnAwakeRPC", RpcTarget.All, (byte)1);

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

C#

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

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

데모와 자습서

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

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

Back to top