positionやlocalScaleのアニメーションをスクリプトで実装

Transformのアニメーションで、線形的な動きをするものはAnimatorを使うほど複雑でもないので、スクリプトで実装してみました。

Animatorは結構重たい処理らしいので、スクリプトで実装した方が良いはず。


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

public class ScaleControl : MonoBehaviour {

	Transform trans;
	[SerializeField] Vector2[] scales;  //scaleの配列
	[SerializeField] float[] intervals;  //遷移時間の配列
	[SerializeField] int offset;  //scalesの何番目の要素から始めるか
	[SerializeField] bool loop;  //アニメーションをループさせるか
	[SerializeField] bool playOnAwake;  //起動時からアニメーションさせるか
	float t;  //Time.deltaTimeを加算していく変数
	int state;  //現在のscalesの要素番号
	int scaleLength;  //scalesのLength
	public bool active;  //アニメーションさせるかどうか(外部から再生・停止できる)

	void Awake(){
		trans = transform;
		state = offset;
		scaleLength = scales.Length;
		active = playOnAwake;
	}

	void Update(){
		if (active) {
			t += Time.deltaTime / intervals [state];
			trans.localScale = (Vector3)Vector2.Lerp (scales [state % scaleLength], scales [(state + 1) % scaleLength], t);
			if (t >= 1f) {
				state++;
				t = 0;
				if (!loop && state + 1 == scaleLength) {
					active = false;
				}
			} 
		}
	}
}

今回の例ではlocalScaleのアニメーションですが、同様にしてpositionのアニメーションスクリプトも作れます。

rotationも若干異なりますが同様にして作れるので、必要なものを作っておくと便利。

コメント