夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

UnityPhotonで複数人で同期するスクリプトを描く

本日はUnity勉強枠です。

Unityでは複数人でのオブジェクトの同期やオンラインゲームの実装を簡単に行えるパッケージとしてPhotonがあります。

Photonを使用することで複数のHoloLensで同一のオブジェクトを同期させて操作することができます。

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

今回は自前のコードを同期させて同じタイミングで関数が発火されるようにします。

〇PunRPC

Photonを使用して自作の処理を同期させる方法はいくつかありますが、ここではPunRPCを使用していきます。

RPCとはRemote Procedure Callの略でネットワーク越しにプログラムを呼び出すことを指します。

つまりPunRPCとはPhotonのネットワーク上でプログラムを呼び出すことを意味します。

使い方はアトリビュートのように使います。

 [PunRPC]
    void PhotonEvent()
    {
              this.gameObject.SetActive(false);
    }

[PunRPC]をつけた関数はPhotonViewコンポーネント、GenericNetSyncコンポーネントをアタッチし同期しているオブジェクトで呼び出すことで、同期している相手にも同様の処理を実行します。

上記の例ではお互いのオブジェクトをディアクティブ化します。

〇関数の呼び出し方

[PunRPC]をつけた関数はただ呼び出すだけでは同期することができません。

任意の関数で以下のように呼び出します。

  PhotonView photonView;
    public void PhotonEventOn()
    {
        photonView.RPC(nameof(PhotonEvent), RpcTarget.All);
    }

PhotonViewコンポーネントはPhotonでオブジェクトを共有する際に各オブジェクトにアタッチするコンポーネントです。

第一引数で呼び出すコンポーネント、第二引数では共有方法を指定します。

共有法とは次のようになります。

実行する対象 送信者自身 途中参加者
RpcTarget.All 実行される 実行されない
RpcTarget.Others 実行されない 実行されない
RpcTarget.AllBuffered 実行される 実行される
RpcTarget.OthersBuffered 実行されない 実行される
RpcTarget.AllViaServer 通信を介して実行 実行されない
RpcTarget.AllBufferedViaServer 通信を介して実行 実行

上記の例ではAllを指定しているため自分自身と通信相手で実行され、途中参加者は実行されない状態になります。

zenn.dev

Photon通信中にこれを呼び出すことで同じ処理を実行することができます。

HoloLensのMRTKで使用する場合はPressableButtonHoloLens 2などのボタンUIのInteractionコンポーネントでPhotonEventOnを呼び出すことでボタンを押したタイミングで通信相手も実行されるようになります。