提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
这个功能主要是因为 每个动画片段的播放速度不一样,需要获取到速度来计算 播放时长。
获取某个动画片段的播放速度,并且得到播放时长
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.计算时长
代码如下(示例):文章来源:https://www.toymoban.com/news/detail-847233.html
/// <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模板网!