Unity 3D 動畫幀事件


  前幾天在項目開發中碰到一個這樣的需求,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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM