【Unity】使用動畫曲線 — AnimationCurve

有使用過Unity動畫狀態機的想必會覺得可以隨意新增Key來調整曲線這些功能很方便

那如果有天我只是想簡單做個事,像是把一張圖片放大,我個人會比較想能少一點東西就少一點東西,因此就可以使用到 AnimationCruve ,跟動畫機一樣可以調整曲線的類別。

關於AnimationCruve 在官方文檔中有詳細說明

https://docs.unity3d.com/ScriptReference/AnimationCurve.html

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

1
public AnimationCurve Curve;

在script外看來是這樣

img

夠簡單吧! 點開就能跟Animator一樣的使用了

點進去後可以操作keyframe,對某個keyframe點右鍵->editKey…可以設定他的值如下圖

img

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

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

那如果你要讓他像個動畫,想當然就是放在update裡面啦,不然你放在Start裡只會執行一次,也就是只拿到一個對應值而已

.

.

.

在這裡使用IEnumerator是因為我不想把放在Update裡面,然後又要每次停留1偵,不然while迴圈執行太快導致你看不清楚他有沒有變化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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來做動畫了,你可以改變物體大小…等很多事情

最後當然要等待下一偵啦,不然太快會看不到阿~

完整程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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