PUN Classic(PUN1이라고도 불립니다)은 PUN의 첫 버전입니다.         현재는 리팩토링 및 기능 확장에 의해 PUN2로 새롭게 바뀌었습니다.          새 프로젝트에는 PUN2를 이용해 주시고, 기존의 프로젝트도 가능하면 PUN1에서 PUN2로 옮기는 것을 권장합니다.  자세한 내용은: "마이그레이션 노트". PUN Classic은 곧 점검이 시작됩니다.        중요한 버그의 수정과 Unity의 신버전의 지원 등을 예정하고 있습니다. 신기능의 추가는 PUN2에서만 이루어지므로 주의해 주십시오.

소유권(Ownership) 양도

이 데모는 이해하기 까다로운 PUN의 기능 이해를 위한 도와드리는 곳 입니다. 간단하게 말하면 소유권 양도는 네트워크 객체의 제어권을 전달 하도록 하는 것입니다. 여기에서는 이 기능을 어떻게 사용하고 배경지식과 복잡한 경우에 어떻게 처리하는지 보여 드립니다.

이 데모에서는 누구나 객체를 생성 할 수 있습니다. 클릭하면 소유권 양도가 요청 됩니다. 현재 소유자는 소유권을 양도하거나 양도요청을 거부할 수 있습니다. 각 객체위의 포인터 표시는 누가 현재 소유(제어)하고 있는 지를 나타냅니다.

Screenshot of Ownership Demo Scene
Ownership 데모

기본

PUN 의 모든 객체는 하나의 클라이언트에 의해서만 제어 됩니다. 클라이언트가 무엇인가의 인스턴스를 생성 할 때 생성된 객체의 소유자는 이 클라이언트 입니다. 오직 이 클라이언트만이 PhotonView.isMine 값이 true 이고 OnPhotonSerializeView을 사용할 때는 이 클라이언트만 PhotonStream에 쓸 수 있습니다. 다른 클라이언트들은 수신하고 갱신만 가능합니다.

게임오브젝트에 대한 제어권을 다른 클라이언트로 넘겨주고 싶을 경우에는 우선 PhotonView에서 설정을 해 줘야 합니다.

Screenshot of PhotonView Ownership Setting
PhotonView Ownership Setting

인스펙터에서 게임오브젝트의 오너(런타임이 있는 프리팹만 가능)를 볼 수 있습니다. 동일 선상에서 Fixed 의 기본값으로 설정된 것을 찾을 수 있습니다. 다른 옵션은 TakeoverRequest 입니다.

  • "Fixed" 는 게임오브젝트를 생성한 것이 지속적으로 소유자로 유지 되는 것입니다.
  • "Takeover" 다른 클라이언트가 현재 오너로 부터 소유권을 가져갈 수 있도록 합니다.
  • "Request" 현재 오너에게 소유권을 요청 할 수 있으나 거절 될 수 있는 것 입니다.

Back To Top

PhotonView 설정

"OwnershipSphere" 를 선택하여 TakeOver 로 설정 되어 있는지 확인 해 봅니다. 씬에서 한번만 사용 될 수 있습니다. 이렇게 하면 "scene object"의 소유권을 누구라도 아무 때나 가져갈 수 있습니다.

"OwnershipCube" 프리팹은 Request 로 설정되어 있어 현재 소유자가 소유권을 전달 또는 거절 할 수 있습니다. 이 데모에서는 설정을 토글 하기 위해서 실행시에 우측 상단에 버튼이 추가 됩니다.

소유권 설정은 게임오브젝트의 라이프타임에 영향을 주지 않습니다. 기본적으로 게임오브젝트들은 생성자가 방을 나갈 때 소멸되는 것으로 게임오브젝트의 소유자와는 관계가 없습니다!

Back To Top

소유권 요청과 양도

두 개 프리팹에는 OnClickRequestOwnership 가 있습니다. PhotonView 의 게임오브젝트가 클릭되었을 때 스크립트는 this.photonView.RequestOwnership(); 를 PhotonView 의 설정에 관계없이 호출하여 소유권을 요청 합니다.

DemoOwnershipGui는 요청(Request 설정에 대한)에 대한 응답 스크립트 입니다. 이 스크립트는 OnOwnershipRequest() 를 구현 합니다.


    public void OnOwnershipRequest(object[] viewAndPlayer)
    {
        PhotonView view = viewAndPlayer[0] as PhotonView;
        PhotonPlayer requestingPlayer = viewAndPlayer[1] as PhotonPlayer;

        Debug.Log("OnOwnershipRequest(): Player " + requestingPlayer + " requests ownership of: " + view + ".");
        if (this.TransferOwnershipOnRequest)
        {
            view.TransferOwnership(requestingPlayer.ID);
        }
    }
OnOwnershipRequest() 는 씬/게임에서 한번만 사용 해야 합니다.

누군가 소유권을 요청할 때 PUN이 현재 소유자인 클라이언트를 호출 합니다. 보시는 것과 같이 현재 소유자는 view.TransferOwnership(requestingPlayer.ID) 를 호출하여 PhotonView 를 새로운 소유자로 양도 하게 됩니다.

게임 오브젝트의 현재 소유자가 방을 나갈 때, 마스터 클라이언트가 새로운 소유자가 됩니다. 게임 오브젝트를 생성했던 플레이어는 소유권을 회수 하려면 소유권 요청을 해야 만 합니다.

Back To Top

복잡한 상황

소유권 이전 자체만으로는 상대적으로 직관적 입니다. 게임 오브젝트들의 제어는 요청될 수 있으며 이전될 수 있고 현재 소유자가 없어지면 마스터 클라이언트가 소유자가 됩니다.

위에 언급한 대로 게임오브젝트의 라이프타임은 제어권에 대하여 영향은 없습니다. 기본적으로 모든 게임오브젝트는 생성한 플레이어가 룸을 나갈 때 없어지게 됩니다.

Back To Top

RPCs

RPC는 게임오브젝트의 라이프 타임과는 관계가 없습니다. 만약 누군가가 게임오브젝트에 RPC를 사용하고 있다면 인스턴스화 되지 않으며 (버퍼링)RPC는 여전히 참여하고 있는 플레이어들에게 전송 될 수 있습니다.

일부 경우에 있어서 무시될 수 있으나 조심해야 합니다. 그리고 PhotonView 또는 룸을 떠난 플레이어에 대한 이러한 RPC를 제거 할 수 있습니다. PhotonNetwork.RemoveRPCs() 를 살펴 보세요.

Back To Top

씬 객체

플레이어는 현재 제어하고 있는 게임오브젝트를 잃어 버릴 수 있습니다. 참 어처구니 없는 상황일 수 있습니다.

이 상황에 대해서 마스터 클라이언트가 게임오브젝트를 InstantiateSceneObject() 로 인스턴스화하는 것으로 해결할 수 있습니다. 이렇게 하면 마지막 플레이어가 룸을 떠날 때까지 게임오브젝트가 룸에 존재 합니다. 물론 이 게임오브젝트를 제거 할 수 도 있습니다. 마스터 클라이언트가 게임오브젝트를 제어 해야 하는 플레이어에게 소유권을 이전 할 수 있습니다.

대안으로 PhotonNetwork.autoCleanUpPlayerObjects 를 false로 설정하고 룸 이벤트 버퍼를 자동 정리 하지 않게 할 수 있습니다. 이렇게 하면 플레이어가 떠난 경우에도 Photon은 모든 이벤트를 간직 하고 있을 것입니다.

이전의 인스턴스 생성 호출, 버퍼된 RPC를 정리하지 않으면 버퍼가 증가합니다. Long running 게임 (플레이어가 참여하여 오랜 기간 동안 게임)은 수 많은 버퍼화된 이벤트를 통합할 것이며 손상 될 수도 있습니다 (Photon에서는 제한이 없습니다).

기술문서 TOP으로 돌아가기