Photon을 사용하는 다른 두 항목 간에 통신 불능 현상이 발생했습니다.

8809 단어 UnityPhoton

개요


Photon Realtime을 사용하는 두 개의 다른 프로젝트 간에 통신이 이루어졌는데 이상하지만 RPC 통신이 불가능한 현상이 발생했습니다.일치하지 않는지 appIdgameVersionroomName를 확인했지만 모두 일치했습니다.
여기서 우리는 두 항목을 프로젝트 A, 프로젝트 B라고 부른다.
(다양한 상황에서 PUN1 사용)

이벤트


프로젝트 A 사이, 프로젝트 B 사이의 통신 → 가능
프로젝트 A와 프로젝트 B의 통신 → 아니요gameVersionroomName의 설정은 두 항목에서 다음과 같다.
(확인됨 appId 동일)
PhotonNetwork.ConnectUsingSettings("gameVersion");
PhotonNetwork.JoinOrCreateRoom("roomName", ...);

조사


우선 문제를 나누기 위해 기본적인 곳에서 조사를 진행한다.

동일한 서버에 연결할지 확인

PhotonNetwork.countOfPlayers 두 항목이 같은 서버에 연결되었는지 확인합니다.
// プロジェクトAとプロジェクトB
Debug.Log(PhotonNetwork.countOfPlayers) // 1

// プロジェクトAとプロジェクトA
Debug.Log(PhotonNetwork.countOfPlayers) // 2

// プロジェクトBとプロジェクトB
Debug.Log(PhotonNetwork.countOfPlayers) // 2
그 결과 두 항목이 원래 다른 서버에 연결된 것을 발견했다.

통신 내용 확인


Wireshark를 사용하여 실제 발송된 appId 등을 확인합니다.
Filter에 다음 내용을 입력하여 Photon의 통신만 확인할 수 있습니다.
(udp.port == 5055 || udp.port == 5056 || udp.port == 5057 || udp.port == 5058 || udp.port == 843 || udp.port == 943 || udp.port == 4530 || udp.port == 4531 || udp.port == 4532 || udp.port == 4533 || udp.port == 9090 || udp.port == 9091 || udp.port == 9092 || udp.port == 9093 || udp.port == 19090 || udp.port == 19091 || udp.port == 19093 || udp.port == 27000 || udp.port == 27001 || udp.port == 27002 || tcp.port == 5055 || tcp.port == 5056 || tcp.port == 5057 || tcp.port == 5058 || tcp.port == 843 || tcp.port == 943 || tcp.port == 4530 || tcp.port == 4531 || tcp.port == 4532 || tcp.port == 4533 || tcp.port == 9090 || tcp.port == 9091 || tcp.port == 9092 || tcp.port == 9093 || tcp.port == 19090 || tcp.port == 19091 || tcp.port == 19093 || tcp.port == 27000 || tcp.port == 27001 || tcp.port == 27002)
그냥 힘들어서 Photon의 통신 프로토콜을 해석하기로 했어요.
바이너리 프로토콜 Photon의 통신 프로토콜 사양이 있습니다.
또한 AltspaceVR/wireshark-photon-dissecto의 Lua는 프로토콜을 해석할 수 있다.ProtoField.bytes의 매개 변수에 오류가 있습니다. base.HEX의 설명을 삭제합니다.)
Lua 확장 읽기에 대해서는 Wireshark를 사용하여 자신의 패키지 형식을 분석하는 방법 을 참조하십시오.
Lua의 Photon 확장을 읽고 Wireshark에서 확인하면 다음과 같습니다.

이렇게 하면 통신 내용을 볼 수 있지만 가장 중요한 appId을 찾지 못해 포기했다.

업로드 로그 보기

SupportLogger라고 불리는 PUN에 포함된 레코드용 어셈블리를 사용합니다.
이것은 임의의 Game Object에 부착하면 로그를 토합니다.
자세한 내용은 Analyzing Disconnects | Photon Engine를 참조하십시오.
이를 이용해 로그를 확인하고 항목별gameVersion이 다르다는 것을 확인했다.
プロジェクトB
SupportLogger Info: PUN 1.91: AppID: 1*** GameVersion: gameVersion_1.91 ...


プロジェクトB
SupportLogger Info: PUN 1.94: AppID: 1*** GameVersion: gameVersion_1.94 ...

원인

gameVersion의 이유는 끝에 PUN 버전이 부여되어 정확하게 일치하지 않기 때문입니다.
(Photon 공식적으로도 서로 다른 버전의 PUN끼리 통신이 안 된다고 쓰여 있는 것 같은데?)
  • 프로젝트 A: gameVersion_1.91
  • 프로젝트 B:gameVersion_1.94
  • 대책


    이 코드는 NetworkingPeer.cs 의 다음 코드입니다.
    internal class NetworkingPeer : LoadBalancingPeer, IPhotonPeerListener
    {
        /// <summary>Combination of GameVersion+"_"+PunVersion. Separates players per app by version.</summary>
        protected internal string AppVersion
        {
            get { return string.Format("{0}_{1}", PhotonNetwork.gameVersion, PhotonNetwork.versionPUN); }
        }
    
    Restricting joining room with non-matching game version — Photon Engine 대책은 있지만 이 대책은 PUN1에서 사용할 수 없기 때문에 이번에 이 코드를 다음 대책으로 잠시 변경합니다.
    internal class NetworkingPeer : LoadBalancingPeer, IPhotonPeerListener
    {
        /// <summary>Combination of GameVersion+"_"+PunVersion. Separates players per app by version.</summary>
        protected internal string AppVersion
        {
            // TODO: これをコメントアウトして、gameVersion だけ返すようにする
            // get { return string.Format("{0}_{1}", PhotonNetwork.gameVersion, PhotonNetwork.versionPUN); }
            get { return PhotonNetwork.gameVersion; }
        }
    

    RPC 통신 오류


    RPC의 index가 일치하지 않음


    이렇게 하면 일치할 수 있지만 다음과 같은 오류로 RPC 통신에 실패했습니다.
    Could not find RPC with index: 18. Going to ignore! Check PhotonServerSettings.RpcList
    
    RPC의 index가 두 항목에서 일치하지 않기 때문인 것 같습니다.
    아래 링크에서 문제를 제기했지만 해결되지 않은 것 같습니다.
    Could not find RPC with index: 17. Going to ignore! Check PhotonServerSettings.RpcList — Photon Engine
    그러나 두 항목에서 RPC의 index가 완전히 일치하자 이 오류는 순조롭게 사라졌다.
    (다음 이미지는 위의 링크에서 대여하여 병합됨)

    RPC 스크립트의 PhotonViewID 불일치


    index와 관련된 오류가 사라졌지만 이번에는 다음과 같은 오류가 발생했습니다.
    PhotonView with ID 1 has no method "xxx" marked with the [RPC](C#) ... 
    
    RPC 스크립트가 있는 게임 객체에 PhotonView를 첨부해야 합니다.
    부착된 PhotonView에 ViewID를 지정하지만 두 항목이 일치해야 합니다.
    따라서 RPC의 index와 PhotonViewID가 일치하면 다음과 같이 다른 항목 간에 위치 동기화가 확인됩니다!이해가 안 돼

    총결산


    우리는 Photon 엔진이 다른 프로젝트 사이에서 사용되고 싶지 않다는 것을 발견했다.
    이는 RPC가 index와 PhotonViewID에 의존하기 때문임이 분명합니다.
    Photon은 프로젝트를 시작할 때 편리하지만 내부는 블랙박스가 병목이다.
    온라인 동기화는 단독으로 설치하는 것이 좋고, 일본어로 충실한 단비트를 지원하는 것이 좋다.

    좋은 웹페이지 즐겨찾기