仮想と物理とエトセトラ

xRや物理とかごった煮の備忘録的技術ブログ

Photon(PUN2)での物体操作権限移譲

今回は下記の続きで、他人がSpawnしたオブジェクトを操作する方法です。

xr-physics-work-etc.hatenablog.com

1. PhotonViewの設定をする

まず、PhotonViewの権限移譲に関する設定をします。
前回作成したCubeプレハブの「PhotonView」スクリプト中、OwnerShip Transferを確認します。
OwnerShip Transferには下記の3項目あります。

  • Fixed : 所有者は変更されない
  • Takeover : 誰にでも所有者となれる
  • Request : リクエストを送り、受諾されれば所有者となれる

参考(PUN v1用のページだが共通事項):

doc.photonengine.com

今回は、他人が操作中にオブジェクトの操作できないようにするためにRequestを選びます。

f:id:napo909:20210504151214p:plain

2. リクエストを処理するスクリプトをアタッチする

送られたリクエストは、IPunOwnershipCallbacks.OnOwnershipRequestで処理されます。
下記スクリプトを作成し、Cubeプレハブにアタッチします。

ChangeOwnerShipState()で操作権限の移譲可否を設定します。
IPunObservable.OnPhotonSerializeViewでは、ストリームとしてchangeableOwnerの値を送受信することで他のユーザと値を共有しています。
スクリプトをcubeプレハブにアタッチした後、Object ManipulatorのManipulation Eventsに下記画像のように設定します。
移動開始時に権限を取得し、操作中は権限移譲可否をfalseにしています。

f:id:napo909:20210504165613p:plain

3. 動作確認

動作確認の様子は以下の通りです。
前回と異なり、両方のユーザがオブジェクトを操作できています。
Unity Editor側ではPhoton ViewIsMineが操作する人によってtrue, falseに代わっていることがわかります。

f:id:napo909:20210504173426g:plain

また、一方の人が操作中は権限委譲されず、オブジェクトの移動もできないようになっています。

f:id:napo909:20210504173656g:plain

ChangeOwnerShipState()を操作したり、改造することで、操作権限を与えるか否かを自由に操作できるようになります。