Unity+Photon Realtime로 온라인 게임 만들기

13370 단어 PhotonUnity

개요


Unity 온라인 게임에 사용되는 클라우드 엔진 Photon Realtime를 사용합니다.
살짝 사용한 느낌으로 좋은 인상을 주었어요.
자세한 내용은 공식 문서를 참조하십시오.
다만, 공식은 가벼워 Qita, 트위터, 영어 블로그 등을 중심으로 검색하는 것이 좋다.
Photon에서 모델을 공유할 때 클라이언트 실행 파일에 해당 모델이 미리 존재하지 않으면 이 모델을 표시하지 않습니다. 따라서 가상 업로드 등 기능을 실현할 때 외부에서 가상 이미지를 다운로드하는 처리를 설치해야 합니다.

가족 구성원


이름:
기능
PhotonRealtime
MO와 MMO를 향해서.
PhotonTurnbased
라운드 게임의 특화판
PhotonChat
특히 채팅 기능은 비용도 싸다
PhotonVoice
음성 채팅 기능 제공

견본




개발 프로세스


  • PhotonRealtime 등록
  • AsseetStore에서 SDK(Photon Unity Networking, 2가 아닌 쪽) 가져오기(Demo의 선택 취소)
  • SDK 설정
  • AppID
  • 입력
  • 영역의 설정(JP 가능)
  • Auto-Join Lobby 및 Enable Lobby Stats 검사
  • 동기화된 GameObject에 Photon Transform View 및 Photon View 구성 요소 도입
  • Photon Transform View 설정
  • Photon View의 Observed Components에 Photon Transform View
  • 설정
  • 동기식 객체를 사전 세트로 만듭니다
  • .
  • 서버나 방에 연결된 스크립트를 설명하고 Empty GameObject
  • 에 추가
    기본적으로 상술한 절차다.
    SDK 설정은 Photon Unity Networking/Resources/PhotonServerSettings.asset부터 시작할 수 있습니다.
    동기화 대상의 처리에는 아직 약간의 실험이 필요하다.
    Photon Realtime는 아마도 온라인으로 GameObject의 좌표와 회전을 공유할 수 있을 것 같습니다.

    서버와 방에 연결하는 절차 정보


    소스 코드 보면서 자세히 봐.
    기본적으로PhotonNetwork류에 필요한 방법은 정태적으로 정의되었다.
    게임할 때의 절차는 대략 다음과 같다.
  • 서버에 연결
  • 로비 입장
  • 방에 들어가기(방이 없으면 만들어서 들어간다)
  • 동기화 대상 읽기(동기화 대상의 조작 모드 63;)
  • 1-3의 절차는 공통적이고 4의 절차는 매우 중요하다.
    모든 절차의 세부 사항은 원본 코드를 참조하십시오.

    애니메이션 동기화하기


    Photon에서의 애니메이션 동기화는 Photon Animatior View의 Component를 통해 수행할 수 있습니다.
    Photon은 Animatior Parameter를 공유할 수 있는 메커니즘을 마련했습니다.
    책은 코드로 이루어지는 방법이 있지만 이쪽은 Component로 코드를 숨기는 것이 비교적 쉽다.
    사용 방법은 다음과 같다.
  • 사전 설정 Animatior
  • 객체의 GameObject에 Photon Animatior View
  • 추가
  • Photon View에 Observed Component D&D
  • Photon Animatior View의 Synchronize Parameters
  • 설정
    또한 대상의 GameObject에서 Update 메서드의 처음에 다음 코드를 추가합니다.
    이렇게 하면 자신의 캐릭터Update()의 내용만 반영할 수 있다.
    또한 이렇게 하지 않으면 애니메이션이 동기화되지 않을 수도 있습니다.
    void Update() {
        if (!(photonView.isMine)) return;
        ...
    }
    
    애니메이션에 대한 자세한 내용은 아래 링크와 책을 참조하십시오.
  • [Photon Cloud] Photon AnimatiorView를 통해 Animator 동기화
  • 유닛을 Photon Cloud로 구동해 주세요.
  • Photon Unity Networking 시도
  • PhotonAnimatorView Class Reference
  • 음성 채팅을 해야 돼요.


    샘플: https://github.com/kawashi/PhotonVoiceExample
    이것 그렇게 하면 금방 할 수 있어요.
    단계는 다음과 같습니다.
  • PhotonVoice 어플리케이션 등록
  • PUN 및 Photon Voice
  • 도입
  • 사운드가 나는 GameObject에 Photon Voice Recorder 및 Photon View
  • 추가

    클라이언트에 메시지 보내기


    PhotonView가 있는 GameObject에 메시지를 보낼 때는 RPC를 사용하는 것이 좋습니다.
    예컨대 라거에 있는 위치 정보만 있을 경우 판정 등이 잘 동기화되지 않아 RPC를 사용해 판정했다고 공지했다.
    RPC는 PhotonView를 소유한 모든 GameObject의 스크립트를 통해 수신할 수 있습니다.
    RPC를 처리할 때 ViewID를 사용하면 PhotonView가 있는 GameObject만 인식할 수 있습니다.
    (ViewID는 PhotonNetwork.Instantiate에서 생성한 GameObject에 고유하게 할당됩니다.)
    예:
    void OnCollisionEnter(Collision other) {
      photonView.RPC("OnCollisionRPCFunction", PhotonTargets.All, photonView.viewID);
    }
    
    [PunRPC]
    void OnCollisionRPCFunction(int viewID) {
      if ( photoView.viewID == viewID ) {
        Debug.Log("自分と同一のviewIDからRPCメソッドが呼ばれた!");
      }
    }
    
    PhotonTargetsEnums.cs는 다음과 같이 정의됩니다.
    Enum.cs
    /// <summary>Enum of "target" options for RPCs. These define which remote clients get your RPC call. </summary>
    /// \ingroup publicApi
    public enum PhotonTargets
    {
        /// <summary>Sends the RPC to everyone else and executes it immediately on this client. Player who join later will not execute this RPC.</summary>
        All,
        /// <summary>Sends the RPC to everyone else. This client does not execute the RPC. Player who join later will not execute this RPC.</summary>
        Others,
        /// <summary>Sends the RPC to MasterClient only. Careful: The MasterClient might disconnect before it executes the RPC and that might cause dropped RPCs.</summary>
        MasterClient,
        /// <summary>Sends the RPC to everyone else and executes it immediately on this client. New players get the RPC when they join as it's buffered (until this client leaves).</summary>
        AllBuffered,
        /// <summary>Sends the RPC to everyone. This client does not execute the RPC. New players get the RPC when they join as it's buffered (until this client leaves).</summary>
        OthersBuffered,
        /// <summary>Sends the RPC to everyone (including this client) through the server.</summary>
        /// <remarks>
        /// This client executes the RPC like any other when it received it from the server.
        /// Benefit: The server's order of sending the RPCs is the same on all clients.
        /// </remarks>
        AllViaServer,
        /// <summary>Sends the RPC to everyone (including this client) through the server and buffers it for players joining later.</summary>
        /// <remarks>
        /// This client executes the RPC like any other when it received it from the server.
        /// Benefit: The server's order of sending the RPCs is the same on all clients.
        /// </remarks>
        AllBufferedViaServer
    }
    
    별말씀이지만 cluster가 이 메시지 동기화에 이용했을 수도 있습니다. MQTT
    참조 링크
    - RPC 및 RaiseEvent | Photon Engine
    - 유닛에서 게임을 만드시는 분들은 꼭 보세요!클러스터의 Unity 엔지니어는 "클러스터의 매력과 VR×Unity 작업 | cluster's Blog

    공유 속성


    Photon에서 모든 클라이언트에서 속성을 공유할 수 있습니다.
    속성의 설정은 다음과 같습니다.
    var properties = new ExitGames.Client.Photon.Hashtable();
    properties.Add ("プロパティ名", );
    PhotonNetwork.room.SetCustomProperties (properties);
    
    또한 획득 속성은 다음과 같다.
    (속성이 없는 경우NullReferenceException)
    (型名)PhotonNetwork.room.CustomProperties ["プロパティ名"]
    
    참조 URL: https://qiita.com/mo4_9/items/f43606875c8b198fb145

    다른 유저의 새로운 연결 탐지


    다음 방법을 정의하면 새 유저를 검출할 수 있습니다.
    void OnPhotonPlayerConnected(PhotonPlayer player) {
        // ...
    }
    

    주의점

  • 로그인 즉시 모든 Object를 초기 위치에 순식간에 구성하므로 평균 판정
  • 이 발생할 수 있음
  • 상대방이 생성한 Object의 스크립트도 이동을 잊어버려서 오류가 발생할 수 있음
  • 라그에서 편차가 있다고 판정하여 오류가 발생하였으며, 평균 판정에서의 처리는 RPC
  • 를 사용하는 것이 가장 좋다.
  • 로그인 후 상대방의 Object가 존재하지 않기 때문에 Object를 참조할 때 Invoke에서 몇 초 기다립니다
  • 메인 고객이라는 개념을 채택한 상황에서 메인 클라이언트가 차단될 때 인수인계 처리를 해야 한다(공식적인 메커니즘이 있는 것 같다...)
  • PhotonNetwork.Instantiate 캐시를 남기고 PhotonNetwork.Destroy 삭제하지 않으면 캐시를 남길 수 있습니다(단, 삭제는 소유자가 해야 합니다MonoBehaviour.Destroy 안 됩니다)
  • Photon 관련 URL

  • 제휴 및 대전 게임을 지원하는 포토의 최신 정보, 메카임 현지에 대응하는 PUN의 실력
  • PUN에서 Animatior가 포함된 동기화 객체 - Qiita 동적 동기화
  • Photon으로 객체를 전송하는 방법으로 IPunProefabPool과 UniRx를 조사합니다.Toolkit.ObjectPool의 개체 풀을 사용한 샘플 - Qita
  • [WIP] PUN의 통신 9할-Qiita
  • [Unity] 저도 Photon#05 방에서 오는 걸 쓰고 싶어요.
  • [Photon Cloud] Photon Transform View에서 Transform의 동기화 - Qita
  • 좋은 웹페이지 즐겨찾기