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

Commentsこの記事についたコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です