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も若干異なりますが同様にして作れるので、必要なものを作っておくと便利。
コメント