You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity 3D中如何销毁预制体克隆?披萨抛射体销毁问题求助

解决Unity披萨抛射体到达指定位置后自动销毁的问题

你的代码问题很明确:在按下空格键生成披萨的同一帧,就立刻检查它的Z位置——这时候披萨刚被创建,位置和玩家完全一致,Z值不可能大于35,所以销毁逻辑根本不会触发。

以下是几种适合新手的解决方案,按推荐优先级排序:


方案1:给披萨预制体添加独立的销毁脚本(最推荐)

这种方式让每个披萨自己管理生命周期,代码模块化,后续扩展(比如碰撞销毁、动画播放)更方便。

  1. 在Unity编辑器中创建新的C#脚本,命名为PizzaDestroyer
  2. 将以下代码复制到脚本中:
using UnityEngine;

public class PizzaDestroyer : MonoBehaviour
{
    // 可以在Inspector面板直接调整销毁的Z阈值
    public float destroyZThreshold = 35f;

    void Update()
    {
        // 每一帧检查当前披萨的位置
        if (transform.position.z > destroyZThreshold)
        {
            Destroy(gameObject);
        }
    }
}
  1. 将这个脚本拖到你的披萨预制体上
  2. 运行游戏测试:生成的披萨会在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:27:30