C# Unity 对象池 【及其简便】

这篇具有很好参考价值的文章主要介绍了C# Unity 对象池 【及其简便】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C# Unity 对象池 【及其简便】

使用不到40行代码实现一个及其简便的对象池或引用池文章来源地址https://www.toymoban.com/news/detail-696744.html

1.Pool(当做引用池进行使用)

public static class Pool<T>
{
    private static readonly Queue<T> PoolQueue = new Queue<T>();

    public static int Count => PoolQueue.Count;

    public static T Rent()
    {
        return PoolQueue.Count == 0 ? Activator.CreateInstance<T>() : PoolQueue.Dequeue();
    }

    public static T Rent(Func<T> generator)
    {
        return PoolQueue.Count == 0 ? generator() : PoolQueue.Dequeue();
    }

    public static void Return(T t)
    {
        if (t == null)
            return;
        PoolQueue.Enqueue(t);
    }

    public static void Return(T t,Action<T> reset)
    {
        if (t == null)
            return;
        reset(t);
        PoolQueue.Enqueue(t);
    }

    public static void Clear()
    {
        PoolQueue.Clear();
    }
}

2.使用

public class MyPool1
{
    public int Age;
    public string Name;
}
public class TestPool : MonoBehaviour
{
    void Start()
    {
        MyPool1 myPool1 = Pool<MyPool1>.Rent();
        myPool1.Age = 18;
        myPool1.Name = "zzs";
        Debug.Log(myPool1.Age);
        Debug.Log(myPool1.Name);
        Pool<MyPool1>.Return(myPool1);
        Debug.Log(Pool<MyPool1>.Count);
        MyPool1 myPool11 = Pool<MyPool1>.Rent();
        myPool11.Age = 20;
        myPool11.Name = "xxx";
        Debug.Log(myPool11.Age);
        Debug.Log(myPool11.Name);
        Debug.Log(Pool<MyPool1>.Count);
    }
}

3.AbstractPool(当作对象池使用)

public abstract class AbstractPool<T>
{
    private readonly Action<T> _reset;
    private readonly Func<T> _generator;
    private readonly Stack<T> _objects = new Stack<T>();
    public int Count => _objects.Count;

    protected AbstractPool(Func<T> generator, Action<T> reset, int initialCapacity = 0)
    {
        _generator = generator;
        _reset = reset;
        for (var i = 0; i < initialCapacity; ++i)
        {
            _objects.Push(generator());
        }
    }

    public T Rent()
    {
        return _objects.Count > 0 ? _objects.Pop() : _generator();
    }

    public void Return(T item)
    {
        _reset(item);
        _objects.Push(item);
    }

    public void Clear()
    {
        _objects.Clear();
    }
}

4.使用

public class MyPool2 : AbstractPool<GameObject>
{
    public MyPool2(Func<GameObject> generator, Action<GameObject> reset, int initialCapacity = 0) : base(generator,reset,initialCapacity)
    {

    }
}
public class TestPool2 : MonoBehaviour
{
    private MyPool2 myPool2;
    [SerializeField] private GameObject m_Prefab;
    void Start()
    {
        myPool2 = new MyPool2(GeneratorGameObjectHandler, ResetGameObjectHandler, 5);
    }

    private void ResetGameObjectHandler(GameObject go)
    {
        go.SetActive(false);
    }

    private GameObject GeneratorGameObjectHandler()
    {
        GameObject go = Instantiate(m_Prefab);
        go.SetActive(false);
        return go;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.S))
        {
            GameObject go = myPool2.Rent();
            go.SetActive(true);
            StartCoroutine(HideGo(go));
        }
    }

    private IEnumerator HideGo(GameObject go)
    {
        yield return new WaitForSeconds(3f);
        myPool2.Return(go);
    }
}

到了这里,关于C# Unity 对象池 【及其简便】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity New Input System 及其系统结构和源码浅析【Unity学习笔记·第十二】

    转载请注明出处:🔗https://blog.csdn.net/weixin_44013533/article/details/132534422 作者:CSDN@|Ringleader| 主要参考: 官方文档:Unity官方Input System手册与API 官方测试用例:Unity-Technologies/InputSystem 如果c#的委托和事件不了解,参考我这篇:【C#学习笔记】委托与事件 (从观察者模式看C#的委

    2024年01月25日
    浏览(53)
  • 【持续更新中】Unity常见问题及其解决

    否则会出现以下错误: 错误: error CS0103: The name ‘gameobject’ does not exist in the current context 解决: 脚本中获取游戏对象使用gameObject。 注:Debug.Log(“”);表示调试时输出引号中的内容。 错误: error CS1061: ‘Vector2’ does not contain a definition for ‘X’ and no accessible extension method ‘

    2024年02月01日
    浏览(93)
  • 【Unity】Unity C#基础(十四)注释

    /// 是智能注释也称xml注释,会在被编译,并生成xml文件在可执行文件中。会影响编译速度,但不会影响代码执行速度。 一级注释 二级注释 另外,还可以自定义 XML 标签 。 注释换行 在 C# 智能注释时,常常希望它能在开发时显示为换行,使得提示更加友好!原来一直想怎么实

    2024年02月03日
    浏览(33)
  • Unity 关于Ray、RaycastHit、Raycast及其使用

    Unity中,我们要进行物理模拟和碰撞检测时,有三个重要的概念Ray、RaycastHit、Raycast。 其中,Ray可以理解为射线,它是一条从起点沿着特定方向延伸的无限长线段。 它的语法是: 它定义了两个参数,一个起点位置和一个方向,通过Ray射线,可以用来模拟子弹、光线、玩家视线

    2024年02月03日
    浏览(47)
  • Unity粒子系统ParticleSystem各模块及其参数学习

    粒子系统控制面板默认有4个模块:Particle System(主模块),Emission(发射模块), Shape(形状模块),Renderer(渲染器模块) 1.Particle System 模块包含了影响整个粒子系统的全局设置,主要用来初始化粒子系统,例如设置例子初始化时间、循环方式、初始速度、颜色、大小等基

    2024年02月04日
    浏览(40)
  • 【Unity小技巧】Unity探究自制对象池和官方内置对象池(ObjectPool)的使用

    对象池(Object Pool)是一种软件设计模式,用于管理和重用已创建的对象。在对象池中,一组预先创建的对象被维护在一个池中,并在需要时使用和回收。对象池的作用是提供一种高效地创建和销毁对象的方式,以减少系统开销和提高性能。 发明对象池的人绝对是个天才,游

    2024年02月12日
    浏览(56)
  • Blender——将模型及其所有纹理与材质导入unity

    前期准备 参考视频:7分钟教会你如何将Blender的模型材质导入unity_哔哩哔哩_bilibili 实验模型官网下载地址:Hoi An Ancient House Model free VR / AR / low-poly 3D model CSDN下载链接: 【免费】Blender三维模型-古代房屋模型(HoiAnAncientHouseModel)  对于常见的Blender文件,可以直接导入Unity,但

    2024年01月19日
    浏览(50)
  • Unity使用c#开发遇上的问题(一)(c#中无法引入input,双击unity中的c#文件无反应,unity中刚体设置后仍然穿越问题)

    闲着无聊,想用unity编一编小游戏,遇上的坑(一) 我使用的是vs2019,unity版本是2022.1,下载器Hub。 在asset中创建c#脚本移动cube。在写入X,Y偏移量时没有unity引擎的Input函数。 解决方法: 1.首选项中设置中文语言。

    2024年02月07日
    浏览(59)
  • Unity对象池和自写对象池

    目录 一. 什么是对象池 二、创建对象池 1、Stack ①Stack类 1构造函数 2属性 3方法 ②Stack对象池 2、Queue ①Queue类 1构造函数 2属性 3方法 ②Queue对象池 3.Unity官方对象池 ①Object Pool类 1构造函数 2属性 3方法 ②Object Pool对象池 一. 什么是对象池 顾名思义就是一定数量的已经创建好的

    2024年01月21日
    浏览(34)
  • 【Unity之IMGUI】—编译模式下控件可视化及其封装

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :UnityUI篇实战 缺点1:无法在编译过程进行可视化调整 缺点2:无法分辨率自适应 此图可忽略 UML类图 性能优化代码 完整代码: 按钮封装代

    2024年02月10日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包