アニメーションカーブをスクリプトで使う

投稿者: | 2020-02-15


アニメーションカーブをスクリプトで使ってみます。

シーン上のSphereオブジェクトにスクリプトを付けました。

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

public class animationCurveTestScript : MonoBehaviour
{
    [SerializeField]
    AnimationCurve animationCurve; // アニメーションカーブを宣言

    Vector3 startPos; // スタート時のSphereの位置
    Vector3 pos; // 現在のSphereの位置
    float n; // カーブの横軸の値

    // Start is called before the first frame update
    void Start()
    {
        n = 0f;
        startPos = transform.position; // スタート時のSphereの位置を記録
        StartCoroutine("MoveSphere");

    }

    // Update is called once per frame
    void Update()
    {

    }

    IEnumerator MoveSphere()
    {
        while (true)
        {
            pos = transform.position;
            pos.x = n * 10 + startPos.x; // カーブの横軸の値の10倍 + スタート時のX座標 → 今のX座標
            pos.y = animationCurve.Evaluate(n) * 10 + startPos.y; // カーブの縦軸の値の10倍 + スタート時のY座標 → 今のY座標
            transform.position = pos;
            n += 0.01f;

            yield return new WaitForSeconds(0.01f);

            if (n > 1) yield break;
        }
    }

}

[SerializeField]をつけるかpublicでAnimationCurve型の変数を宣言すると、インスペクタにアニメーションカーブがあらわれます。

これをクリックするとウィンドウが出て、アニメーションカーブを編集できます。

下部のアイコンをクリックするとプリセットが使えます。プリセットは、縦軸も横軸も0~1の値をとります。

AnimationCurve.Evaluateメソッドの引数に横軸の値を入れると、縦軸の値が返ってくるので、横軸の値をSphereのトランスフォームのX座標、縦軸の値をY座標の値に使うことで、このカーブに沿ってSphereを動かせます。

プリセットから別のカーブを選ぶと、Sphereの動きも変わります。

直線でなく、下方向にたわんだようなカーブになりますが、値の範囲は0~1のままです。

このカーブの通りに、Sphereの動きも変わります。

カーブの点はドラッグアンドドロップで動かせます。

何も無いところでダブルクリックすると、その位置までカーブを延長できます。

カーブの端の歯車アイコンから、自分で設定した点より後のカーブをどう延長するか選べます。

ループを選ぶと始点から終点までが繰り返されます。

何度もダブルクリックで延長して自由にカーブを編集できます。

カーブの端が画面から外れてしまったら、スクロールバーの端をドラッグすることで、表示を拡大縮小して戻せます。

透明度やスケールなどいろいろな値に使えます。

//void Start()
meshRenderer = GetComponent<MeshRenderer>();
//color = meshRenderer.material.color;
color = meshRenderer.material.GetColor("_BaseColor"); // マテリアルのインスペクタで設定した色を取得

StartCoroutine("MoveSphere");

//----
// IEnumerator MoveSphere()
color.a = 1 - animationCurve.Evaluate(n); // カーブの縦軸の値によって透明度を変える
meshRenderer.material.SetColor("_BaseColor", color); // 色をセットする            

float s = 1 + animationCurve.Evaluate(n) * 4;
transform.localScale = new Vector3(s, s, s); // スケールを変える

縦軸の値が1だと color.a が0になって、Sphereが全く見えなくなるので、0.9くらいまでにしています。

コメントを残す

メールアドレスが公開されることはありません。