値をだんだんと変更する場合のコードにも色々書き方はありますが例として、完了するまでの時間と位置を指定して変更したい場合は以下のようなコードと挙動になります。
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;
}
}
等速移動のみを実装したい場合以上のコードでも十分ですが、トゥイーンさせたい場合は 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;
}
}
コードの内容にはほとんど差がありませんが、見た目の印象はかなり違います。
今回は Vector3 を対象としていますが、どのような値にも適用できます。