Unity中在OnTriggerStay正确使用FindObjectOfType检测空脚本标签对象
问题分析与解决方案
你的代码没生效的核心原因是类型不匹配:
GameObject.FindObjectOfType<First>()返回的是First脚本组件的实例- 而
OnTriggerStay参数里的other是触发碰撞的Collider组件实例
这两个完全是不同类型的对象,所以if (other == GameObject.FindObjectOfType<First>())这个条件永远不会成立,CheckPos1自然不会被设为true。
下面给你两种可行的修正方案:
方案1:检查碰撞对象是否挂载了First组件(推荐)
直接通过碰撞体获取其所属GameObject上的First组件,判断是否存在即可:
private void OnTriggerStay(Collider other) { // 检查当前碰撞的对象是否带有First脚本组件 if (other.GetComponent<First>() != null) { CheckPos1 = true; } }
这个方案最可靠,不管First脚本是不是直接挂在碰撞体所在的GameObject上,只要在同一个对象或其子对象上(如果需要查找子对象可以用GetComponentInChildren<First>()),都能检测到。
方案2:比较GameObject(适合场景中只有一个First对象的情况)
如果你的场景里只有一个挂载了First脚本的对象,也可以通过比较GameObject来判断:
private void OnTriggerStay(Collider other) { First targetFirst = GameObject.FindObjectOfType<First>(); // 确保找到First对象后,再比较碰撞体所属的GameObject if (targetFirst != null && other.gameObject == targetFirst.gameObject) { CheckPos1 = true; } }
注意:如果场景中有多个First组件,FindObjectOfType只会返回第一个找到的实例,这种情况就不适合用这个方案了。
额外注意事项
除了代码问题,还要确认以下Unity设置是否正确,否则触发事件本身可能不会触发:
- 碰撞体组件(Collider)的
Is Trigger选项是否勾选 - 触发事件的两个对象中,至少有一个带有
Rigidbody组件(如果是静态对象,可以勾选Rigidbody的Is Kinematic) First脚本确实挂载在了触发碰撞的目标对象上
内容的提问来源于stack exchange,提问作者Konrad Januszewski
相关产品推荐
相关产品推荐

