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

Unity中OnTriggerEnter触发不稳定问题求助

问题分析与解决方案

核心问题根源

你代码里触发不稳定的直接原因是:在OnTriggerEnter方法内每次都重新生成随机的PizzaIndex,而不是使用当前订单对应的索引。每次触发时随机生成的索引只有1/6概率和当前订单匹配,这就导致触发成功的概率极低,表现为“有时生效、有时失效”。另外原代码Random.Range(1,6)是左闭右开取值,实际只会生成1-5,永远不会出现6,这也是“Everything Pizza”订单永远不会被选中的隐藏问题。

修复步骤

1. 存储当前订单索引

在脚本顶部添加私有变量,用于保存当前订单的披萨索引:

private int currentOrderIndex;

2. 修改pickingPizza方法,更新订单索引

修改随机生成逻辑,把生成的索引赋值给currentOrderIndex,同时修正随机范围覆盖1-6:

void pickingPizza()
{
    currentOrderIndex = Random.Range(1, 7); // 修正范围,覆盖1-6所有订单

    switch(currentOrderIndex)
    {
        case 1:
            Debug.Log("1");
            pizzaPick.text = "Pepperoni Pizza";
            break;
        case 2:
            Debug.Log("2");
            pizzaPick.text = "Veggie Pizza";
            break;
        case 3:
            Debug.Log("3");
            pizzaPick.text = "Boujee Pizza";
            break;
        case 4:
            Debug.Log("4");
            pizzaPick.text = "Pepperoni & Pepper";
            break;
        case 5:
            Debug.Log("5");
            pizzaPick.text = "Litterbox Pizza";
            break;
        case 6:
            Debug.Log("6");
            pizzaPick.text = "Everything Pizza";
            break;
    }
}

3. 重构OnTriggerEnter逻辑,使用订单索引判断

删除触发时的随机生成代码,用currentOrderIndex做判断,同时合并重复代码减少冗余:

void OnTriggerEnter(Collider collision)
{
    // 先做基础判断,不符合直接返回
    if (collision.tag != "Player" || !pManager.pizzaIsFinished)
        return;

    bool isOrderMatched = false;

    // 根据当前订单索引匹配对应的披萨状态
    switch(currentOrderIndex)
    {
        case 1:
            isOrderMatched = pManager.pepperoniPizza;
            break;
        case 2:
            isOrderMatched = pManager.veggiePizza;
            break;
        case 3:
            isOrderMatched = pManager.boujeePizza;
            break;
        case 4:
            isOrderMatched = pManager.pP;
            break;
        case 5:
            isOrderMatched = pManager.litterboxPizza;
            break;
        case 6:
            isOrderMatched = pManager.everythingPizza;
            break;
    }

    // 匹配成功执行后续逻辑
    if(isOrderMatched)
    {
        pizzaComplete.enabled = true;
        FindObjectOfType<AudioManager>().Play("youWon!");
        pManager.Reset();
        pickingPizza();
        StartCoroutine(yasAnimation());

        // 这里添加获取电池的逻辑
    }
}

4. 检查Unity触发组件配置

除了代码问题,还要确保以下配置正确:

  • 触发区域的Collider组件必须勾选Is Trigger
  • 玩家对象必须带有非静态的Rigidbody(3D用Rigidbody,2D用Rigidbody2D),否则OnTriggerEnter事件不会触发
  • 确认玩家对象的Tag确实是Player(大小写敏感)
  • 验证pizzaManager中的各个披萨状态变量(如pepperoniPizza)在披萨制作完成时正确设置为true,pizzaIsFinished状态同步正确

完整修复后代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;

public class orderDropOff : MonoBehaviour
{
    public pizzaManager pManager;
    [SerializeField]
    public TMP_Text pizzaPick;
    public TMP_Text pizzaComplete;
    private int currentOrderIndex; // 存储当前订单索引

    void Start()
    {
        pizzaComplete.enabled = false;
        pickingPizza();
    }

    void pickingPizza()
    {
        currentOrderIndex = Random.Range(1, 7); // 修正范围,覆盖1-6

        switch(currentOrderIndex)
        {
            case 1:
                Debug.Log("1");
                pizzaPick.text = "Pepperoni Pizza";
                break;
            case 2:
                Debug.Log("2");
                pizzaPick.text = "Veggie Pizza";
                break;
            case 3:
                Debug.Log("3");
                pizzaPick.text = "Boujee Pizza";
                break;
            case 4:
                Debug.Log("4");
                pizzaPick.text = "Pepperoni & Pepper";
                break;
            case 5:
                Debug.Log("5");
                pizzaPick.text = "Litterbox Pizza";
                break;
            case 6:
                Debug.Log("6");
                pizzaPick.text = "Everything Pizza";
                break;
        }
    }


    void OnTriggerEnter(Collider collision)
    {
        if (collision.tag != "Player" || !pManager.pizzaIsFinished)
            return;

        bool isOrderMatched = false;

        switch(currentOrderIndex)
        {
            case 1:
                isOrderMatched = pManager.pepperoniPizza;
                break;
            case 2:
                isOrderMatched = pManager.veggiePizza;
                break;
            case 3:
                isOrderMatched = pManager.boujeePizza;
                break;
            case 4:
                isOrderMatched = pManager.pP;
                break;
            case 5:
                isOrderMatched = pManager.litterboxPizza;
                break;
            case 6:
                isOrderMatched = pManager.everythingPizza;
                break;
        }

        if(isOrderMatched)
        {
            pizzaComplete.enabled = true;
            FindObjectOfType<AudioManager>().Play("youWon!");
            pManager.Reset();
            pickingPizza();
            StartCoroutine(yasAnimation());

            //get batteries
        }
    }

    IEnumerator yasAnimation()
    {
        pizzaComplete.enabled = true;
        yield return new WaitForSeconds(1);
        pizzaComplete.enabled = false;
    }
}

内容的提问来源于stack exchange,提问作者Kevin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:25:14