当前位置:   article > 正文

unity 动态获取Animator 状态机中某个动画片段的播放速度(获取到速度来计算 播放时长)_animator 获取动画时长

animator 获取动画时长

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

这个功能主要是因为 每个动画片段的播放速度不一样,需要获取到速度来计算 播放时长。

获取某个动画片段的播放速度,并且得到播放时长

1.获取速度

 /// <summary>
 /// 播放动画
 /// </summary>
 /// <param name="obj_">带有Animator的Obj</param>
 /// <param name="animatorName_">动画名称</param>
 public virtual void ObjPlayAnimator(Animator obj_, string animatorName_, Action<GameObject> action_)
 {
     //获取动画组件
     var anim = obj_.GetComponent<Animator>();


     float speed_ = 1;//默认给1

获取AnimatorController中的所有层级:
//AnimatorController controller = animator.runtimeAnimatorController as AnimatorController;
//AnimatorControllerLayer[] layers = controller.layers;
//遍历每个层级,获取层级中的状态机:
//foreach (AnimatorControllerLayer layer in layers)
//{
//    AnimatorStateMachine stateMachine = layer.stateMachine;
//    // 这里可以进一步处理状态机中的逻辑
//}

     //获取AnimatorController中的0层级
     AnimatorController controller = anim.runtimeAnimatorController as AnimatorController;
     AnimatorStateMachine stateMachine =controller.layers[0].stateMachine;
     //获取层级中的状态机
     ChildAnimatorState[] states = stateMachine.states;
     //遍历状态机,
     for (int i = 0; i < states.Length; i++)
     {
         if (states[i].state.name== animatorName_)//判断得到你要的动画速度  
         {
             speed_ = states[i].state.speed;
         }
     }

     Debug.LogError("speed_="+ speed_);

     //播放
     anim.Play(animatorName_, 0, 0);

    //计算动画时长
     float time_ = GetAnimatorLength(anim, animatorName_) * (1 / speed_);

     //播放完成后 返回事件
     StartCoroutine(OverAnimation(obj_.gameObject, action_, time_));
 }
 IEnumerator OverAnimation(GameObject Obj, Action<GameObject> action_, float itme_)
 {
     yield return new WaitForSeconds(itme_);
     action_.Invoke(Obj);
 }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

2.计算时长

代码如下(示例):

 /// <summary>
 /// 获得animator下某个动画片段的时长方法
 /// </summary>
 /// <param animator="animator">Animator组件</param> 
 /// <param name="name">要获得的动画片段名字</param>
 /// <returns></returns>
 public float GetAnimatorLength(Animator animator, string name)
 {
     //动画片段时间长度
     float length = 0;
     AnimationClip[] clips = animator.runtimeAnimatorController.animationClips;
     //Debug.Log(clips.Length);
     foreach (AnimationClip clip in clips)
     {
        // Debug.Log(clip.name);
         if (clip.name.Equals(name))
         {
             length = clip.length;
             break;
         }
     }
     return length;
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

总结

好记性不如烂笔头

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/794116
推荐阅读
相关标签
  

闽ICP备14008679号