Unity开发中Animator的Jump布尔参数应在何处重置为false?
Unity跳跃动画状态切换解决方案
你可以选择以下任意一种方案实现需求:
方案1:使用Animator状态机行为(推荐)
该方案无需修改原有角色控制脚本,由动画状态机自动触发状态切换:
- 打开你的Animator Controller面板,选中已创建的Jump状态
- 在Inspector面板点击
Add Behavior,新建名为JumpStateBehavior的状态机脚本 - 编写脚本逻辑如下:
using UnityEngine; public class JumpStateBehavior : StateMachineBehaviour { // 当退出Jump状态时自动执行 override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { animator.SetBool("Jump", false); } }
配置完成后,Jump动画播放完成自动退出状态时,会自动把Jump参数设为false,触发回Locomotion状态的过渡。
方案2:使用动画事件
该方案适合需要和跳跃逻辑同步触发其他操作的场景:
- 打开你的跳跃动画剪辑文件,在Animation编辑窗口将时间轴拖拽到动画最后一帧
- 点击时间轴上方的
Add Event按钮,给最后一帧添加动画事件 - 在你的原有角色控制脚本中新增如下公共方法:
public void OnJumpAnimationEnd() { anim.SetBool("Jump", false); }
- 选中刚才添加的动画事件,在Inspector面板的Function下拉栏选中刚才新增的
OnJumpAnimationEnd方法即可。
方案3:代码主动检测动画播放状态
如果需要在逻辑层主动判断跳跃动画是否播放完成,可以在原有脚本的Update方法中添加如下检测逻辑:
private void Update() { // 原有跳跃逻辑保持不变 if (Input.GetKeyDown(KeyCode.J) && isGrounded && useJump) { anim.SetBool("Jump", true); rb.AddForce(jump * jumpImpulse, ForceMode.Impulse); isGrounded = false; } // 新增跳跃动画播放完成检测 AnimatorStateInfo stateInfo = anim.GetCurrentAnimatorStateInfo(0); // 参数为动画所在层的索引,默认基础层为0 if (stateInfo.IsName("Jump") && stateInfo.normalizedTime >= 1f) { anim.SetBool("Jump", false); } }
注意:
stateInfo.IsName的参数需要和你Animator中Jump状态的命名完全一致,区分大小写。
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

