Unity 如何設定 Animator分割播放
項目有個需求,一整段非常長的Animator 動畫, 分割成一份份的播放,我們點擊相應的按鈕就播放某個時間點的動畫,廢話不多說
新建一個空物體加上toggle group,
下面是一堆的toggle並在Group裡加上父親
private Animator myAnimator; public List<Toggle> myTogglesList; private float playTime; public void Awake() { myAnimator = GameObject.Find("XXX/xxx").GetComponent<Animator>(); myTogglesList.AddRange(transform.GetComponentsInChildren<Toggle>()); } public void Start() { base.Start(); for (int i = 0; i < myTogglesList.Count; i++) { Toggle go = myTogglesList[i]; myTogglesList[i].onValueChanged.AddListener((bool value) => OnClickBtn(go.gameObject, value)); } }
void Update() { //playTime 得到當前時間點 playTime = myAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime; Debug.Log(playTime); if (myTogglesList[0].isOn && playTime > 0.1f) { //Animator.Play("ANI1", 0, 0f) 第一參數 ANI1動畫名 第二參數0,為0層, 第三參數 0f,為開始時間 myAnimator.Play("ANI1", 0, 0f); } if (myTogglesList[1].isOn && playTime > 0.3f) { myAnimator.Play("ANI1", 0, 0.1f); } if (myTogglesList[2].isOn && playTime > 0.5f) { myAnimator.Play("ANI1", 0, 0.3f); } if (myTogglesList[3].isOn && playTime > 0.8f) { myAnimator.Play("ANI1", 0, 0.5f); } ......................... } private void OnClickBtn(GameObject go, bool value) { switch (go.name) { case "btn01 (1)": myAnimator.Play("ANI1", 0, 0f); break; case "btn01 (2)": myAnimator.Play("ANI1", 0, 0.1f); break; case "btn01 (3)": myAnimator.Play("ANI1", 0, 0.3f); break; case "btn01 (3)": myAnimator.Play("ANI1", 0, 0.5f); break; ......................... } }
補充:Unity animator不剪輯動畫實現 分段播放動畫
我就廢話不多說瞭,大傢還是直接看代碼吧~
public Animator anim; private AnimatorStateInfo animInfo; /// <summary> /// 控制動畫暫停和播放 /// </summary> int playSpeed = 0; void Update() { animInfo = anim.GetCurrentAnimatorStateInfo(0); //判斷正在播放Take 001動畫 if (animInfo.normalizedTime < 0.99f && animInfo.IsName("Take 001")) { //第一段動畫 if (animInfo.normalizedTime > 0.19 && animInfo.normalizedTime < 0.2) { //達到條件時暫停播放動畫 print("暫停播放1"); anim.speed = playSpeed; } //第二段動畫 else if (animInfo.normalizedTime > 0.39 && animInfo.normalizedTime < 0.4) { print("暫停播放2"); anim.speed = playSpeed; } else { //自動設置回停止播放條件 playSpeed = 0; } } } /// <summary> /// 開始播放動畫 /// </summary> private void PlayAnim() { //設置播放動畫條件 playSpeed = 1; }
animInfo.normalizedTime 動畫狀態標準化時間,一段動畫值為從0~1。到1則動畫播放完畢
animInfo.IsName(“Take 001”) 當前播放的動畫,Take 001是動畫名稱
原理:首先要知道每段動畫結束幀,然後該段動畫結束幀除於總幀得到該結束幀在animInfo.normalizedTime 的值,最後作為條件暫停動畫,繼續播放動畫可實現下一段動畫的啟停。
比如:有一個動畫100幀,不剪輯,需要播放多段動畫。
得知第一段的結束幀在20幀,那麼20/100=0.2,0.2則為normalizedTime 值作為動畫暫停條件(寫條件的時候可以設個范圍)。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- None Found