using UnityEngine;
using MonobitEngine;
using System.Collections.Generic;
namespace TestMunFeature
{
public class PrefabPool : MonobitEngine.IMunPrefabPool
{
[SerializeField]
private static GameObject origin; // Instatiate 生成元となるゲームオブジェクト(プレハブ)
[SerializeField]
private static int maxCount ; // プールするオブジェクト数
private static List<GameObject> poolList = new List<GameObject>(); // オブジェクトプールとして登録されたインスタンスの実体
// コンストラクタ
public PrefabPool()
{
// maxCount 分だけ、非アクティブかつシーン遷移で破棄されないインスタンスを生成する
for (int i = 0; i < maxCount; i++)
{
obj = GameObject.Instantiate(origin, Vector3.zero, Quaternion.identity) as GameObject;
if (obj != null)
{
GameObject.DontDestroyOnLoad(obj); // シーン遷移で破棄させない
obj.SetActive(false); // 非アクティブ設定
poolList.Add(obj); // リスト追加
}
}
}
// オブジェクト動的生成のカスタマイズ
public GameObject Instantiate(string prefabName, Vector3 position, Quaternion rotation)
{
// インスタンスを非アクティブからアクティブに変更
GameObject go = null;
foreach (GameObject obj in poolList)
{
if (!obj.activeSelf)
{
go = obj;
go.SetActive(true);
break;
}
}
// アクティブに変更したインスタンスの transform 情報を設定
if (go != null)
{
go.transform.position = position;
go.transform.rotation = rotation;
}
return go;
}
// オブジェクト動的破棄のカスタマイズ
public void Destroy(GameObject obj)
{
MonobitView view = obj.GetComponent<MonobitView>();
if (view != null && view.isMine)
{
// 自身のオブジェクトであれば非アクティブ化
obj.SetActive(false);
}
else
{
// 他クライアントからのオブジェクトであれば破棄
GameObject.Destroy(obj);
}
}
// 明示的なデストラクタ
public static void DestroyAll()
{
foreach (GameObject obj in poolList)
{
MonobitNetwork.Destroy(obj);
GameObject.Destroy(obj);
}
poolList.Clear();
}
}
}