Unity对象池插件Lean Pool学习笔记
使用简易代码如下:
演示地址:这是一个演示视频地址
Unity 源码工程包下载地址:这是一个地址链接1
using Lean.Pool;
using UnityEngine;
public class UsePoolTest : MonoBehaviour
{
public GameObject clone;//克隆体
public Transform cloneFather;//生成克隆体的父亲
public Transform creatClone;//生成克隆体的位置
public Quaternion localRotation;//旋转
public LeanGameObjectPool leanGameObjectPool;//LeanGameObjectPool脚本
void Start()
{
LeanPool.Spawn(clone, creatClone.position, localRotation, cloneFather);
}
// Update is called once per frame
void Update()
{
CreatAndDestroy();
}
public void CreatAndDestroy()
{
if (Input.GetMouseButtonDown(0))
{
leanGameObjectPool.Spawn(creatClone.position, localRotation, cloneFather);
}
if (Input.GetMouseButtonDown(1))
{
leanGameObjectPool.DespawnOldest();
}
}
}
该如何使用它?
找到严重依赖的代码:
Instantiate( … );
并将其替换为:
Lean.Pool.LeanPool.Spawn( … );
LeanPool.Spawn(clone, creatClone.position, localRotation, cloneFather);
接下来,找到严重依赖的代码:
Destroy( … );
并将其替换为:
Lean.Pool.LeanPool.Despawn( … );
例如:
var enemy = Lean.Pool.LeanPool.Spawn(enemyPrefab);
…
Lean.Pool.LeanPool.Despawn(enemy);
就是这样,您现在已经实施了 Lean Pool!
为什么我必须键入 Lean.Pool。
为了改进组织,所有 Lean Pool 类都位于 Lean.Pool 命名空间内。
如果您不喜欢键入 Lean.Pool。每次,您都可以将以下代码添加到脚本的顶部:
using Lean.Pool;
您现在可以调用 LeanPool.Spawn(…) 等。
如何更改设置?
如果您使用上述步骤,则 Lean Pool 将在您首次调用 LeanPool.Spawn 时自动创建池,因此要提前调整设置,您需要手动创建池。
为此,请右键单击 Hierarchy 窗口,然后选择 Lean / Pool。现在,您应该会在场景中看到一个名为 LeanGameObjectPool 的游戏对象,并且它应该会自动选中。
接下来,将预制件拖放到 Prefab 插槽中,这会将此池与此预制件相关联。您现在可以调整池设置,如 Preload、Capacity 等。
我的刚体速度没有被重置?
默认情况下,Lean Pool 在生成或取消消失时不会修改任何组件。
这适用于大多数组件,但某些组件即使在停用时也会保持其状态,这需要您手动重置其状态。
Rigidbody 和 Rigidbody2D 组件是两个不重置自身状态的示例。当这些组件消失/停用时,它们将保持其速度,而当再次生成时,它们将以原来的速度发射。
要解决此问题,必须在消失时重置速度。这可以通过添加 Lean Pool 附带的 LeanPooledRigidbody 或 LeanPooledRigidbody2D 组件来完成。
如何编写自定义生成/取消代码?
有几种方法可以做到这一点,每种方法都有其优点和缺点。
OnEnable 和 OnDisable 消息
LeanPool 将在池化时激活和停用您的预制件克隆。
当组件被停用时,Unity 会向其发送 OnDisable 消息,当组件被激活时,它会发送 OnEnable 消息。
这意味着您可以创建实现 OnEnable 和/或 OnDisable 的新组件,并将此组件附加到您的预制件。
注意如果使用此方法,则可以设置 LeanGameObjectPool.Notification = None,这可以提高性能。
注意如果您的游戏要求在游戏过程中停用预制件克隆,然后再将其停用,则此方法可能会产生意外行为。
OnSpawn 和 OnDespawn 消息
如果您使用 LeanGameObjectPool.Notification = Send Message 设置,则 LeanPool 将在附加到预制件克隆的任何组件上调用 OnSpawn 和 OnDespawn 方法。
这意味着您可以创建一个实现 OnSpawn 和/或 OnDespawn 的新组件,并将此组件附加到您的预制件。
这种方法的主要缺点是它可能会产生性能开销,它可能会干扰任何已经将 OnSpawn 或 OnDespawn 用于其他用途的代码,并且您可能会打错错误,导致方法无法被调用。
如果需要重置子 GameObjct 的状态,则可以改用 LeanGameObjectPool.Notification = Broadcast Message 设置。
注意如果您的预制件很复杂,则广播效率可能很低。
IPoolable 接口
如果使用 LeanGameObjectPool.Notification = IPoolable 设置,则 LeanPool 将在附加到实现 Lean.Pool.IPoolable 接口的预制件克隆的任何组件上调用 OnSpawn 和 OnDespawn 方法。
这是推荐的方法,因为它可以更清楚地说明代码的意图。但是,如果可以改用 OnEnable 和 OnDisable,则可能会略微提高性能。
如果需要重置子 GameObjct 的状态,则可以改用 LeanGameObjectPool.Notification = Broadcast IPoolable 设置。
注意如果您的预制件很复杂,则广播效率可能很低。
如何进一步提高性能?
您可能会注意到,Lean.Pool.LeanPool.Spawn 和 Lean.Pool.LeanPool.Despawn 方法的工作原理就像魔术一样。
这是因为它们是静态方法,在执行实际的生成或取消代码之前,搜索字典以查找与预制件克隆关联的池。
这通常非常快,但如果您需要超级优化您的游戏,则可能需要访问 Lean.Pool.LeanGameObjectPool 组件本身。如果存储对它的引用,则可以直接调用 Spawn 和 Despawn 方法。
注意您不能混合和匹配对 Spawn 和 Despawn 的 LeanPool 和 LeanGameObjectPool 调用。如果这样做,将引发警告。
为什么我在控制台中收到警告?
这可能是因为你做错了什么。
例如,您可能已将所有 Instantiate 调用替换为 Spawn 调用,但可能忘记将所有 Destroy 调用替换为 Despawn 调用。
在很多这样的场景中,你可能会忘记什么代码正在实例化或销毁什么,这会导致 Lean Pool 在检测到 soemthing 错误时抛出警告。
但是,如果您犯了这样的错误,Lean Pool 将(希望)不会崩溃,因为我在每一步都包含了许多安全检查。
如果您在追踪警告原因时遇到问题,则可以将 LeanPoolDebugger 组件添加到预制件中。此组件会主动跟踪当前的预制件克隆,并在您错误地生成或销毁它时准确告诉您。
暂无评论内容