第六章 基本框架(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
{
public interface IReusableComponent
{
void OnSpawn();

本文介绍了SRPG游戏开发中的对象池技术,用于减少系统开销。主要内容包括对象池的设计原理、InstanceCollection和ObjectPool类的实现,以及对象池管理器PoolManager的功能。详细讨论了如何生成、再利用和回收对象,以及对象池在游戏中的应用策略。
最低0.47元/天 解锁文章
1243

被折叠的 条评论
为什么被折叠?



