[Unity][iTween]インタラクティブウォークスルー

  • SumoMe

定まった一本道経路をボタンを押すことで進んだり、戻ったりなどは、ゲーム中の特定のイベントでよくある表現です。その動きをiTweenで簡単に実装することができます。

パス上に配置する

iTweenの機能で、パス上の特定の位置にオブジェクトを配置する機能が提供されています。以下のPutOnPath関数を利用することで実現できます。

PutOnPath(GameObject target, Vector3[] path, float percent)
PutOnPath(GameObject target, Transform[] path, float percent)
PutOnPath(Transform target, Vector3[] path, float percent)
PutOnPath(Transform target, Transform[] path, float percent)

4通りありますが、すべて同じ機能を実現しています。引数の型が違いますが、表しているものは同じで、以下の情報が必要になります。

  • taget:パス上に配置するゲームオブジェクト
  • path:移動するパス
  • percent:パスの距離を百分率で表した数値

path

pathはVector3やTransformの配列ですが、iTweenPathを利用すると、簡単に指定できます。iTweenの詳しくはこちらをどうぞ。

[Unity][iTween]iTween Path Editorの使い方

percent

percentはパスの始点から終点までを0.0 〜 1.0の範囲で指定します。始点は0.0、終点は1.0となります。

0.0 ≤ percent ≤ 1.0

実例

今回は、あらかじめ設定されたパス上をSphereオブジェクトが、”W”キーが押されたら前進、”S”キーが押されたら後退するシーンを作成します。

シーンの概要

配置したオブジェクトと作成したスクリプトは以下のとおりです。

  • Main Camera(カメラ(標準))
  • Sphere(Sphereオブジェクト)
  • movingOnPath(スクリプト)

パスを設定する

今回はパスを設定するためにiTweenPathを利用しました。設定したパスは以下の様な具合です。

createPath

このパスにはスクリプトから参照するため、「path」という名前をつけておきました。

スクリプトを作成する

スクリプト「movingOnPath」をSphereオブジェクトに付加し、編集しました。

using UnityEngine;
using System.Collections;

public class movingOnPath : MonoBehaviour {
	float distance = 0.0f;
	// Update is called once per frame
	void Update () {
		if(Input.GetKey(KeyCode.W))
			distance += 1.0f;
		if(Input.GetKey(KeyCode.S))
			distance -= 0.5f;
		float pathLength = iTween.PathLength(iTweenPath.GetPath("path"));
		float percent = distance/pathLength;
		if(percent < 0.0f) percent = 0.0f;
		if(percent > 1.0f) percent = 1.0f;
		iTween.PutOnPath(gameObject ,iTweenPath.GetPath("path"),percent);
	}
}

メンバ変数

distanceはパス上の道のりの距離を記録しておくための変数です。

Updateメソッド

キーが押された条件によって、進んだ距離を増やす(前進)したり、減らし(後退)ます。

現在の距離と総距離を利用して、現在の位置がパス上の何パーセントの位置にあるかを計算します。

現在の移動距離 / パスのすべての距離

位置をpercentで表しますが、0より小さかったり、1より大きい場合は意図とした結果となりません。かならず何かしら対処をしてください。今回は案チョックに、0未満、1より大きくならないようにしました。

実行した結果は以下のようになりました。今回は確認しやすくするために、パスを線で表示できるようにしました。実行しても線は表示しません。

movingonpath

ポイント

  1. 現在の移動距離 / パスのすべての距離 で現在の位置がパス上の何パーセントの位置なのか計算できる
  2. iTween.PathLengthメソッドでパスの総距離が求まる
  3. iTweenPath.GetPathメソッドで設定したパスをVector3の配列として得ることができる
  4. iTween.PutOnPathメソッドで任意のパス上の場所にオブジェクトを配置する

パスの進行方向を向く(追記 8/13)

上記の方法では、確かにパス上をキーに反応して前後しますが、向きは変わっていません。球だから確認しづらいですが、Rotateの値を監視してもらうとわかると思います。そこで、パスの進行方向を向かせます。

戦略

進行方向を向くということは、未来の自分のいる予定の位置を向いているということなので、以下の方法で実現できます。

  1. 現在の位置より、ほんのすこし進んだ位置を求める
  2. オブジェクトの向きを未来の位置に向ける
	void Update () {
		if(Input.GetKey(KeyCode.W))
			distance += 1.0f;
		if(Input.GetKey(KeyCode.S))
			distance -= 0.5f;
		float pathLength = iTween.PathLength(iTweenPath.GetPath("path"));
		float percent = distance/pathLength;
		if(percent < 0.0f) percent = 0.0f;
		if(percent > 1.0f) percent = 1.0f;
		iTween.PutOnPath(gameObject ,iTweenPath.GetPath("path"),percent);
		// 少し先の位置(percent+0.01←この数値は任意)を取得(戦略1)
		Vector3 fpos = iTween.PointOnPath(iTweenPath.GetPath("path"),percent+0.01f);
		// 少し先の位置を向かせる(戦略2)
		gameObject.transform.LookAt(fpos);
	}

これで進行方向を向くはずです。球体では向きの確認がしづらいので、立方体などを使うと確認できると思います。

おわりに

設定したパスを自動で移動させることはiTweenの標準機能で実現することができます。ユーザの反応によってパス上の位置を移動させる方法はちょっとしたテクニックがあれば実現は非常に用意です。これで、イベントシーンなどのウォークスルーを簡単に実装できるのではないでしょうか。