概要
- 使用言語: C#。
- パスの作成: iTween Visual Editor。
- 作成したパス上でCube ObjectをiTweenで移動させる。
- 移動指示はユーザー操作で行う
- 操作:
PCならキーボードのA、D。
Androidなら左右の傾き(加速度センサ)。
Unity上の再生、実機又は、UnityRemote4で動作確認。
準備:
- Unityで新規プロジェクト作成。
- iTween Visual Editor パッケージをAsset Storeからインポート。
- CTRL+9でAsset Storeを開く。
- 「iTween Visual Editor」 で検索&インポート。
※iTween本体も同梱。別途入れる必要なし。入れるとエラーがでる。
- 一応ライトを追加しておく。
Hierarchyウィンドウ内のCreateボタンから、
Create > Direction Light
動かすObjectの追加
ここでは簡単にする為、Cubeを使う。Hierarchyウィンドウ内のCreateボタンから、
Create > Cube
にて、追加。
iTween Visual Editorでパス作成
■iTween Visual Editor スクリプトを追加
動かす Cube オブジェクトに iTween Visual Editor スクリプトを追加する。
- Hierarchy上でCubeを選択状態にする。
- 上部メニューバーから、
Component > Scripts > ITween Path
- Inspector上で ITween Path (Script) が追加される。
■パス名、ノード数を指定
- Cubeを選択状態にする
- Inspector で ITween Path (Script) が表示されていることを確認。
以後この欄内の設定を行う。
- Path Name:
パスの名前。ここでは、
MyPath
としておく。
※1つのオブジェクトに複数のパスを持つこともできる。その際はパス名で区別する。
- Path Color:
パスの表示色。とりあえずデフォルトのまま。
※複数パスを作成した際に色で区別しやすくできる。
- Node Count:
パスの基点の数。ここでは5箇所とする為、
5
としておく。
これで基点、中間点3つ、終点の計5箇所を設定できるようになる。
- Node 1 ~ 5
Node Countで 5 を指定したので、ここは Node 1 ~ 5 の5行になる。
- Path Name:
■パスを作る
この段階で、シーン上に5つのXYZ矢印を示すパスカーソルが重なって配置されている。これらはInspector上の Node1~5に対応している。
シーン上でこれらを操作して好みの移動パスを作成する。
CubeやDirection Lightが重なっていると選択しにくいので、これらを少しずらすと選択しやすい。
各パスを動かすと Inspector上の対応する Node n の欄XYZも変動する。
逆に Inspector上のNode nのXYZ値を変更するとパスカーソルもその位置に動く。
パスを増やしたい場合は Node Count を増やすことでNode n が増える。
※大量のNodeを配置する場合はとりあえず Node Countを少なめにして序盤のパスを配置後、Node Countを増やすという方法でもできる。
下図はパスを設定した画面
制御スクリプトの追加
- 新規スクリプトの追加
Projectウィンドウ内にて、
Create > C# Script
にて、C#スクリプトを追加。
- スクリプト名を変更。
ここでは cs_PathControl とした。
- スクリプト cs_PathControl をダブルクリックして開く。
- 後述のC#ソースをコピー&ペーストする。
- スクリプト追加
Cubeオブジェクトを選択状態として上部メニューより、
Component > Scripts > cs_Path Control
----- cs_PathControl
/* * @file cs_PathControl * @attention なし * @note なし */ using UnityEngine; using System.Collections; public class cs_PathControl : MonoBehaviour { Vector3[] NodeData; iTweenPath cp_ITweenPath; //!< Instance pointer for 'ITween Path' Script float PositionPercent = 0; //!< 0.00~1.00. パス全体の移動距離に対し%で指定する値 /*! * Visual Path Editorで作成済みのパスデータを取得 * @param[in] pathname 取得するパス名 * @return 取得結果 true:成功 false:失敗 * @note Visual Path Editorで作成済みのパスデータ Node 1~n を NodeData[]へ格納する * @attention 呼び出しタイミングはStart()以降とすること。 * iTweenPath.GetPath()内部のパス名リスト更新が OnEnable()のタイミングで行われている。 * よってAwakeではまだ確定していない場合がありえる為、Start()以降のタイミングで呼び出すこと。 */ bool SetPathPosition_from_ITweenPath(string pathname){ if(cp_ITweenPath==null){ cp_ITweenPath = GetComponent<iTweenPath>(); // このObject内の ITween path スクリプトコンポーネントのインスタンスを取得 if(cp_ITweenPath==null){ Debug.Log("[NO SCRIPT] No there script 'ITween Path' on this object"); return(false); } } // GetPath()はStatic宣言されているので直呼び出し NodeData = iTweenPath.GetPath(pathname); // Visual Path Editor のパス名を指定してパスデータを取得する。 if(NodeData==null){ Debug.Log ("[NOT FOUND/null] path name '"+pathname+"'"); return(false); } return(true); } const float addSpeed = 0.005f; void Drive_Increase(){ //Debug.Log ("Drive_Increase"); PositionPercent += addSpeed; if(PositionPercent>1.0f) PositionPercent = 1.0f; } void Drive_Decrease(){ //Debug.Log ("Drive_Decrease"); PositionPercent -= addSpeed; if(PositionPercent<0.0f) PositionPercent = 0.0f; } void Watch_UI_Input(){ bool drive_Fwd = false; bool drive_Bwd = false; //Begin: Control by Keyboard bool input_Key_A = Input.GetKey(KeyCode.A); bool input_Key_D = Input.GetKey(KeyCode.D); if( !(input_Key_A & input_Key_D) ){ // Disable multi press drive_Fwd |= input_Key_A; drive_Bwd |= input_Key_D; } //End: Control by Keyboard #if UNITY_ANDROID //#if UNITY_IPHONE //Begin: Control by Accel Sensor float accel_X = Input.acceleration.x; // 加速度センサ 横傾き //Debug.Log ("accel_X:"+accel_X); if(accel_X <-0.2f){ drive_Fwd |= true; } else if(accel_X >0.2f){ drive_Bwd |= true; } //End: Control by Accel Sensor #endif if (drive_Fwd) Drive_Increase(); if (drive_Bwd) Drive_Decrease(); if(drive_Fwd|drive_Bwd) Debug.Log("Position is "+PositionPercent*100.0f+"%"); //移動したなら表示 } void Start () { SetPathPosition_from_ITweenPath("MyPath"); } void Update () { Watch_UI_Input(); transform.position = iTween.PointOnPath(NodeData, PositionPercent); // Get target position } }-----
Unity5用プロジェクトサンプル: https://github.com/maruton/Sample_iTween_PointOnPath
その他メモ
移動速度
このサンプルでは移動速度は一定にしている。const float addSpeed = 0.005f;
の数値を動的に可変してやれば、加減速の調節できる。
パスの座標指定について
このサンプルの動作の肝は、iTween のPointOnPath()で、transform.position = iTween.PointOnPath(NodeData, PositionPercent);
にて、パス全体の移動長さに対して 0~1.0の間で移動位置を指定する部分。
この時与える NodeData は単なる Vector3の配列でしかない。
つまり、このデータ列が用意できるなら、特に iTween Visual Editor を使わなくても動作できる。
例えば、通過ポイントのようなオブジェクトがシーンに既に存在しているような場合、それらのXYZを得て、Vector3の配列に収めれておけば引数に利用できる。
iTweenPathスクリプト
iTween Visual Editorパッケージに含まれている。
このスクリプトのメンバ関数
static GetPath(string requestedName)
を使うと、Visual Editor でシーン上に配置したNodeの配列(Vector3)が簡単に得られる。
(関数型がStaticに注意。パスを複数作成すると、iTweenPathスクリプトも複数Component追加する為、それらのパス名を一意に管理する為にこうなっているようだ)
このスクリプトは単純に、シーン上でビジュアルエディットしたNodeの配置を単純なVector3配列で受け取れるものと解釈できるので、他の用途にも利用価値があるかもしれない。
0 件のコメント:
コメントを投稿