Unity之对象池

下面是一个简单的对象池脚本
可以直接复制使用

对象池

  • 对象池:从字面理解就是一池子的物体,在我们需要使用的时候就拿出来一个,然后包装成我想用的样子。用完之后清空放回到池子里。

为什么要有对象池

  • 因为有系统通常会有需要频繁出现然后消失的物体,如果我们频繁使用 Instantiate 和 Destroy 来生成后销毁,那么会占用大量的系统内存,甚至导致系统崩溃。
  • 所以我们可以利用对象池的设计模式概念,在游戏的一开始就制作若干个数量的物体,将他们设置 SetActive(false) 当我们需要它们的时候,只要把它们设置成 SetActive(true) 就好了,用完了再次设置为false。以此方法来循环使用,以达到优化系统的作用。
using System.Collections.Generic;
using UnityEngine;

public class ShadowPool : MonoBehaviour
{
    
    
    public static ShadowPool Instance;

    public GameObject shadowPrefab;    //预制体

    public int shadowCount;            //默认生成数量

    private Queue<GameObject> availableObjects = new Queue<GameObject>();    //队列

    private void Awake()
    {
    
    
        Instance = this;
        
        //初始化对象池
        FillPool();
    }

    public void FillPool()
    {
    
    
        for (int i = 0; i < shadowCount; i++)
        {
    
    
            //初始化并设置父物体
            var newShadow = Instantiate(shadowPrefab, transform);
            
            //取消启用返回对象池
            ReturnPool(newShadow);
        }
    }

    public void ReturnPool(GameObject gameObject)
    {
    
    
        gameObject.SetActive(false);
        availableObjects.Enqueue(gameObject);
    }

    /// <summary>
    /// 在对象池拿去物体
    /// </summary>
    /// <returns></returns>
    public GameObject GetFormPool()
    {
    
    
        if (availableObjects.Count == 0)  //如果对象池物体不够再次创建相同数量的物体
        {
    
    
            FillPool();
        }
        var outShadow = availableObjects.Dequeue();
        outShadow.SetActive(true);
        return outShadow;
    }
}

为什么使用队列(Queue)

  • 因为(Queue)是一个先进先出的对象集合

猜你喜欢

转载自blog.csdn.net/Xz616/article/details/131772275