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

如何检测CharacterController控制的玩家上一帧接地但当前帧未接地?

如何检测CharacterController控制的玩家上一帧接地但当前帧未接地?

嗨,这个问题其实和你之前用位置检测的思路本质是一样的——核心就是保存上一帧的状态,然后和当前帧的状态做对比就行!

你只需要在脚本里维护一个记录上一帧接地状态的变量,然后每一帧对比当前的isGrounded值,就能精准捕捉到“刚离开地面”的瞬间。具体实现步骤如下:

  • 首先在类的成员位置声明变量,用来存储上一帧的接地状态(别在Update里声明,不然每次帧刷新都会重置):

    private bool _wasGrounded;
    private CharacterController controller;
    
  • 在Start方法里获取CharacterController的引用:

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }
    
  • 然后在Update(或者你用来处理玩家逻辑的帧更新方法)里完成状态对比:

    void Update()
    {
        // 获取当前帧的接地状态
        bool isGrounded = controller.isGrounded;
    
        // 核心判断:上一帧接地,当前帧未接地 → 刚离开地面
        if (_wasGrounded && !isGrounded)
        {
            // 在这里执行你想要的动作,比如播放跳跃音效、触发状态变化等
            Debug.Log("玩家刚离开地面!");
        }
    
        // 最后更新上一帧的状态,供下一帧判断使用
        _wasGrounded = isGrounded;
    }
    

注意事项:

  • 一定要把_wasGrounded = isGrounded;放在判断逻辑之后,要是先赋值再判断,你拿到的就都是当前帧的状态,根本检测不到状态变化。
  • 如果你习惯用FixedUpdate处理物理相关逻辑,这个逻辑也完全适用,只是要注意Unity的Update和FixedUpdate帧率差异,但CharacterController的isGrounded在Update里会更贴合帧同步的表现。

其实本质和你之前存上一帧位置的思路一致,只是把“位置值”换成了“布尔状态值”,核心都是用“上一帧的记录”和“当前帧的状态”做对比来捕捉变化瞬间~

备注:内容来源于stack exchange,提问作者RelevantUni98

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 12:14:29