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

Unity中OnTriggerStay/OnTriggerEnter的If语句设置故障求助

问题与解决方案

问题背景

A、B、C、D四个游戏对象分别带有对应标签,挂载同一脚本并启用OnTriggerStay逻辑,预期实现玩家碰撞对应选项后触发答题反馈,但脚本条件判断失效,切换OnTriggerEnter、改用Else If均未解决。

原代码核心问题

  1. 条件判断逻辑完全错误:原代码中CompareTag("A") == other.CompareTag("Player")的写法逻辑混乱,这是将“当前物体是否为A标签”和“碰撞体是否为Player标签”的布尔值做相等判断,完全不符合“玩家碰撞A选项”的需求。正确逻辑应先确认碰撞对象是Player,再判断当前物体的标签。
  2. Else语句关联错误:原Else仅与最后一个If配对,导致只要最后一个If不满足就执行Else,而非所有条件都不满足时才触发。
  3. 冗余变量:每个脚本挂载在单独的选项对象上,无需引用A/B/C/D四个对象,只需保留当前选项对应的激活对象即可。

修正后的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Question1 : MonoBehaviour
{
    // 每个选项对象的脚本仅赋值自身对应的目标物体
    // 例如A对象脚本赋值virusA,B对象脚本赋值fluSyringe
    public GameObject targetObject;

    private void OnTriggerStay(Collider other)
    {
        // 先过滤非Player的碰撞,直接返回
        if (!other.CompareTag("Player"))
            return;

        // 根据当前物体的标签执行对应逻辑
        if (CompareTag("A"))
        {
            Debug.Log("选择选项A");
            targetObject.SetActive(true);
        }
        else if (CompareTag("B"))
        {
            Debug.Log("选择选项B");
            targetObject.SetActive(true);
        }
        else if (CompareTag("C"))
        {
            Debug.Log("选择选项C");
            targetObject.SetActive(true);
        }
        else if (CompareTag("D"))
        {
            Debug.Log("选择选项D");
            targetObject.SetActive(true);
        }
        else
        {
            Debug.Log("未识别的选项标签");
        }
    }
}

关键配置检查

  • 确保四个选项对象的标签分别设置为A、B、C、D,Player对象带有Player标签。
  • 确认所有选项对象的Collider组件勾选Is Trigger,且Player对象挂载Rigidbody组件(Unity触发事件要求至少一方有Rigidbody)。
  • 若需要单次触发(而非持续停留触发),直接将OnTriggerStay替换为OnTriggerEnter即可,逻辑无需改动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:12:12