今回は下記の続きで、他人が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を選びます。
2. リクエストを処理するスクリプトをアタッチする
送られたリクエストは、IPunOwnershipCallbacks.OnOwnershipRequest
で処理されます。
下記スクリプトを作成し、Cubeプレハブにアタッチします。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
namespace MRTKPhotonTest
{
<summary>
</summary>
[RequireComponent(typeof(PhotonView))]
public class ManageOwnership : MonoBehaviour, IPunOwnershipCallbacks, IPunObservable
{
PhotonView photonView;
<summary>
</summary>
private bool changeableOwner = true;
void Start()
{
photonView = this.GetComponent<PhotonView>();
if (photonView == null)
{
this.enabled = false;
}
}
<summary>
</summary>
void OnEnable()
{
PhotonNetwork.AddCallbackTarget(this);
}
<summary>
</summary>
void OnDisable()
{
PhotonNetwork.RemoveCallbackTarget(this);
}
<summary>
</summary>
<param name="value"></param>
public void ChangeOwnerShipState(bool value)
{
if(photonView.IsMine)
{
changeableOwner = value;
}
}
<summary>
</summary>
<param name="targetView"></param>
<param name="requestingPlayer"></param>
public void OnOwnershipRequest(PhotonView targetView, Player requestingPlayer)
{
if (changeableOwner)
{
targetView.TransferOwnership(requestingPlayer);
Debug.Log("権限取得要請");
}
else
{
Debug.Log("権限取得不可");
}
}
<summary>
</summary>
<param name="targetView"></param>
<param name="requestingPlayer"></param>
public void OnOwnershipTransfered(PhotonView targetView, Player requestingPlayer)
{
}
<summary>
</summary>
<param name="targetView"></param>
<param name="requestingPlayer"></param>
public void OnOwnershipTransferFailed(PhotonView targetView, Player requestingPlayer)
{
}
<summary>
</summary>
<param name="stream"></param>
<param name="info"></param>
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
if (stream.IsWriting)
{
stream.SendNext(changeableOwner);
}
else
{
changeableOwner = (bool)stream.ReceiveNext();
}
}
}
}
ChangeOwnerShipState()
で操作権限の移譲可否を設定します。
IPunObservable.OnPhotonSerializeView
では、ストリームとしてchangeableOwner
の値を送受信することで他のユーザと値を共有しています。
スクリプトをcubeプレハブにアタッチした後、Object Manipulator
のManipulation Eventsに下記画像のように設定します。
移動開始時に権限を取得し、操作中は権限移譲可否をfalseにしています。
3. 動作確認
動作確認の様子は以下の通りです。
前回と異なり、両方のユーザがオブジェクトを操作できています。
Unity Editor側ではPhoton View
のIsMine
が操作する人によってtrue, falseに代わっていることがわかります。
また、一方の人が操作中は権限委譲されず、オブジェクトの移動もできないようになっています。
ChangeOwnerShipState()
を操作したり、改造することで、操作権限を与えるか否かを自由に操作できるようになります。