此次Demo里生成一些 Cube 从天上往下掉,并且当它们掉到特定高度(例如 y 轴小于 0)时销毁。为了优化性能,避免频繁创建和销毁物体,使用 对象池(Object Pooling) 技术来复用这些 Cube。
先看一下效果 观察Cube的生成
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="FHWhgk0c-1727236017739" src="https://live.csdn.net/v/embed/426570"></iframe>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);
}
}
设置场景步骤
-
创建空的 GameObject: 在
Hierarchy
中创建一个空的GameObject
,命名为ObjectPoolManager
。将ObjectPool
脚本挂载到ObjectPoolManager
,并将cubePrefab
设置为你的 Cube 预制体。 -
创建 CubeSpawner: 创建另一个空的
GameObject
,命名为CubeSpawner
将CubeSpawner
脚本挂载到CubeSpawner
。将ObjectPoolManager
中的ObjectPool
组件拖入CubeSpawner
的ObjectPool
引用槽中。 -
Cube 预制体配置: 打开你的 Cube 预制体,将
FallingCube
脚本挂载到 Cube 上,并配置下落速度和销毁高度。
感谢大家的观看,您的点赞和关注是我最大的动力
不定时更新知识点和干货呦~
标签:Cube,obj,对象,GameObject,void,Unity,public,流星 From: https://blog.csdn.net/weixin_53501436/article/details/142519447