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

这篇具有很好参考价值的文章主要介绍了unity 动态获取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);
 }

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;
 }

总结

好记性不如烂笔头文章来源地址https://www.toymoban.com/news/detail-847233.html

到了这里,关于unity 动态获取Animator 状态机中某个动画片段的播放速度(获取到速度来计算 播放时长)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity Animation -- 使用Animator控制动画

            在很多实际场景中,我们经常需要根据特定的事件(比如玩家输入,敌人受到攻击等)来播放不同的动画。这需要我们了解一下Animator,Animator Controller和基础的动画状态机。         首先我们来创建一个简单的开门动画,示例中的门的模型来自官方教程。其实我们也

    2023年04月27日
    浏览(70)
  • Unity Animator人物模型动画移动偏移

    模型动画出现移动方向偏移 !修改Animation中的Root Transform Rotation(根变换位置)、Root Transform Rotation(x,y,z)(旋转),Bake Info Pose修改为Original。可以解决 !!但是,使用动画移动函数时将无法移动,原因是锁定根变换位置和循环位置 !!!所以只要修改依据为原始或者微调偏离值,

    2024年02月15日
    浏览(40)
  • Unity动画控制器animator.CrossFade

    1.CrossFade虽然可以不用任何逻辑来链接而直接跳转,但是CrossFade只能覆盖其他动画,当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败。造成动画依旧停在原位。 attack动画名称 0.1f由其他动画转入此动画需0.1秒来过渡。

    2024年02月15日
    浏览(45)
  • unity 动画片段切割

    在工作的时候,美工往往给我们连续的动画预制体,这时候就需要我们自己去切割,可以请美工给出具体的间隔时间。 1.uinty中的Assets下找到对应的预制体 2.将inspector层切换到Animation 3.点击加号增加动画片段,可以拖拽蓝色的箭标选择开始帧和结束帧,也可以在Start和End中直接

    2024年02月09日
    浏览(36)
  • Unity中,点击按钮Button,控制,动画Animator暂停播放

    在Unity中,你可以使用以下脚本来实现点击按钮时停止动画的功能: using UnityEngine; using UnityEngine.UI; public class StopAnimationOnClick : MonoBehaviour {     public Animator animator;     public Button button;     private bool isAnimationPlaying = true;     private void Start()     {         button.onClick.AddListen

    2024年04月27日
    浏览(46)
  • Unity简单操作:设置触发条件 切换Animator动画控制器 里面播放的Animation动画

    确保animator里面有多个animation动画剪辑,点击Animator里面[Parameters]添加触发条件   添加连线箭头并且 给箭头连线绑定触发事件  添加连线箭头并且 给箭头连线绑定触发事件  

    2024年02月04日
    浏览(59)
  • Unity Animator.Play(stateName, layer, normalizedTime) 播放动画函数用法

    接口: 参数 含义 stateName 动画状态机的某个状态名字 layer 第几层的动画状态机,-1 表示播放第一个状态或者第一个哈希到的状态 normalizedTime 从state动画进度的百分比(100%)开始播放到结束 Unity Animator.Play 详解 基于 Animator 制作一个Cube旋转的帧动画 在 Cube 上实现调用 Play(st

    2024年02月13日
    浏览(55)
  • 【Unity】Animator Controller中动画消失 显示问题分析及解决方案

    Unity中的Animator Controller界面突然显示空白,编辑好的动画可以正常播放,但Animator ControllerAnimator Controller界面就是不显示。重启后就再次出现,启动项目后就又消失 可能是Unity缓存问题,重新生成Unity中缓存文件即可。 关闭Unity编辑器 打开项目所在位置的 Library 文件夹 将该文

    2024年02月11日
    浏览(59)
  • Unity导出FBX模型中的动画片段

    导出选中的FBX中的AnimationClip文件到文件夹中

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包