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

Unity C#:OnTriggerStay2D内GetKeyDown无法执行的解决咨询

问题修复方案

核心原因

OnTriggerStay2D 是Unity物理更新阶段的回调,而 Input.GetKeyDown(KeyCode.E) 仅在按键按下的单帧返回true。如果物理帧与游戏帧不同步,按键触发的那帧恰好没有执行OnTriggerStay2D,就会错过输入检测,导致代码无响应。

修复方法

最稳妥的方案是通过触发状态标记+Update帧更新检测来实现:

  • 在OnTriggerEnter2D中标记玩家进入触发区,激活UI;在OnTriggerExit2D中清除标记,关闭UI。
  • 在Update中持续检测标记状态+输入按键,确保不会错过触发时机。

示例代码

using UnityEngine;
using UnityEngine.SceneManagement;

public class Teleporter : MonoBehaviour
{
    [SerializeField] private GameObject interactUI;
    [SerializeField] private string targetSceneName;
    private bool _isPlayerInRange;

    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            _isPlayerInRange = true;
            interactUI.SetActive(true);
        }
    }

    private void OnTriggerExit2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            _isPlayerInRange = false;
            interactUI.SetActive(false);
        }
    }

    private void Update()
    {
        if (_isPlayerInRange && Input.GetKeyDown(KeyCode.E))
        {
            SceneManager.LoadScene(targetSceneName);
        }
    }
}

额外说明

如果不想用Update,可以改用Unity新输入系统的回调绑定,但旧输入系统下,标记+Update的方式兼容性最好,逻辑也最清晰。不要用Input.GetKey代替GetKeyDown,这会导致按住E就持续触发传送,不符合常规交互逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:15:16