Unity3D – Playing Animation Call Function

簡介

當我們在Unity中使用Animation時,可能會遇到某些狀況,像是我在播放某動畫時,假如想在動畫播完發送訊息處發某動作,或是在動畫播放期間也想發送訊息,這時就會用到此篇的分享教學。或許上述的狀況可能可以用Animator來解決,但當你的Animation無法拆解時,就沒辦法用Animator來解決了。

實操-方法一

首先你要準備好一組Animation與Animator,而這邊的第一個範例我想又在播放完成後發送訊息。

你可以看到你的Animation影格中,有個如上圖紅框框處的icon,這功能是要在影格中加入『Event』,你可以在你的播放影格範圍內任意新增,而這邊我們是要放在最後一格,當影片播放玩觸發他。

可以看到他所給的Event一長串,大家有想要用Unity提供的事件可以上網找找每個事件可以做什麼事。但這邊我們想要直接用我們自己的事件,因此你必須新增一個C# Script,並放置在該物件中。

上圖有我新增的超簡單程式碼,該Function執行印出“Play End“字串在你的Unity3D Editor中,而存擋後將該Script附著在要Play Animation物件上。

最後一步就可以回到Animation Event選擇你剛剛在程式碼新增的Function名稱,案Play後,即可實現。

實操-方法二

而剛剛的方法適合在一段Animation大概想要埋較少的Event比較適用,但假如你遇到一段動畫很常,而且要埋很多的事件要觸發,這時就要用到該方法了。

這邊我們會解析該Animation當下播放到哪一個影格,這邊我們就做一個小實驗,當動畫形變變色時,程式會判斷當下影格而改變UI的Text。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class AnimationCallFunction : MonoBehaviour
{
    public GameObject MyAnimation;
    public Text Info;

    private void Update()
    {
//這邊很重要
        float currentFrame = MyAnimation.GetComponent<Animator>().GetCurrentAnimatorClipInfo(0)[0].clip.length 
        * (MyAnimation.GetComponent<Animator>().GetCurrentAnimatorStateInfo(0).normalizedTime % 1) *
            MyAnimation.GetComponent<Animator>().GetCurrentAnimatorClipInfo(0)[0].clip.frameRate;
//
        if(currentFrame > 0 && currentFrame < 30){
            Info.text = "Yellow";
        }else if(currentFrame > 30 && currentFrame < 60)
        {
            Info.text = "Green";
        }
        else if (currentFrame > 60 && currentFrame < 90)
        {
            Info.text = "Blue";
        }
        else if (currentFrame > 90 && currentFrame < 120)
        {
            Info.text = "Indigo";
        }
        else if (currentFrame > 120 && currentFrame < 150)
        {
            Info.text = "purple";
        }
    }
}

上面程式碼必須要在『Update』來執行,這樣才能不漏每一幀的進行偵測,在其中做核心的算式是在計算當下影格,在我標示(這邊很重要的註解),『 Animation 總長度 * Animation NormalizedTime * Animation Frame Rate』,如此一來產出的浮點數就會跟你的Animation拉影格的視窗顯示數字相同。

可以上方Demo影片,如此一來就可以非常精確的偵測你的Animation,並作出相對應的動作。

小結

本篇提供兩個方法讓大家遇到偵測Animation播放時可以去喚醒其他的動作,可以透過方法一的Animation Event,與方法二時時偵測Animation並客製化自己要觸發的Function,想必這兩種方法應該足以應付基本的Animation控制。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *