在OnTriggerEnter中添加Input.GetKey遇到的功能触发问题
问题原因
OnTriggerEnter只会在玩家刚进入触发器的那一帧执行一次,玩家几乎不可能刚好在这一瞬间按下Z键,所以你的输入检测逻辑根本没机会触发。移除Input代码后,只要进入触发器就执行射线和协程,自然能正常运行。
解决方案
- 先声明一个布尔变量跟踪触发器状态:
private bool isPlayerInTrigger = false;
- 在触发器事件里更新这个状态:
void OnTriggerEnter(Collider col) { if (col.gameObject.tag == "Object") { isPlayerInTrigger = true; } } void OnTriggerExit(Collider col) { if (col.gameObject.tag == "Object") { isPlayerInTrigger = false; } }
- 在
Update里统一检测输入、触发器状态和射线:
void Update() { // 用GetKeyDown确保只触发一次,避免按住Z键重复启动协程 if (isPlayerInTrigger && Input.GetKeyDown(KeyCode.Z)) { if (Physics.Raycast(transform.position, transform.forward, 2f)) { Debug.Log("Raycast detected."); StartCoroutine(Collide(solidObject)); } } }
额外注意点
- 确认玩家对象的标签确实是
"Object",别打错字 - 射线检测如果需要忽略某些层,可以给
Physics.Raycast加层掩码参数,避免误判 - 检查Input设置里Z键是否被正确映射,没有和其他功能冲突
内容的提问来源于stack exchange,提问作者Wurdular
相关产品推荐
相关产品推荐

