Unity 3D中如何销毁预制体克隆?披萨抛射体销毁问题求助
解决Unity披萨抛射体到达指定位置后自动销毁的问题
你的代码问题很明确:在按下空格键生成披萨的同一帧,就立刻检查它的Z位置——这时候披萨刚被创建,位置和玩家完全一致,Z值不可能大于35,所以销毁逻辑根本不会触发。
以下是几种适合新手的解决方案,按推荐优先级排序:
方案1:给披萨预制体添加独立的销毁脚本(最推荐)
这种方式让每个披萨自己管理生命周期,代码模块化,后续扩展(比如碰撞销毁、动画播放)更方便。
- 在Unity编辑器中创建新的C#脚本,命名为
PizzaDestroyer - 将以下代码复制到脚本中:
using UnityEngine; public class PizzaDestroyer : MonoBehaviour { // 可以在Inspector面板直接调整销毁的Z阈值 public float destroyZThreshold = 35f; void Update() { // 每一帧检查当前披萨的位置 if (transform.position.z > destroyZThreshold) { Destroy(gameObject); } } }
- 将这个脚本拖到你的披萨预制体上
- 运行游戏测试:生成的披萨会在Z轴超过35时自动销毁
方案2:用协程在PlayerController中跟踪单个披萨
如果你每次只生成一个披萨,可以用协程持续检查它的位置:
修改PlayerController脚本中的空格键触发逻辑:
// 保留原有的变量声明 public GameObject pizzaPrefab; private GameObject pizza; void Update() { // 原有的玩家移动、边界限制代码不变... if (Input.GetKeyDown(KeyCode.Space)) { pizza = Instantiate(pizzaPrefab, transform.position, pizzaPrefab.transform.rotation) as GameObject; // 启动协程跟踪披萨位置 StartCoroutine(CheckAndDestroyPizza(pizza)); } } // 协程方法:持续检查披萨位置 IEnumerator CheckAndDestroyPizza(GameObject targetPizza) { // 只要披萨还存在,就每一帧检查 while (targetPizza != null) { if (targetPizza.transform.position.z > 35) { Destroy(targetPizza); break; // 销毁后退出协程 } yield return null; // 等待下一帧再检查 } }
方案3:跟踪多个披萨,在Update中批量检查
如果需要同时生成多个披萨,可以用列表存储所有活跃的披萨,然后在每一帧遍历检查:
修改PlayerController脚本:
using System.Collections.Generic; // 要引入这个命名空间才能用List using UnityEngine; public class PlayerController : MonoBehaviour { private float horizontalInput; private float speed = 12.0f; private float leftBoundary = -10.0f; private float rightBoundary = 10.0f; public GameObject pizzaPrefab; // 用列表存储所有活跃的披萨 private List<GameObject> activePizzas = new List<GameObject>(); void Update() { // 原有的玩家移动、边界限制代码不变... if (Input.GetKeyDown(KeyCode.Space)) { GameObject newPizza = Instantiate(pizzaPrefab, transform.position, pizzaPrefab.transform.rotation) as GameObject; activePizzas.Add(newPizza); } // 遍历检查所有活跃披萨的位置(从后往前遍历避免列表修改时出错) for (int i = activePizzas.Count - 1; i >= 0; i--) { GameObject currentPizza = activePizzas[i]; // 如果披萨已经被销毁,从列表中移除 if (currentPizza == null) { activePizzas.RemoveAt(i); continue; } // 检查位置,满足条件则销毁并移除 if (currentPizza.transform.position.z > 35) { Destroy(currentPizza); activePizzas.RemoveAt(i); } } } }
内容的提问来源于stack exchange,提问作者That one bad coder
相关产品推荐
相关产品推荐

