一. 重新播放
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);
}