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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM