Unity3D中OnTriggerEnter()调用.SetActive()不生效问题求助
根因分析
你代码中使用的OnTriggerEnter是Unity物理系统的触发回调,仅当带碰撞体+刚体的物理对象进入触发区域时才会执行。你使用射线(Raycast)射击立方体的行为不会触发该回调,因此状态切换逻辑完全没有运行。
解决方案
方案1:适配射线射击逻辑(推荐,和你现有射击逻辑兼容)
- 修改立方体挂载的脚本,将切换逻辑封装为公共方法,供射线命中时调用:
using UnityEngine; public class OnRaycastHitSwitchTutorial : MonoBehaviour { public GameObject TutorialOne; public GameObject TutorialTwo; void Start() { TutorialTwo.SetActive(false); } // 射线命中时调用此方法 public void TriggerTutorialSwitch() { TutorialTwo.SetActive(true); TutorialOne.SetActive(false); } }
- 找到你原有实现射线射击功能的代码,在射线命中判断处新增调用逻辑:
// 以下代码放在你射击触发的对应位置,例如鼠标左键按下的判断分支内 if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out RaycastHit hitInfo)) { // 命中物体上如果挂载了教程切换脚本,就执行切换 if (hitInfo.collider.TryGetComponent<OnRaycastHitSwitchTutorial>(out var switcher)) { switcher.TriggerTutorialSwitch(); } }
方案2:适配物理触发逻辑(仅适用于你用实体子弹的场景)
如果你是用发射带碰撞体的实体子弹实现射击,需要检查以下配置:
- 立方体的Collider组件需勾选
Is Trigger属性 - 实体子弹对象必须同时挂载Collider组件和Rigidbody组件
- 立方体和子弹的层级没有在项目碰撞矩阵中设置为互相忽略
内容的提问来源于stack exchange,提问作者TubsyTub
相关产品推荐
相关产品推荐

