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

Unity游戏翻越功能异常:添加Space按键后仅偶尔触发

问题根源

Input.GetKeyDown(KeyCode.Space)仅在按下空格的第一帧返回true,而OnTriggerStay虽每帧执行,但如果按键帧刚好和触发器检测帧错位(比如帧率波动、玩家移动过快导致触发器短暂脱离),就会错过触发时机,这就是成功率极低的原因。

靠谱修复方案

1. 输入检测移至Update(最稳妥)

Update是每帧稳定执行的逻辑,不会错过输入帧。单独维护状态变量标记是否处于可翻越区域:

private bool _canVault = false;
private Vector3 _vaultTargetPos; // 提前存储翻越位移参数

private void Update()
{
    // 每帧检查输入+可翻越状态,确保不会漏触发
    if (_canVault && Input.GetKeyDown(KeyCode.Space))
    {
        Debug.Log("vaulted");
        Player.transform.Translate(_vaultTargetPos);
        _canVault = false; // 触发后重置状态,避免重复触发
    }
}

private void OnTriggerEnter(Collider other)
{
    // 进入触发器时判断是否可翻越,同时计算好位移参数
    var upperTrig = GetComponentInChildren<Vaultupper>().uppertrig;
    if (!upperTrig)
    {
        _canVault = true;
        _vaultTargetPos = other.transform.position;
        _vaultTargetPos.y = 0;
        _vaultTargetPos.Normalize();
        _vaultTargetPos *= 2;
    }
}

private void OnTriggerExit(Collider other)
{
    // 离开触发器时重置状态
    _canVault = false;
}

2. 原代码加保险(无需大改结构)

如果不想调整整体逻辑,可在Update中补充一次检测,同时加冷却防止重复触发:

private bool _isVaultOnCooldown = false;
private float _vaultCooldown = 0.3f;

private void Update()
{
    if (_isVaultOnCooldown) return;
    
    // Update中补检测,防止OnTriggerStay漏帧
    if (Input.GetKeyDown(KeyCode.Space))
    {
        var upperTrig = GetComponentInChildren<Vaultupper>().uppertrig;
        // 用球形检测确认脚部是否接触障碍物(需给障碍物加标签)
        Collider[] hitColliders = Physics.OverlapSphere(transform.position, 0.5f);
        foreach (var collider in hitColliders)
        {
            if (collider.CompareTag("VaultObstacle"))
            {
                ExecuteVault(collider.transform.position);
                break;
            }
        }
    }
}

private void OnTriggerStay(Collider other)
{
    if (_isVaultOnCooldown) return;
    
    var upperTrig = GetComponentInChildren<Vaultupper>().uppertrig;
    if (!upperTrig && Input.GetKeyDown(KeyCode.Space))
    {
        ExecuteVault(other.transform.position);
    }
}

private void ExecuteVault(Vector3 obstaclePos)
{
    Debug.Log("vaulted");
    var objectpos = obstaclePos;
    objectpos.y = 0;
    objectpos.Normalize();
    objectpos *= 2;
    Player.transform.Translate(objectpos);
    _isVaultOnCooldown = true;
    Invoke(nameof(ResetVaultCooldown), _vaultCooldown);
}

private void ResetVaultCooldown()
{
    _isVaultOnCooldown = false;
}

3. 触发器优化辅助

  • 调大脚部触发器的碰撞范围,避免玩家快速移动时瞬间进出触发器
  • 给头部触发器的uppertrig变量加0.1秒延迟赋值,防止玩家头部擦到障碍物就误判为不可翻越

内容的提问来源于stack exchange,提问作者匿名用户

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:18:19