Unity中OnTriggerStay/OnTriggerEnter的If语句设置故障求助
问题与解决方案
问题背景
A、B、C、D四个游戏对象分别带有对应标签,挂载同一脚本并启用OnTriggerStay逻辑,预期实现玩家碰撞对应选项后触发答题反馈,但脚本条件判断失效,切换OnTriggerEnter、改用Else If均未解决。
原代码核心问题
- 条件判断逻辑完全错误:原代码中
CompareTag("A") == other.CompareTag("Player")的写法逻辑混乱,这是将“当前物体是否为A标签”和“碰撞体是否为Player标签”的布尔值做相等判断,完全不符合“玩家碰撞A选项”的需求。正确逻辑应先确认碰撞对象是Player,再判断当前物体的标签。 - Else语句关联错误:原Else仅与最后一个If配对,导致只要最后一个If不满足就执行Else,而非所有条件都不满足时才触发。
- 冗余变量:每个脚本挂载在单独的选项对象上,无需引用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
相关产品推荐
相关产品推荐

