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

Unity3D中Input.GetKeyDown与OnTriggerStay交互失效问题求助

问题分析与解决方案

问题根源

你的代码将输入检测放在OnTriggerStay物理回调中,这会导致按键事件偶尔丢失:

  • Input.GetKeyDown仅在按键按下的单帧返回true,而OnTriggerStay属于物理引擎驱动的回调,其执行时机可能与输入帧不同步(比如物理更新频率低于游戏帧率),错过按键帧。
  • 当玩家快速移动时,相机碰撞体可能在按键帧短暂脱离触发器,导致OnTriggerStay未执行,进而漏掉输入。

修复方案

将输入检测移至Update函数(每帧稳定执行),通过布尔变量标记是否处于触发区域:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class LightOnOff : MonoBehaviour
{
    public GameObject intText;
    Light myLight;
    public KeyCode interactionKey = KeyCode.E;
    
    private bool isInTrigger = false;

    void Start()
    {
        myLight = GetComponent<Light>();
        if (intText != null)
            intText.SetActive(false);
    }    

    void Update()
    {
        if (isInTrigger && Input.GetKeyDown(interactionKey))
        {
            myLight.enabled = !myLight.enabled;
        }
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("MainCamera"))
        {
            isInTrigger = true;
            intText.SetActive(true);
        }
    }

    void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("MainCamera"))
        {
            isInTrigger = false;
            intText.SetActive(false);
        }
    }
}

额外排查点

  • 检查相机碰撞体:确保MainCamera上的Collider未勾选Is Trigger,且碰撞体范围足够覆盖玩家交互区域。
  • 物理设置:在Edit > Project Settings > Time中,调整Fixed Timestep(建议设为0.02),缩小物理更新与游戏帧率的差距。
  • 碰撞矩阵:在Edit > Project Settings > Physics中,确认相机层级与灯光对象层级的碰撞规则已启用。

内容的提问来源于stack exchange,提问作者Yesik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:08:20