LoginSignup
5
4

More than 5 years have passed since last update.

AnimationCurveを使って値を変化させる

Posted at

値をだんだんと変更する場合のコードにも色々書き方はありますが例として、完了するまでの時間と位置を指定して変更したい場合は以下のようなコードと挙動になります。

LinearMove.cs
using UnityEngine;
using System.Collections;

public class LinearMove : MonoBehaviour {

    [SerializeField] private Vector3 destPos;
    [SerializeField] private float tweenTime;

    private bool isMoving = false;

    // Use this for initialization
    void Start () {
        StartCoroutine(MoveCor());
    }

    IEnumerator MoveCor()
    {
        if (isMoving) yield break;
        isMoving = true;

        var startTime = Time.time;
        var initPos = transform.position;

        while (Time.time - startTime < tweenTime)
        {
            float rate = (Time.time - startTime) / tweenTime;
            transform.position = Vector3.Lerp(initPos, destPos, rate);
            yield return new WaitForEndOfFrame();
        }

        transform.position = destPos;
        isMoving = false;
    }
}

movepos1.gif

等速移動のみを実装したい場合以上のコードでも十分ですが、トゥイーンさせたい場合は AnimationCurve を使えばとても簡単に実装できます。

TweenMove.cs
using UnityEngine;
using System.Collections;

public class TweenMove : MonoBehaviour {

    [SerializeField] private Vector3 destPos;
    [SerializeField] private float tweenTime;
    [SerializeField] private AnimationCurve tweenCurve = AnimationCurve.EaseInOut(0, 0, 1, 1);

    private bool isTweening = false;

    // Use this for initialization
    void Start () {
        StartCoroutine(MoveCor());
    }

    IEnumerator MoveCor()
    {
        if (isTweening) yield break;
        isTweening = true;

        var startTime = Time.time;
        var initPos = transform.position;

        while (Time.time - startTime < tweenTime)
        {
            float rate = (Time.time - startTime) / tweenTime;
            var curvedRate = tweenCurve.Evaluate(rate);
            transform.position = Vector3.Lerp(initPos, destPos, curvedRate);
            yield return new WaitForEndOfFrame();
        }

        transform.position = destPos;
        isTweening = false;
    }
}

movepos2.gif

コードの内容にはほとんど差がありませんが、見た目の印象はかなり違います。
今回は Vector3 を対象としていますが、どのような値にも適用できます。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4