アマゾンバナーリンク

ディスプレイ広告

スポンサーリンク

Photon(PUN 2)のInstantiateをResourcesからPrefabに変更する

こんにちは!PhotonPUN2を使っているとPhotonNetwork.Instancelateでオブジェクトを生成しなければ、ならない時がありますが、これはPrefabをResourcesに入れておかなければなりません。

記事内広告

ResourcesからPrefabに変更

通常時はPhotonは文字列を指定して、 Resources内のオブジェクトをインスタンス化します。

上記のソースでは Photon内で、「DefaultPool」で定義されているソースになります、中身を読むとResourcesで定義されたPrefabをキャッシュしなから必要があれば、インスタンス化してくれる実装になっています。

今回はこの実装を、自作のPrefabリスト からインスタンス化してくれる実装にしたいと思います。

using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;

public class CPhotonPool : MonoBehaviourPunCallbacks, IPunPrefabPool
{
    public List<GameObject> PrefabList;

    public void Start()
    {
        // Poolの生成イベントを書き換える
        PhotonNetwork.PrefabPool = this;
    }

    public GameObject Instantiate(string prefabId, Vector3 position, Quaternion rotation)
    {
        foreach (var s in PrefabList)
        {
            if (s.name == prefabId)
            {
                var go = Instantiate(s, position, rotation);
                go.SetActive(false);
                return go;
            }
        }

        return null;
    }

    public void Destroy(GameObject go)
    {
        GameObject.Destroy(go);
    }
}

呼び出し

通常と同じように呼び出すだけで使用できます。

// 文字列で指定
PhotonNetwork.Instantiate("BigAsteroid", Vector3.zero, Quaternion.identity, 0);

// Prefabの名前で指定
PhotonNetwork.Instantiate(prefab.name, Vector3.zero, Quaternion.identity, 0);

アイコンは黎(クロイ)様からお借りしました。

+1