移動を繰り返すスクリプト


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にすればできます。

下の例はキャラクターを上下に往復させて浮遊してる感を出したときのもの。

かなり幅広く使えると思うので、作っておいて損はないと思います!

コメント