iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0

今天就要開始做與芬蘭合作的實驗了,因為會需要大量的時間處理實驗的數據,所以今天就簡短針對一些小功能進行說明。之前看到一篇Paper,也就是 CHI 的 Expanding The Bounds of Seated Virtual Workspaces 這邊文章,內部有使用到 Unity 的 Animation Curve,所以出於好奇我就去Unity 官方網站學習了解 Animation Curved 的使用方法,並從實作中熟悉。

建置場景

  1. 首先設置 Sphere 並且將文本 ActivationCurveTutorial 拉進去 Sphere Object 當中。

開始撰寫腳本

  1. 首先我們 宣告AnimationCurve 在我們的文本中。宣告我們Animation Curve 的物件,以及我想要透過Animation Curve移動的物件。
public AnimationCurve aniCurve1 = new AnimationCurve();
public AnimationCurve aniCurve2 = new AnimationCurve(new Keyframe(0,0), new Keyframe(10, 10));
public GameObject moveObj:
  • 第一個 airCurve1 是沒有設定任何範圍的 AnimationCurve (aniCurve1)。

  • 第二個 airCurve2 是有設定範圍的 AnimationCurve 為 ( time, value),透過Keyframe 來設定起始點。

  1. 接著是我們的 Move Obj ,將 剛剛的物件 Ball放入進我們的環境中。

  2. 指定等等物件的速度。

float speed = 10f;
  1. 首先我們要引用 Animation Curve 需要知道該 Evaluate 是取得該 x 軸 (time) 下的資料。以下方式取得。所以說需要先設定一個累加的時間。所以 Time 為 X軸的參數。 getValue 是我們在 time 的時間下取出的數值。
float _time;
_time += Time.deltaTime;

float _getValue = aniCurve1.Evaluate(_time);
  1. 接下來我們將該數值放入 Object 的 X軸,幫助我們可以隨時間決定物件 X軸的位置,且物件會隨時間往前,所說就先將 _time 直接放到 Z軸,所以說 Z軸會每秒往前一次。
moveObj.transform.position = new Vector3(_getValue, 0f, _time);
  1. 我們知道說 距離 = 速度 * 時間的變化量,所以說可以宣告 speed = 10f 來進行調整速度。
distance = speed * time 
  1. 接下來撰寫控制方式,我們這邊就是按下 k 為停止移動,點選 l 則為開始移動。這邊就先放所有的程式碼。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AnimationCurved : MonoBehaviour
{
    public AnimationCurve aniCurve1 = new AnimationCurve();
    public AnimationCurve aniCurve2 = new AnimationCurve(new Keyframe(0, 0), new Keyframe(10, 10));
    public GameObject moveObj;

    float speed = 10f;
    float _time;

    bool startMove = false;
    
    void Update() {

        if(Input.GetKeyDown("l"))
        {
            startMove = true;
        }
        if(Input.GetKeyDown("k"))
        {
            startMove = false;
            Vector3 preposition = moveObj.transform.position;
            moveObj.transform.position = preposition;
        }

        if(startMove)
        {
            ObjMove();
            Debug.Log("Move Obj Position: " + moveObj.transform.position);
        }

        
       
    }

    void ObjMove()
    {
         _time += Time.deltaTime;
        float getValue = aniCurve1.Evaluate(_time);
        moveObj.transform.position = new Vector3(getValue, 0f, _time);
    }

   
}
  1. 回到 Unity 中你可以設定 Ani Curve 1 的參數 ,自己去調整你每秒位移 X軸的變量,我們執行後就可以發現在不同時間(s)下,X軸位移的量也會不相同。物體會隨時間擺動 X 方向的位置。

  2. 解著點選執行,觀察 Console 顯示該 MoveObj 的位置隨著時間改變。

新增 TrailRenderer

  1. 接下來新增該Component TrailRenderer 在我們的MoveObj物件中。類似之前說明的 LineRenderer,所以說這邊我就先不做太多說明。

  2. 對了務必記得要在 Material 新增該 Default Line 。避免掉沒有材質。

  3. 那我就不多廢話直接上程式碼。

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

public class AnimationCurved : MonoBehaviour
{
    public AnimationCurve aniCurve1 = new AnimationCurve();
    public AnimationCurve aniCurve2 = new AnimationCurve(new Keyframe(0, 0), new Keyframe(10, 10));
    public TrailRenderer trail;
    public GameObject moveObj;

    float speed = 10f;
    float _time;

    bool startMove = false;

    void Start() 
    {
        trail = GetComponent<TrailRenderer>();
        if(trail == null)
            trail = gameObject.AddComponent<TrailRenderer>();

        trail.startWidth = 0.2f;
        trail.endWidth = 0.2f;
        trail.startColor = Color.white;
        trail.endColor = Color.white;
    }
    
    void Update() {

        if(Input.GetKeyDown("l"))
        {
            startMove = true;
        }
        if(Input.GetKeyDown("k"))
        {
            startMove = false;
            Vector3 preposition = moveObj.transform.position;
            moveObj.transform.position = preposition;
        }

        if(startMove)
        {
            ObjMove();
            Debug.Log("Move Obj Position: " + moveObj.transform.position);
        }

    }

    void ObjMove()
    {
         _time += Time.deltaTime;
        float getValue = aniCurve1.Evaluate(_time);
        moveObj.transform.position = new Vector3(getValue, 0f, _time);
    }
   
}
  1. 回到 Unity 改變一下 TrailRenderer 的顏色。 藍加紫最對味。

  2. 我們把 AnimationCurve 1 調整如下,若要新增轉折節點點選兩下即可。

  3. 執行結果如下,點選鍵盤 L 會看到該物件根據 Animation Curve 的設定隨時間改變X軸的方向。很酷八! 其實也不一定要使用在這種路徑上的變化,改變自身Animation Curve 可以有效的去控制其他想要的非線性結果。

結論

  1. 今天使用到 Animation Curve 作為隨時間位移改變彎度方向的方法。Animation Curve 其實在很多地方都很好使用,比如速度上的變化,距離上的變化等都可以根據該Animation Curve 去做調整。
  2. Animation Curve 利用 new Keyframe(x, y) 可設定起始與終點的參數數值,並且也可以自行設定 Curve 上的節點。透過 new Keyframe 會更好設定較大的數值。
  3. 透過 Key 來停止當前物件的移動,或是讓物件持續移動。

上一篇
Day6: Combination with RaycastHit and Line Renderer
下一篇
Day8: Generate and Delete Random Position Object
系列文
Unity 基本功能實作與日常紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言