Unity 如何設(shè)定 Animator分割播放
項(xiàng)目有個(gè)需求,一整段非常長(zhǎng)的Animator 動(dòng)畫(huà), 分割成一份份的播放,我們點(diǎn)擊相應(yīng)的按鈕就播放某個(gè)時(shí)間點(diǎn)的動(dòng)畫(huà),廢話不多說(shuō)
新建一個(gè)空物體加上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 得到當(dāng)前時(shí)間點(diǎn) playTime = myAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime; Debug.Log(playTime); if (myTogglesList[0].isOn && playTime > 0.1f) { //Animator.Play("ANI1", 0, 0f) 第一參數(shù) ANI1動(dòng)畫(huà)名 第二參數(shù)0,為0層, 第三參數(shù) 0f,為開(kāi)始時(shí)間 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; ......................... } }
補(bǔ)充:Unity animator不剪輯動(dòng)畫(huà)實(shí)現(xiàn) 分段播放動(dòng)畫(huà)
我就廢話不多說(shuō)了,大家還是直接看代碼吧~
public Animator anim; private AnimatorStateInfo animInfo; /// <summary> /// 控制動(dòng)畫(huà)暫停和播放 /// </summary> int playSpeed = 0; void Update() { animInfo = anim.GetCurrentAnimatorStateInfo(0); //判斷正在播放Take 001動(dòng)畫(huà) if (animInfo.normalizedTime < 0.99f && animInfo.IsName("Take 001")) { //第一段動(dòng)畫(huà) if (animInfo.normalizedTime > 0.19 && animInfo.normalizedTime < 0.2) { //達(dá)到條件時(shí)暫停播放動(dòng)畫(huà) print("暫停播放1"); anim.speed = playSpeed; } //第二段動(dòng)畫(huà) else if (animInfo.normalizedTime > 0.39 && animInfo.normalizedTime < 0.4) { print("暫停播放2"); anim.speed = playSpeed; } else { //自動(dòng)設(shè)置回停止播放條件 playSpeed = 0; } } } /// <summary> /// 開(kāi)始播放動(dòng)畫(huà) /// </summary> private void PlayAnim() { //設(shè)置播放動(dòng)畫(huà)條件 playSpeed = 1; }
animInfo.normalizedTime 動(dòng)畫(huà)狀態(tài)標(biāo)準(zhǔn)化時(shí)間,一段動(dòng)畫(huà)值為從0~1。到1則動(dòng)畫(huà)播放完畢
animInfo.IsName("Take 001") 當(dāng)前播放的動(dòng)畫(huà),Take 001是動(dòng)畫(huà)名稱
原理:首先要知道每段動(dòng)畫(huà)結(jié)束幀,然后該段動(dòng)畫(huà)結(jié)束幀除于總幀得到該結(jié)束幀在animInfo.normalizedTime 的值,最后作為條件暫停動(dòng)畫(huà),繼續(xù)播放動(dòng)畫(huà)可實(shí)現(xiàn)下一段動(dòng)畫(huà)的啟停。
比如:有一個(gè)動(dòng)畫(huà)100幀,不剪輯,需要播放多段動(dòng)畫(huà)。
得知第一段的結(jié)束幀在20幀,那么20/100=0.2,0.2則為normalizedTime 值作為動(dòng)畫(huà)暫停條件(寫(xiě)條件的時(shí)候可以設(shè)個(gè)范圍)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
解析C#中斷言與異常的應(yīng)用方式及異常處理的流程控制
這篇文章主要介紹了C#中斷言與異常的應(yīng)用方式及異常處理的流程控制,一般來(lái)說(shuō)斷言用于修正程序員自己的錯(cuò)誤而異常用于應(yīng)對(duì)程序運(yùn)行過(guò)程中可能出現(xiàn)的錯(cuò)誤,需要的朋友可以參考下2016-01-01C#中txt數(shù)據(jù)寫(xiě)入的幾種常見(jiàn)方法
這篇文章主要給大家介紹了關(guān)于C#中txt數(shù)據(jù)寫(xiě)入的幾種常見(jiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10C# TreeView從數(shù)據(jù)庫(kù)綁定數(shù)據(jù)的示例
這篇文章主要介紹了C# TreeView從數(shù)據(jù)庫(kù)綁定數(shù)據(jù)的示例,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03C#通過(guò)html調(diào)用WinForm的方法
這篇文章主要介紹了C#通過(guò)html調(diào)用WinForm的方法,涉及html頁(yè)面中使用JavaScript訪問(wèn)C#的相關(guān)技巧,需要的朋友可以參考下2016-04-04C#利用File方法對(duì)文件的操作總結(jié)(字節(jié)寫(xiě)入和讀?。?/a>
使用C#語(yǔ)言中的File類我們能夠非常輕松的使用一些文件操作的函數(shù)來(lái)完成對(duì)文件簡(jiǎn)單的讀寫(xiě)操作,這篇文章主要給大家介紹了光宇C#利用File方法對(duì)文件的操作的相關(guān)資料,包括字節(jié)寫(xiě)入和讀取,需要的朋友可以參考下2021-08-0812306奇葩驗(yàn)證碼引發(fā)思考之C#實(shí)現(xiàn)驗(yàn)證碼程序
春運(yùn)最高峰來(lái)了!明天通過(guò)網(wǎng)絡(luò)將能買到小年夜的車票,本周四就將開(kāi)售除夕日車票,但不少人被首次在春運(yùn)期間使用的圖片驗(yàn)證碼搞得很火大,小編也正在對(duì)驗(yàn)證碼進(jìn)行研究,編寫(xiě)了由C#實(shí)現(xiàn)驗(yàn)證碼程序,分享給大家2015-12-12