如何在OnTriggerEnter函数外部访问碰撞体?代码问题求助
问题解决思路与修正代码
核心错误排查与修复
赋值/比较运算符混淆:你在
OnTriggerEnter里写的if (collider1 = collider)是赋值操作,不是比较!这会把当前碰撞到的任何物体的Collider都赋值给collider1,同时这个表达式的结果永远为true,导致doorCollision一直被设为true。必须改成相等比较运算符==:if (collider1 == collider)缺少触发离开的重置逻辑:目前只有
OnTriggerEnter设置doorCollision = true,但没有在离开门的触发区域时把doorCollision设回false的逻辑。这会导致一旦碰过门,哪怕走开了,按E还是会触发开门日志。添加以下方法:private void OnTriggerExit(Collider collider) { if (collider1 == collider) { doorCollision = false; } }
额外优化与注意事项
- 避免动态查找的潜在问题:
GameObject.FindGameObjectWithTag("door")在场景加载时如果找不到对应标签的物体,会报空引用错误。建议直接在Unity Inspector面板里把门的Collider拖到collider1的字段上,删掉Start里的查找代码,更安全可靠。 - 触发检测的必要条件:确保你的角色和门的Collider都满足:
- 门的Collider勾选了
Is Trigger - 角色或门其中一个带有
Rigidbody组件(如果是角色的Rigidbody,可以勾选Is Kinematic避免物理影响) - 两者的碰撞层设置正确,没有在Physics设置里忽略彼此的层碰撞
- 门的Collider勾选了
修正后的完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class InteractionScript : MonoBehaviour { private bool doorCollision; [SerializeField] Collider collider1; // 直接在Inspector拖入门的Collider // Update is called once per frame void Update() { if(Input.GetKeyDown(KeyCode.E) && doorCollision) { Debug.Log("door would open"); } } private void OnTriggerEnter(Collider collider) { if (collider1 == collider) { doorCollision = true; } } private void OnTriggerExit(Collider collider) { if (collider1 == collider) { doorCollision = false; } } }
内容的提问来源于stack exchange,提问作者Paul Habchy
相关产品推荐
相关产品推荐

