当前位置: 首页 > news >正文

【Unity】对象池 - 未更新完

自定义泛型对象池

文章目录

  • 自定义泛型对象池
    • 封装泛型类
    • 例子
  • 使用Unity自带对象池

封装泛型类

public abstract class MyPool<T> : MonoBehaviour where T :Component
{
    [SerializeField] protected T prefab; // 生成的预制体
    [SerializeField] protected int defaultNum; // 池子的大小
    protected Queue<T> pool = new Queue<T>(); // 队列存储池子

    protected bool IsPoolEmpty() => pool.Count == 0;
    protected bool IsPoolFull() => pool.Count > prefab;
	
	// 对象池四件套
    protected virtual T OnCreateItem() => Instantiate(prefab, transform);
    protected virtual void OnGetItem(T obj) => obj.gameObject.SetActive(true);
    protected virtual void OnReleaseItem(T obj) => obj.gameObject.SetActive(false);
    protected virtual void OnDestroy(T obj) => Destroy(obj.gameObject);
	
	// 用来获得对象后初始化一些信息
    protected abstract void InitializedObj(T obj); 
    protected T Get()
    {
        T obj;
        if (IsPoolEmpty()) obj = OnCreateItem();
        else
        {
            obj = pool.Dequeue();
            OnGetItem(obj);
        }

        InitializedObj(obj);
        return obj;
    }

    protected void Release(T obj)
    {
        if (IsPoolFull()) OnDestroy(obj);
        else
        {
            pool.Enqueue(obj);
            OnReleaseItem(obj);
        }
    }

}

例子

BoxPool:

public class BoxPool : MyPool<Box> 
{
    public float IntervalTime = 0.1f;
    void Start()
    {
        StartCoroutine(ContinueCreateBox());
    }
	
	// 不断生成对象
    private IEnumerator ContinueCreateBox()
    {
        while (true)
        {
            Box box = Get(); // 获得出来使用
            yield return new WaitForSeconds(IntervalTime);
        }
    }
	
	// 重写创建对象方法,添加委托
    protected override Box OnCreateItem()
    {
        Box box = base.OnCreateItem();
        box.SetBackDestroy(() => {
            Release(box);
        });
        return box;
    }
	
	// 完成抽象方法,初始化信息
    protected override void InitializedObj(Box obj)
    {
        obj.transform.position = transform.position + Random.insideUnitSphere * 2f; // 半径2内随机 
        obj.transform.rotation = Quaternion.identity;
        obj.GetComponent<Rigidbody>().velocity = Vector3.zero; // 重置刚体速度,否则会越掉越快
    }

}

Box:

public class Box : MonoBehaviour
{
    public UnityAction backDestroy;

    private float intervalTime = 1.5f;
    private float nowTime;

    private void Update() 
    {
        nowTime += Time.deltaTime;
        if (nowTime > intervalTime)
        {
            nowTime = 0;
            backDestroy?.Invoke();
        }
    }

    public void SetBackDestroy(UnityAction back)
    {
        backDestroy = back;
    }
}

不断生成Box

使用Unity自带对象池

相关文章:

  • 使用vite+react+ts+Ant Design开发后台管理项目(三)
  • 2024.9.26 Spark学习
  • 钉钉 钉钉打卡 钉钉定位 2024 免费试用 保用
  • 使用 Rust 和 wasm-pack 开发 WebAssembly 应用
  • ubuntu数据硬盘故障导致系统启动失败
  • Kafka集群扩容(新增一台kafka节点)
  • Windows 10 on ARM, version 22H2 (updated Sep 2024) ARM64 AArch64 中文版、英文版下载
  • 缓存穿透 问题(缓存空对象)
  • 513. 找树左下角的值
  • 常见场景题3(面试)
  • Netty简介
  • 时序数据库 TDengine 的入门体验和操作记录
  • java 框架组件
  • 24暑假实习信息、25秋招提前批信息,地信、测绘、遥感、地质相关岗位招聘汇总
  • C++——输入三个整数,按照由小到大的顺序输出。用指针方法处理。
  • ubuntu错误GPG error: http://repo.mysql.com/apt/ubuntu noble InRelease
  • Contact Form 7最新5.9.8版错误修复方案
  • Redisson 总结
  • QT窗口无法激活弹出问题排查记录
  • Stylized Smooth Clouds 卡通风格化云朵包
  • 会计江湖|年报披露关注什么:独董给出的“信号”
  • 习近平会见斯洛伐克总理菲佐
  • 央行:中国政府债务扩张仍有可持续性
  • 北上广深均宣布下调个人住房公积金贷款利率
  • 杭温高铁、沪苏湖高铁明起推出定期票和计次票,不限车次执行优惠折扣
  • 长安汽车辟谣作为二级企业并入东风集团:将追究相关方责任