Unity的动画重新播放/暂停/继续播放(Animation/Animator)解决动画像播电影一样上一步下一步的播放问题

一. 重新播放

Animator.Play(state, layer, normalizedTime)

normalizedTime值得范围是0-1,当normalizedTime为0时就可以做到重播的效果

通过设置normalizedTime的值可以做到让动画从某一个位置播放(解决动画上一步下一步的播放问题)

layer是从0开始的
比如有一个叫“hit”的动画,在layer 0层中

animator.Play("hit", 0, 0f);

二. 暂停和继续播放

1. Animotor

// 播放
animator.Play("ani_name");
//animator.SetBool(isPlay,true)//切换动画状态机,的方式播放动画
// 暂停 animator.speed = 0; // 继续播放 animator.speed = 1;

2. Animation

// 播放
animition.Play("ani_name");
// 暂停
animition["ani_name"].speed = 0;
// 继续播放
animition["ani_name"].speed = 1;

 三、从动画某一帧开始播放


//当前动画机播放时长
currentTime = anim.GetCurrentAnimatorStateInfo(0).normalizedTime;
//动画片段长度
float length = anim.GetCurrentAnimatorClipInfo(0)[0].clip.length;
//获取动画片段帧频
float frameRate = anim.GetCurrentAnimatorClipInfo(0)[0].clip.frameRate;
//计算动画片段总帧数
float totalFrame = length / (1 / frameRate);
//计算当前播放的动画片段运行至哪一帧
int currentFrame = (int)(Mathf.Floor(totalFrame * clipTime) % totalFrame);(
clipTime改为currentTime
) Debug.Log(" Frame: " + currentFrame + “/” + totalFrame);



///
从某一帧开始播放动画 public void OnPlayAnimatorFromFrame(string stateName,float frame) { anim.Play(stateName,0,frame); playSpeed=1; } void OnClick() {   if(!animInfo.IsName("idel"))   {     var frame=frameTemp/TotleFrame;//frameTemp为当前位置的帧值,在配置表中获取;TotleFrame为当前动画总帧数    if(frame>=0&&frame<1)   {      OnPlayAnimatorFromFrame(anim.GetCurrentAnimatorClipInfo(0)[0].clip.name,frame);   }   } }

 

四、进度条控制动画 播放

public Slider AnimatorSlider;

void Start()
{
     AnimatorSlider.onValueChanged.AddListener(OnSliderController);  
}
void OnSliderController(float value)
{
    if(anim!=null&&!animInfo.IsName("idel")) 
  {
    OnAnimatorPlay(anim.GetCurrentAnimatorClipInfo(
0)[0].clip.name,value);
  }
}
public void OnAnimatorPlay(string stateName,float frame)
{
 
  anim.Play(stateName,
0,frame);   
}

 

posted @ 2021-12-09 11:50  WalkingSnail  阅读(8155)  评论(0编辑  收藏  举报