⭐ Unity 对象池的应用 Cube流星落

发布于:2024-10-13 ⋅ 阅读:(5) ⋅ 点赞:(0)

此次Demo里生成一些 Cube 从天上往下掉,并且当它们掉到特定高度(例如 y 轴小于 0)时销毁。为了优化性能,避免频繁创建和销毁物体,使用 对象池(Object Pooling) 技术来复用这些 Cube。

先看一下效果 观察Cube的生成

Cube对象池

 对象池管理器脚本

using System.Collections.Generic;
using UnityEngine;

public class ObjectPool : MonoBehaviour
{
    // Cube 预制体
    public GameObject cubePrefab;
    // 对象池大小
    public int poolSize = 10;
    // 用于存储 Cube 对象的列表
    private List<GameObject> pool;
    
    void Start()
    {
        // 初始化对象池
        pool = new List<GameObject>();

        for (int i = 0; i < poolSize; i++)
        {
            GameObject obj = Instantiate(cubePrefab);
            obj.SetActive(false);  // 初始化时设置为不活跃状态
            pool.Add(obj);
        }
    }

    // 从对象池中获取对象
    public GameObject GetObject()
    {
        foreach (var obj in pool)
        {
            if (!obj.activeInHierarchy)
            {
                obj.SetActive(true);  // 激活对象
                return obj;
            }
        }

        // 如果没有可用对象,可以选择扩展对象池
        GameObject newObj = Instantiate(cubePrefab);
        newObj.SetActive(true);
        pool.Add(newObj);
        return newObj;
    }

    // 将对象返回池中(实际上是禁用它)
    public void ReturnObject(GameObject obj)
    {
        obj.SetActive(false);  // 禁用对象
    }
}

 

Cube 下落逻辑

using UnityEngine;

public class FallingCube : MonoBehaviour
{
    public float fallSpeed = 2f;  // 下落速度
    public float minHeight = -1f; // 当 Cube 掉落到这个高度时消失

    private ObjectPool objectPool;

    void Start()
    {
        // 获取对象池的引用
        objectPool = FindObjectOfType<ObjectPool>();
    }

    void Update()
    {
        // 让物体下落
        transform.Translate(Vector3.down * fallSpeed * Time.deltaTime);

        // 如果物体高度小于 minHeight,将其返回对象池
        if (transform.position.y < minHeight)
        {
            objectPool.ReturnObject(gameObject);
        }
    }
}

 

创建控制器生成 Cube

using UnityEngine;

public class CubeSpawner : MonoBehaviour
{
    public ObjectPool objectPool;  // 对象池引用
    public float spawnInterval = 1f;  // Cube 生成的时间间隔
    public float spawnHeight = 5f;    // Cube 掉落的高度
    public Vector2 spawnArea = new Vector2(-5f, 5f);  // 生成的范围

    private float timeSinceLastSpawn;

    void Update()
    {
        timeSinceLastSpawn += Time.deltaTime;

        // 如果时间超过生成间隔,生成一个新的 Cube
        if (timeSinceLastSpawn >= spawnInterval)
        {
            SpawnCube();
            timeSinceLastSpawn = 0f;
        }
    }

    void SpawnCube()
    {
        // 从对象池中获取一个 Cube
        GameObject cube = objectPool.GetObject();

        // 随机设置生成位置
        float randomX = Random.Range(spawnArea.x, spawnArea.y);
        cube.transform.position = new Vector3(randomX, spawnHeight, 0f);
    }
}

设置场景步骤

  1. 创建空的 GameObject:Hierarchy 中创建一个空的 GameObject,命名为ObjectPoolManager。将 ObjectPool 脚本挂载到 ObjectPoolManager,并将 cubePrefab 设置为你的 Cube 预制体。

  2. 创建 CubeSpawner: 创建另一个空的 GameObject,命名为 CubeSpawner将 CubeSpawner 脚本挂载到 CubeSpawner。将 ObjectPoolManager 中的 ObjectPool 组件拖入 CubeSpawner 的 ObjectPool 引用槽中。

  3. Cube 预制体配置: 打开你的 Cube 预制体,将 FallingCube 脚本挂载到 Cube 上,并配置下落速度和销毁高度。

感谢大家的观看,您的点赞和关注是我最大的动力

不定时更新知识点和干货呦~