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
相关产品推荐
相关产品推荐

