初识unity对象池

1.对象池的作用

使用完不直接删除物体,而是将其放回池子里,需要用的时候再取出来。 对象池模式的出现主要优化两点:

1、防止对象被频繁的创建和删除,从而内存抖动、频繁GC(垃圾回收)

2、对象初始化成本较高

比如游戏中的子弹 怪物 等

2.对象池的简单实现

首先创建一个脚本

public class Object : MonoBehaviour
{
    public GameObject Ball;//对象

    private List<GameObject> Objects;

    private int initpoolsize = 10;//初始化池子大小

    private bool isAuto ;//是否自动生成

    public static Object Instance;//单例模式

    private void Start()
    {
        Instance = this;
        Objects = new List<GameObject>();//赋值
        for(int i = 0; i < initpoolsize; i++)
        {
            GameObject Obj = Instantiate(Ball);
            Obj.transform.parent = transform;//设置挂载脚本物体为生成子物体的父物体
            Obj.SetActive(false);//不显示

            Objects.Add(Obj);//为池子添加对象
        }
    }

    public GameObject GetGameObject()
    {
        for(int i = 0; i < initpoolsize; i++)
        {
            //当这个对象不是出于激活状态的时候
            if (!Objects[i].activeSelf)
            {
                Objects[i].SetActive(true);//显示
                return Objects[i];
            }

        }
        if (isAuto)
        {
            GameObject obj = Instantiate(Ball);
            Objects .Add(obj);//添加到池中
            return obj;
        }
        return null;
    }

}

有些比较难懂的注释大致标明了
然后就是我们给产生的对象写一个很简单很简单的脚本
为了运行观察效果的时候更能容易观察

public class Ball : MonoBehaviour
{
    private float timer = 0;

    private void OnEnable()//在该物体产生的时候
    {
        //设置初始位置 否则该物体会出现在上次物体运动的位置
        transform.position = Vector3.zero;
        timer = 0;
    }
    private void Update()
    {
        transform.Translate(Vector3.forward * Time.deltaTime * 20);
        //向前运动
        if (timer >= 2)
        {
            timer = 0;
            gameObject.SetActive(false);
        }
        else
        {
            timer += Time.deltaTime;
        }
    }
}

然后在给摄像机添加一句

if (Input.GetMouseButtonDown(0))
        {
            Object .Instance.GetGameObject();//利用单例模式实现
        }

然后在unity中床加一个空物体 挂上第一个(Object)脚本
然后创建一个预制体 挂上Ball脚本
在给摄像机挂上最后一句代码
即可实现最简单对象池

效果图
在这里插入图片描述
如果你手速比较快的话 我们可以改变池子的大小即可产生多个Sphere

发布了52 篇原创文章 · 获赞 47 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44302602/article/details/103218947
今日推荐