今天做一個FPS游戲的時候,用的是新版的動畫系統,遇到一個問題。
就是用槍打敵人的時候,敵人會播放一個被擊中的動畫,但是如果在動畫播放的過程中再射擊敵人,敵人會先把第一個被擊中的動畫播放完,才再播放第二個被擊中的動畫。而且被擊中后還原為正常形態也有點慢。
這樣被槍打中的打擊感就沒有了,降低了FPS游戲的體驗。
我理想中的效果是,當我用槍擊中敵人,敵人播放被擊中的動畫,當我再開第二槍的時候,敵人能夠停止第一槍的正在播放的被擊中動畫,重新開始播放被擊中動畫。如果我連續射中敵人,敵人就會有一個不斷被擊中的鬼畜的效果。
解決方案
思路:
我在動畫狀態機里面再創建一個一模一樣的受傷的狀態hurt2,然后設置一個伴隨被擊中次數不斷累加的整型變量,當變量為單數時切換受傷狀態1,變量為雙數時切換受傷狀態2,這就實現了立刻停止當前動畫並重新開始播放動畫的效果。而動畫切換有點慢的話,可以不勾選狀態和狀態之間切換時的Transition的Has Exit Time,這樣就不會有動畫和動畫之間過渡的那個的時間。如果一個動畫有Conditions建議取消Has Exit Time,不然會出現無法及時觸發的問題。Has Exit Time就是必須過度的時間,處於這個時間時,是不允許任何對動畫的操作的。
動畫狀態機配置:
兩個受傷動畫之間過渡的Transition和walk與兩個受傷動畫之間的Transition配置:
當我們擊中敵人時,調用敵人節點下的Enemy腳本里面的hurt函數:
public void hurt() { a++; Debug.Log("打到怪物:"+a); if (a % 2 != 0) { this.anim.SetInteger("anim_state", 1);//播放hurt動畫 } else if (a % 2 == 0) { this.anim.SetInteger("anim_state", 2);//播放hurt2動畫 } if (a >= 10)//怪物死亡,切換到3,播放死亡動畫 { this.anim.SetInteger("anim_state", 3); } }
敵人節點下的Enemy腳本里面的Update函數:
void Update () { AnimatorStateInfo info = anim.GetCurrentAnimatorStateInfo(0); // 判斷動畫是否播放完成 if ((info.normalizedTime >= 1.0f && info.IsName("Base Layer.hurt")) || (info.normalizedTime >= 1.0f && info.IsName("Base Layer.hurt2"))) { this.anim.SetInteger("anim_state", 0);//設置參數anim_state的值為0,我們之前也設置了當它等於0的時候會跳轉 } // 判斷死亡動畫是否播放完成 if (info.normalizedTime >= 1.0f && info.IsName("Base Layer.die")) { this.box.enabled = false; this.anim.Stop(); MonoBehaviour.Destroy(this.gameObject); a = 0; Debug.Log("刪除怪物"); } }