オブジェクト プールを使用するには、ObjectBase を継承する必要があります。まず、ObjectBase から継承した OPGame クラスを作成します。以下に示すように、当面はそれを OP オブジェクトと呼びます。
OP オブジェクトにはメンバー オブジェクトまたは変数を保存できる場所が 2 つあり、1 つはモデル ID: m_ModelID などの OP オブジェクト内にあります。もう 1 つは、オブジェクト プールの基本クラス ObjectBase の m_Target が、ボックス化とボックス化解除を必要とする任意のデータ型を格納できることです。OP オブジェクトを作成するときに、カスタム タイプ ModelInfor を渡し、基本クラスの初期化時にそれをパラメーターとして渡します。
API呼び出し
OP オブジェクト プールを作成します:
m_OPPool = GameEntry.ObjectPool.CreateSingleSpawnObjectPool(Utility.Text.Format(“OP Pool ({0})”, name), 20, 10, 0);
OP オブジェクトを作成します:作成後、使用中
ModelInfor ModelInfor = new ModelInfor(i);
OPGame OPGame = OPGame.Create("Model" + CreateNums, CreateNums, ModelInfor);
m_OPPool.Register(OPGame, true);
OP オブジェクトの取得:オブジェクト プールから未使用の OP オブジェクト
OPGameを取得しますOPGame = m_OPPool.Spawn("Model" + 0);
OP オブジェクトのリサイクル:使用中のオブジェクトを解放し、オブジェクト プールにリサイクルします。
m_OPPool.Unspawn(OPGame);
OP オブジェクトがロックされているかどうかを設定します:ロック後、オブジェクトはロックできなくなります。プール内の Destroy
m_OPPool.SetLocked(OPGame, true);
OP オブジェクトの優先順位を設定します:
m_OPPool.SetPriority(OPGame, 10);を使用します。
完全なコード
ProcedureObjectPool: プロセスを開始し、ObjectPlayer オブジェクトを作成します
using UnityEngine;
using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;
namespace StarForce
{
public class ProcedureObjectPool : ProcedureBase
{
public override bool UseNativeDialog
{
get
{
return true;
}
}
public override void OnEnter(ProcedureOwner procedureOwner)
{
base.OnEnter(procedureOwner);
GameObject TT = new GameObject("Player");
TT.AddComponent<ObjectPlayer>();
}
}
}
OPGame: OP オブジェクトと格納されたデータ クラス
using GameFramework;
using GameFramework.ObjectPool;
using UnityEngine;
public class OPGame : ObjectBase
{
private int m_ModelID;
public OPGame()
{
}
public static OPGame Create(string name,int ID, ModelInfor Model)
{
OPGame InstanceOP = ReferencePool.Acquire<OPGame>();
InstanceOP.Initialize(name, Model);
InstanceOP.m_ModelID = ID;
return InstanceOP;
}
public override void Clear()
{
base.Clear();
m_ModelID = -1;
}
public override void Release(bool isShutdown)
{
}
}
public class ModelInfor
{
private int ID;
private Mesh Mesh;
private Texture2D Texture2D;
public ModelInfor(int ID)
{
this.ID = ID;
Mesh = null;
Texture2D = null;
}
public ModelInfor()
{
this.ID = -1;
Mesh = null;
Texture2D = null;
}
public Mesh GetMesh()
{
return Mesh;
}
public Texture2D GetTexture2D()
{
return Texture2D;
}
public int GetID()
{
return ID;
}
}
ObjectPlayer: OP オブジェクト プール呼び出しの実装
using GameFramework;
using GameFramework.ObjectPool;
using StarForce;
using System.Collections.Generic;
using UnityEngine;
public class ObjectPlayer : MonoBehaviour
{
//创建对象名称编号
int CreateNums = 0;
private IObjectPool<OPGame> m_OPPool;
List<OPGame> UsingOPGames;
void Start()
{
m_OPPool = GameEntry.ObjectPool.CreateSingleSpawnObjectPool<OPGame>(Utility.Text.Format("OP Pool ({0})", name), 20, 10, 0);
m_OPPool.AutoReleaseInterval = 5;
UsingOPGames = new List<OPGame>();
}
[ContextMenu("CreateItem")]
public void CreateItem()
{
for (int i = 0; i < 10; i++)
{
ModelInfor ModelInfor = new ModelInfor(i);
OPGame OPGame = OPGame.Create("模型" + CreateNums, CreateNums, ModelInfor);
//创建对象
m_OPPool.Register(OPGame, true);
UsingOPGames.Add(OPGame);
if (CreateNums == 2)
{
CreateNums = 0;
}
else
{
CreateNums++;
}
if (i==0)
{
m_OPPool.SetLocked(OPGame, true);
m_OPPool.SetPriority(OPGame, 10);
}
ModelInfor Model = (ModelInfor)OPGame.Target;
Debug.LogError(Model.GetID());
}
}
[ContextMenu("SpawnItem")]
public void SpawnItem()
{
//获取对象
OPGame OPGame = m_OPPool.Spawn("模型" + 0);
UsingOPGames.Add(OPGame);
Debug.LogError("获取的对象:"+OPGame.Name);
}
[ContextMenu("UnspawnItem")]
public void UnspawnItem()
{
if (UsingOPGames.Count>3)
{
for (int i = 2; i >= 0; i--)
{
OPGame OPGame = UsingOPGames[i];
//回收对象
m_OPPool.Unspawn(OPGame);
UsingOPGames.Remove(OPGame);
Debug.LogError("释放的对象:" + OPGame.Name);
}
}
}
}
効果を達成する
図に示すように、CreateItem、SpawnItem、UnspawnItem の 3 つの関数を作成します。
関数呼び出しのエントリは次のとおりです。クリックして呼び出します。呼び出し順序は CreateItem、UnspawnItem、SpawnItem です。
CreateItem は 10 個のオブジェクトの作成を実現し、最初のオブジェクトはロックされ、優先度は 10 に設定されます。
UnspawnItem は最初に作成された 3 つのオブジェクトの回復を実現します。SpawnItem
はオブジェクト プールから「モデル 0」という名前のオブジェクトの取得を実現します。InUse は false から true に変わります。
「モデル 0」という名前の取得操作を実現しない場合しばらくすると、InUse ステータスが false のオブジェクトはオブジェクト プールによって破棄されますが、Locked が true に設定されている「モデル 0」は破棄されません。