有使用過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