第六章 基本框架(Framework)
五 对象池(Object Pools)
对象池一般是减少系统开销的一种手段,包括创建、再利用与回收。
我们的对象池也同样是这样的,对象池也有多种回收方式。
比如,将GameObject
的activeSelf
设置成false
。
再比如,将Layer
设置成不渲染的层。
还比如,将transform.position
移动到足够远,从而不显示。
等等,诸如此类多种方式。各有利弊,我们制作的游戏并没有那么多开销,需求的功能也不是特别多。
所以我们只使用最基本的activeSelf
设置成false
的方式。
只是,我把Instance都放在了一个自建的类InstanceCollection
并继承了IList
里,而创建Instance由它来管理。
我们来说说主要属性与逻辑。其它属性或方法,等上传源代码后,可以去下载源代码查看。
1 InstanceCollection
关于InstanceCollection
,我们主要说一下创建Instance。
首先它需要一个Prefab,来告知到底生成的是谁的实例。
然后既然是个集合,至少应该能保存Instance的属性。这里把回收的Instance单独建立一个List
。
[SerializeField, Tooltip("The prefab.")]
private GameObject m_Prefab;
private List<GameObject> m_Instances;
/// <summary>
/// 回收的Instances
/// </summary>
private List<GameObject> m_RecycledInstances;
我们从Pool中取得实例,而集合中存在可再利用的话,就不应该创建的,不存在才创建。
所以在创建方法中应该加以判断。
/// <summary>
/// 获取未使用Instance,如果没有,则创建一个Instance
/// </summary>
/// <returns></returns>
internal GameObject GetOrCreateRecycledInstance()
{
GameObject instance;
if (recycledCount > 0)
{
instance = m_RecycledInstances[recycledCount - 1];
m_RecycledInstances.RemoveAt(recycledCount - 1);
}
else
{
instance = GameObject.Instantiate(prefab);
RenameInstance(instance);
m_Instances.Add(instance);
ReusableObject reusable = GetOrAddReusableObject(instance);
reusable.isFromPool = true;
reusable.onDestroyed = ReusableObject_onDestroyed;
reusable.onDespawn = ReusableObject_onDespawn;
if (reparentOnCreated)
{
instance.transform.SetParent(m_Pool.transform, false);
}
}
return instance;
}
其中,你会看到,我在生成Instance时,为它添加了一个脚本组建ReusableObject
。
它的作用是,标识我们的Instance是不是从Pool生成,还决定着,是否触发IReusableComponent
接口的回调。
而IReusableComponent
里面有两个方法。分别在再利用和回收时触发。
namespace DR.Book.SRPG_Dev.Framework
{
pu