Unity中如何通过代码单独控制单个动画状态的播放速度?
单独控制Animator中Walking动画状态的播放速度实现冲刺效果
方法一:通过参数绑定(推荐)
这种方式无需直接操作动画状态机,通过Animator参数单独控制Walking状态的速度,不会影响其他动画:
配置Animator Controller
- 打开你的Animator Controller,在Parameters面板添加一个Float类型参数,命名为
WalkSpeedMultiplier,默认值设为1。 - 选中Walking动画状态,在Inspector的Motion栏下,点击Speed属性旁的齿轮图标,选择
Add Parameter并绑定到WalkSpeedMultiplier。
- 打开你的Animator Controller,在Parameters面板添加一个Float类型参数,命名为
编写控制代码
通过SetFloat方法修改参数值,即可调整Walking状态的播放速度:
public Animator animator; // 冲刺时的速度倍数 public float sprintMultiplier = 2f; private readonly float normalWalkMultiplier = 1f; void Update() { // 示例:按住左Shift触发冲刺,松开恢复正常 if (Input.GetKey(KeyCode.LeftShift)) { animator.SetFloat("WalkSpeedMultiplier", sprintMultiplier); } else if (animator.GetFloat("WalkSpeedMultiplier") != normalWalkMultiplier) { animator.SetFloat("WalkSpeedMultiplier", normalWalkMultiplier); } }
方法二:直接操作动画Playable
如果不想通过参数绑定,也可以直接访问动画状态的Playable对象修改速度:
public Animator animator; public float sprintSpeed = 2f; private readonly float normalWalkSpeed = 1f; void Update() { // 获取Base Layer(索引0)的当前状态 AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0); // 判断是否处于Walking状态 if (stateInfo.IsName("Walking")) { var playable = animator.GetCurrentAnimatorPlayableState(0); if (playable.IsValid()) { var clipPlayable = (AnimationClipPlayable)playable.GetChild(0); // 根据输入切换速度 clipPlayable.SetSpeed(Input.GetKey(KeyCode.LeftShift) ? sprintSpeed : normalWalkSpeed); } } }
注意:这种方法需要确保状态名称准确,且仅在Walking状态激活时生效,状态切换后会自动恢复其他动画的默认速度。
内容的提问来源于stack exchange,提问作者Ron Ron
相关产品推荐
相关产品推荐

