Unity 如何設(shè)定 Animator分割播放
項目有個需求,一整段非常長的Animator 動畫, 分割成一份份的播放,我們點擊相應(yīng)的按鈕就播放某個時間點的動畫,廢話不多說
新建一個空物體加上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) 第一參數(shù) ANI1動畫名 第二參數(shù)0,為0層, 第三參數(shù) 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不剪輯動畫實現(xiàn) 分段播放動畫
我就廢話不多說了,大家還是直接看代碼吧~
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
{
//自動設(shè)置回停止播放條件
playSpeed = 0;
}
}
}
/// <summary>
/// 開始播放動畫
/// </summary>
private void PlayAnim()
{
//設(shè)置播放動畫條件
playSpeed = 1;
}
animInfo.normalizedTime 動畫狀態(tài)標準化時間,一段動畫值為從0~1。到1則動畫播放完畢
animInfo.IsName("Take 001") 當前播放的動畫,Take 001是動畫名稱
原理:首先要知道每段動畫結(jié)束幀,然后該段動畫結(jié)束幀除于總幀得到該結(jié)束幀在animInfo.normalizedTime 的值,最后作為條件暫停動畫,繼續(xù)播放動畫可實現(xiàn)下一段動畫的啟停。
比如:有一個動畫100幀,不剪輯,需要播放多段動畫。
得知第一段的結(jié)束幀在20幀,那么20/100=0.2,0.2則為normalizedTime 值作為動畫暫停條件(寫條件的時候可以設(shè)個范圍)。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
C#中多態(tài)現(xiàn)象和多態(tài)的實現(xiàn)方法
這篇文章主要介紹了C#中多態(tài)現(xiàn)象和多態(tài)的實現(xiàn)方法,較為詳細的分析了多態(tài)的原理與C#實現(xiàn)多態(tài)的方法,以及相關(guān)的注意事項,需要的朋友可以參考下2015-05-05
C#將hashtable值轉(zhuǎn)換到數(shù)組中的方法
這篇文章主要介紹了C#將hashtable值轉(zhuǎn)換到數(shù)組中的方法,涉及C#中CopyTo方法的使用技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04
如何使用C#串口通訊實現(xiàn)數(shù)據(jù)的發(fā)送和接收
本文詳細介紹了如何使用C#實現(xiàn)基于串口通訊的數(shù)據(jù)發(fā)送和接收,通過SerialPort類,我們可以輕松實現(xiàn)串口通訊,并結(jié)合事件機制實現(xiàn)數(shù)據(jù)的傳遞和處理,感興趣的朋友一起看看吧2025-03-03
Visual C#中如何使用IComparable和IComparer接口
這篇文章主要介紹了C#中使用IComparable和IComparer接口,在本例中,該對象被用作第二個參數(shù)被傳遞給Array.Sort的接受IComparer實例的重載方法,需要的朋友可以參考下2023-04-04
通過C#實現(xiàn)在Word中插入或刪除分節(jié)符
在Word中,分節(jié)符是一種強大的工具,用于將文檔分成不同的部分,每個部分可以有獨立的頁面設(shè)置,如頁邊距、紙張方向、頁眉和頁腳等,本文將介紹如何使用一個免費的.NET庫通過C#實現(xiàn)插入或刪除Word分節(jié)符,需要的朋友可以參考下2024-08-08

