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

如何在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设置里忽略彼此的层碰撞

修正后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:37:24