Unity对象池插件Lean Pool学习笔记

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 组件添加到预制件中。此组件会主动跟踪当前的预制件克隆,并在您错误地生成或销毁它时准确告诉您。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容