LoginSignup
5
6

More than 5 years have passed since last update.

【PUN】プレイヤー1が生成したPhotonオブジェクトをプレイヤー2が削除する

Last updated at Posted at 2017-12-28

目的

プレイヤー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);
    }

}

これで削除できるようになった。

参考
オーナーシップ(所有権)の譲渡
オブジェクト所有権の移譲

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6