1. 程式人生 > >Unity3D動畫幀事件

Unity3D動畫幀事件

前幾天在專案開發中碰到一個這樣的需求,RPG遊戲中,特效和動畫播放不同步的。假如主角在攻擊NPC時,先例項化特效,後播放動畫。動畫畢竟是有一個時間長度的。等到動畫播放攻擊揮刀的那一瞬間時,特效可能早就播放完了。於是就想著在動畫播放到某一幀的時刻才例項化特效,這樣就解決了動畫與特效不同步的問題。首先我們要做的是如何給動畫新增事件?

1,建立一個空白的Unity工程,匯入一個帶有動畫的模型。

前期準備基本上就這麼多了,接下來就可以新增動畫事件了。新增動畫事件有兩種:

方法一:直接在模型中新增事件

到此處設定已完成了。執行下看會發生怎樣的結果。

報錯了,回掉函式找不到接收者,說白了就是我們沒有給人家回掉函式的定義,那麼在指令碼中定義該回掉函式吧!

OK,在場景中掛載該指令碼,再次執行。

動畫播放了,回掉函式也生效了!此時再例項特效就OK了。

那麼開始第二種方法,我們可以對任意動畫任意幀新增任意事件,貌似說的有點任性了。說的好像和真的一樣,那就看看到底是不是真的。

在碼程式碼之前,我們先去學習一個叫做AnimationEvent的東東。

瞭解這幾個引數,我們就可以寫程式碼了。

複製程式碼
using UnityEngine;
using System.Collections;

public class TestAnimationEvent : MonoBehaviour
{
    /// <summary>
    /// 我們要新增事件的動畫
    /// </summary>
public AnimationClip clip; public GameObject target; // Use this for initialization void Start() { AddAnimationEvent(); } /// <summary> /// 程式碼中自定義事件 /// </summary> public void AddAnimationEvent() { //建立動畫事件 AnimationEvent animationEvent = new
AnimationEvent(); //設定事件回掉函式名字 animationEvent.functionName = "GoToTarget"; //傳入引數 animationEvent.objectReferenceParameter = target; //設定觸發幀 animationEvent.time = 1.0f; //註冊事件 clip.AddEvent(animationEvent); } /// <summary> /// 視覺化新增動畫幀事件 /// </summary> public void CallFuncation() { Debug.Log("Animation Event Triggered !"); } /// <summary> /// 程式碼添加回掉函式 /// </summary> /// <param name="go"></param> public void GoToTarget(GameObject go) { this.transform.LookAt(go.transform); Debug.Log("目標物體:" + go.name + " " + go.transform.position); if (Vector3.Distance(this.transform.position, go.transform.position) < 0.2f) { return; } else { transform.position= Vector3.MoveTowards(this.transform.position, go.transform.position, 2f); } } }
複製程式碼

好了,我們來執行一下,測試結果就是人物移動到目標點。

執行後

好了,到此基本上完成了,如果有什麼疑問,聯絡我哦!

工程程式碼: http://pan.baidu.com/s/1fZ9pW