【Unity】使用動畫曲線 — AnimationCruve


有使用過Unity動畫狀態機的想必會覺得可以隨意新增Key來調整曲線這些功能很方便
那如果有天我只是想簡單做個事,像是把一張圖片放大,我個人會比較想能少一點東西就少一點東西,因此就可以使用到 AnimationCruve ,跟動畫機一樣可以調整曲線的類別。

關於AnimationCruve 在官方文檔中有詳細說明
https://docs.unity3d.com/ScriptReference/AnimationCurve.html

使用的時候就直接在腳本內宣告AnimationCruve

public AnimationCurve Curve;

在script外看來是這樣





夠簡單吧! 點開就能跟Animator一樣的使用了
點進去後可以操作keyframe,對某個keyframe點右鍵->editKey...可以設定他的值如下圖



















仔細看會看到上面的value跟time分別是旁邊的y軸跟x軸可以手動輸入比較精準

那要取出這些值呢,就是使用一個Evaluate方法(官方文檔),該方法就是丟入一個(time),他會返回一個(value)

那如果你要讓他像個動畫,想當然就是放在update裡面啦,不然你放在Start裡只會執行一次,也就是只拿到一個對應值而已
.
.
.
在這裡使用IEnumerator是因為我不想把放在Update裡面,然後又要每次停留1偵,不然while迴圈執行太快導致你看不清楚他有沒有變化

IEnumerator PlayAnimation()
    {

        float curveTime = 0f; 
        float curveAmount = Curve.Evaluate (curveTime);

        while (curveAmount<1.0f) {
        
            curveTime +=Time.deltaTime * Speed;
            curveAmount = Curve.Evaluate (curveTime);

            transform.localScale = new Vector3(curveAmount,curveAmount,curveAmount); //這裡我是把本身物件大小縮放

            yield return null;
        }
    }

先定義一個curveTime 將他當作曲線的time值(就上面講過的X軸的值)傳入
並且將curveTime隨時間增加,然後speed是我想比較方便控制他的速度才乘上去的
curveAmount = Curve.Evaluate (curveTime);這句就是把curveTime去查出對應的value是多少
之後就可以使用curveAmount來做動畫了,你可以改變物體大小...等很多事情
最後當然要等待下一偵啦,不然太快會看不到阿~

完整程式碼:

using UnityEngine;
using System.Collections;

public class WaveControl : MonoBehaviour {

    public AnimationCurve Curve;
    public float Speed;

    void Start () {
        StartCoroutine ("PlayAnimation");

    }

    IEnumerator PlayAnimation()
    {

        float curveTime = 0f;
        float curveAmount = Curve.Evaluate (curveTime);

        while (curveAmount<1.0f) {
        
            curveTime +=Time.deltaTime * Speed;
            curveAmount = Curve.Evaluate (curveTime);

            transform.localScale = new Vector3(curveAmount,curveAmount,curveAmount);

            yield return null;
        }
    }
}

====
16/10/5更:
忘記IEnumerator不能同時播放了XD
最後還是用回Update裡去了QQ
Share:
Read More