【Unity】複数の目的地を通って動く床を作ってみた
2016年10月27日

【Unity】複数の目的地を通って動く床を作ってみた

ゲームをやっていると床が離れた場所との間を行ったり来たりしていることがありますよね? 今回はその動く床をUnityで作ってみたいと思います。

今回作る動く床は2か所以上の目的地を設定し、その目的地を通って往復するというものです。
単純な動きですが、敵の巡回なんかにも使えると思います。

まずは空のゲームオブジェクトを作成し、名前をMoveFloorにします。
ポジションを(0,0,0)にします。
ポジションは適当でも大丈夫ですが、(0,0,0)にしておくと後で子オブジェクトを配置する際に座標がワールド座標と同じになるので分かりやすいと思います。

空のオブジェクトMoveFloorを配置。

次は移動させる床を配置します。
MoveFloorの子オブジェクトとしてキューブを配置し、名前をmFloorと適当につけます。
サイズは(5,1,5)にしました。
ポジションは普通の床から少し浮いた適当な場所にします。

MoveFloorの子オブジェクトに動かす床mFloorを配置。

白いままでは味気ないのでテクスチャを貼り付けました。

mFloorにテクスチャを貼った。

mFloorの移動先になる目的地を配置していきます。
MoveFloorの子オブジェクトとして移動させたい目的地の数だけ空のゲームオブジェクトを作ります。
名前はTarget1、Target2といった具合に適当に付けます。

ポジションは移動させたい場所に適当に設定します。
今回は(-5,1.5,0)、(0,5,10)、(5,1.5,0)の3か所に目的地を配置しました。

空のゲームオブジェクトを目的地に配置。

次は床を動かすためのスクリプトを作ります。
プロジェクトウィンドウでJavascriptのファイルを作成し、名前をMoveFloorにしてファイルを開きます。

開いたファイルに下記のコードを書きます。

#pragma strict

public var moveFloor : GameObject;       //移動させる床
public var TargetPoint : GameObject[];    //目的地
public var moveSpeed : float = 5;         //移動速度

private var Target : int = 0;             //TargetPointの配列の番号
private var count : int;                  //TargetPointの長さ
private var ReturnPath : boolean = false; //復路かどうか

function Start () {
	count = TargetPoint.Length;
}

function Update () {
	//動く床が目的地に着いたら次の目的地を設定する
	if(moveFloor.transform.position == TargetPoint[Target].transform.position){
		if(ReturnPath){
			Target --;
			if(Target < 0){
				Target = 1;
				ReturnPath = false;
			}
		} else {
			Target ++;
			if(Target >= count){
				Target = count - 2;
				ReturnPath = true;
			}
		}
	}

	Debug.Log(TargetPoint[Target]); //移動先の確認用。不要なら消してOK。
	moveFloor.transform.position = Vector3.MoveTowards (moveFloor.transform.position, TargetPoint[Target].transform.position, Time.deltaTime * moveSpeed);
}

スタート関数ではcountに目的地の数を代入しています。

次にアップデート関数を見ていきます。
まずif文で目的地に着いたかどうかを判定しています。
さらにif文で往路か復路かを判定し、復路であればTargetの値を1減らして次の目的地を設定しています。
そのときTargetの値が0より小さくなったらTargetを1にして次の目的地を設定し、ReturnPathをfalseにすることで往路に切り替えます。
elseの後はその逆のことなので説明は省きます。

Debug.Log(TargetPoint[Target]);はコンソールウィンドウで移動先を確認するためのものなので消してOKです。

最後にVector3.MoveTowardsを使って目的地まで床を移動させます。
Vector3.MoveTowards(現在地, 目的地, 移動速度)で目的地まで一定の速度で移動することが出来ます。
このVector3.MoveTowardsをVector3.LerpやVector3.Slerpに変えても少し違った動きをするので場面によっては変えても良いかもしれません。
Vector3.Lerpにすると僕のイメージではUFOのような感じの動きになります。

2Dでこのスクリプトを使う場合はVector3をVector2に変えれば多分OK。

書き終えたら保存してヒエラルキーにあるゲームオブジェクトのMoveFloorにスクリプトをアタッチします。

MoveFloorスクリプトをゲームオブジェクトMoveFloorにアタッチ

インスペクターから今加えたスクリプトのMove FloorにmFloorを入れ、Target PointのSizeを目的地の数に設定し、Elementに先ほど配置した目的地の空のゲームオブジェクトを入れます。

Target PointのSizeを変更して目的地を設定。

これで動く床は完成です!
試しに動かしてみるとこんな感じになります。

動く床完成。

途中動きがカクカクした感じになってるのは僕のPCのスペックが足りてないので動画を撮りながら動かすのがきついからなだけで、実際にはちゃんと動いています。
設定した目的地をちゃんと通って移動しているのが分かると思います。

あとはこのMoveFloorをプレハブにすればOKです!
これで穴の上を移動する床を作ったり高い場所へ移動する床を作ったり出来ますね!

でもこの床にはまだ問題点があります。
それはこの床にキャラクターコントローラーで動かしているキャラを乗せても一緒に移動しないのです。

どういうことかというと次の画像を見てください。

動く床に乗ってもキャラクターは移動しない。

床は動いてるのにキャラクターは床に乗ってもその場から動かずに落ちてしまっていますね。

長くなってしまったのでこの解決方法はまた今度書くことにします。

【Unity】動く床に乗った時、キャラクターも一緒に移動するようにする方法
スポンサードリンク
タグ:JavaScript UNITY
posted by ナオ at 17:37 | Comment(0) | Unityの使い方メモ
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]