using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveRepeat : MonoBehaviour {
Transform myTrans;
[SerializeField] Vector2[] positions;
[SerializeField] float[] durations;
int step;
float time;
int positionCount;
public bool move;
void Awake(){
if (positions.Length != durations.Length)
Debug.LogError ("positionsとdurationsの要素数が異なっています");
myTrans = transform;
step = 0;
time = 0f;
positionCount = positions.Length;
move = true;
}
void Update () {
if (move) {
time += Time.deltaTime / durations [step % positionCount];
myTrans.localPosition = Vector3.Slerp (
positions [step % positionCount],
positions [(step + 1) % positionCount],
time
);
if (time >= 1f) {
myTrans.localPosition = positions [(step + 1) % positionCount];
step++;
time = 0f;
}
}
}
}
今回は2Dゲームを作っているので2D仕様ですが、Vector3にすることで3Dゲームにも対応できると思います。
そこは各自でお願いします。
使い方としては、まず移動するオブジェクトにアタッチします。
インスペクタからpositionsに移動ポイントを指定。
durationsにはそれぜれの移動時間を指定。
durations[0]にはpositions[0]→positions[1]の間の時間を指定します。
繰り返すのでpositionsを4つ指定した場合は、positions[3]→positions[0]の時間がdurations[3]になります。
positionsとdurationsの要素数が一致していないとエラーが出るので注意。
bool型のmoveは外から止められるようにしただけなので、基本的には無視で大丈夫です。
不要なら消しちゃってください。
2座標間を往復させたい場合は要素数を2にすればできます。
下の例はキャラクターを上下に往復させて浮遊してる感を出したときのもの。
かなり幅広く使えると思うので、作っておいて損はないと思います!
コメント