サイトアイコン Unity+AssetStoreおすすめ情報

Photon(PUN 2)のインスタンス化を Resources から Prefab に変更する

はじめに

たっつー

こんにちは、のんびりエンジニアのたっつーです。
Twitter(@kingyo222)で Unity情報 を発信しているのでよければフォローしてください!

 

Unityのネットワークライブラリの Photon を使う場合に、Photonのインスタンス化を Resources から 自分で指定したプレファブリストに変更する方法をご紹介したいと思います。

Photon とは?

PUN 2 – FREE (無料版)
Photon PUN 2+ (有料 版 )

Photon とはマルチプレイヤーゲームを作る場合にネットワーク部分を担当してくれるネットワークライブラリになります。

例えば、モンストなどのゲームを作る場合には同時プレイしている4人の画面の情報を同期しないといけないですよね?そんな時に Photon を使うとネットワーク部分のめんどくさい部分を一括して担当してくれます。

使い方

Photon の使い方

Photon の使い方は今回のテーマではないので他の記事に譲ります。

今回は、Photon を使う時に困る事の1つとしてインスタンス化する際に Resources に Prefab を格納しないといけないのですが、これを自分で定義したリストから生成するように変更します。

Resources から Prefab への変更方法

通常 Photon では、文字列の名前から Resources を検索してヒットしたオブジェクトをインスタンス化の対象とします。

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

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

ソースコード

以下のソースコードを追加します。

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

public class MyPhotonPool : 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);
    }
}

使い方

プールの定義

MyPhotonPoolスクリプトを適当なオブジェクトに追加して、PrefabList に Photon の生成対象となる Prefab を指定します。

呼び出し側

呼び出し側は通常通りのインスタンス化の方法で使ってください。

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

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

おすすめの記事

モバイルバージョンを終了