目的
プレイヤー1が発射した弾丸がプレイヤー2に当たったとき、
プレイヤー2が弾丸を削除したい。
手順
プレイヤー1がPhotonNetwork.Instantiateで弾丸を生成する。
弾丸が当たったプレイヤー2のTakeDamageをコールするスクリプトを弾丸にアタッチする。
Bullet.cs
using UnityEngine;
using System.Collections;
public class Bullet : Photon.MonoBehaviour {
var hit = other.gameObject;
void OnTriggerEnter(Collider other) {
if(other.tag == "Player") {
hit.GetComponent<PlayerAvatar> ().TakeDamage (this.gameObject);
}
}
}
isMineで弾丸が当たったプレイヤー2のクライアントでのみ、弾丸を削除するようにしたい。
しかしPhotonNetwork.Destroyすると、以下のエラーが出る
failed to 'network-remove' gameobject. client is neither owner nor masterclient taking over for owner who left: View(0)1005 on Bullet(Clone)
そこで所有権を移譲するために、弾丸のPhotonViewのインスペクタからオーナー設定をTakeover
にする。
最後にTransferOwnershipで弾丸が当たったプレイヤー自身(PhotonNetwork.player.ID)に所有権を移譲する。
PlayerAvatar.cs
using UnityEngine;
using System.Collections;
public class PlayerAvatar : Photon.MonoBehaviour {
PhotonView m_photonView;
void Start() {
m_photonView = GetComponent<PhotonView> ();
}
public void TakeDamage(GameObject i_projectile) {
Debug.Log (string.Format("{0}に攻撃が当たった", this.gameObject.name));
if(!m_photonView.isMine) {
return;
}
// 所有権の移譲
i_projectile.GetComponent<PhotonView> ().TransferOwnership (PhotonNetwork.player.ID);
PhotonNetwork.Destroy (i_projectile);
}
}
これで削除できるようになった。