此次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;// 如果时间超过生成间隔,生成一个新的 Cubeif (timeSinceLastSpawn >= spawnInterval){SpawnCube();timeSinceLastSpawn = 0f;}}void SpawnCube(){// 从对象池中获取一个 CubeGameObject cube = objectPool.GetObject();// 随机设置生成位置float randomX = Random.Range(spawnArea.x, spawnArea.y);cube.transform.position = new Vector3(randomX, spawnHeight, 0f);}
}
设置场景步骤
-
创建空的 GameObject: 在
Hierarchy
中创建一个空的GameObject
,命名为ObjectPoolManager
。将ObjectPool
脚本挂载到ObjectPoolManager
,并将cubePrefab
设置为你的 Cube 预制体。 -
创建 CubeSpawner: 创建另一个空的
GameObject
,命名为CubeSpawner
将CubeSpawner
脚本挂载到CubeSpawner
。将ObjectPoolManager
中的ObjectPool
组件拖入CubeSpawner
的ObjectPool
引用槽中。 -
Cube 预制体配置: 打开你的 Cube 预制体,将
FallingCube
脚本挂载到 Cube 上,并配置下落速度和销毁高度。
感谢大家的观看,您的点赞和关注是我最大的动力
不定时更新知识点和干货呦~