2014年1月25日土曜日

Unity - iTween メモ

iTweenはAction script3のTweenのUnity版的なもの。3Dでスムーズな動きを作りやすい。

言語はC#で使ってみた。

iTween公式サイト: iTween



iTween:
  • iTween本体。無料、商用可。
  • 入手方法
    UnityのAssetStoreから入手。
    ※後述 iTween Visual Editor にはiTween本体は同梱されている。
    iTween Visual Editor を使う場合は、iTween本体は別途入れる必要なし。
    両方入れるとエラーになるので注意。


iTween Visual Path Editor:
  • iTween用の移動パス作成を支援するUnityのアドオン。
  • 入手方法
    Asset Store又はサイトから入手可。

    • Asset Storeから入手:
      Unity上から CTRL+9でAssets Storeを開きiTween Visual Editor で検索。
       
    • 公式サイトから入手: VISUAL ITWEEN PATH EDITOR
      UnityのAssetにドラッグ&ドロップでインストール。

    Asset Storeから入れるのが楽。iTween本体も同梱されているので iTween本体パッケージは不要(両方入れるとエラーになる)。

  • UnityのIDE画面上ではコンポーネントの一種として利用するような形になっている。
     
  • 公式ページにある動画がわかりやすい(ただし英語) → Visual editor for iTween motion paths


iTween Visual Path Editorがスゴイ。操作がシンプルなのに良く出来てる。

足りないなぁと思う機能は別途コードで実装できるようなしくみがiTweenのクラスで用意されている。



以下、iTweenメモ。



■iTween Visual Path Editorで作成したパスを使う

iTween.MoveTo(gameObject,
        iTween.Hash("path", iTweenPath.GetPath("MyPath") , "time", 5);
"path"で次のパラメータ属性をパスであることを指定。
"MyPath"はUnity上のiTween Visual Path Editorで作成したパス。
"time"で次のパラメータ属性が時間であることを指定。5 は秒数。この場合は5秒間で先のパスを実行する。



■iTween Visual Path Editorで作成したパスを逆順に使う

往復動作をさせたい場合PingPong等の指定もあるが、これは往復動作をLOOPで実行するので片道には使いにくい。
なのでiTween Visual Path Editorで作成した片道分のパスを逆順に取得する GetPathReversed()を使う。

iTween.MoveTo(gameObject,
        iTween.Hash("path", iTweenPath.GetPathReversed("MyPath") ,
        "time", 5);


■データ構造について

元ソースを読んだわけではないので確証は取っていない。が、「なんとなく」雰囲気では、
追記:ソースは iTweenPath.cs。各変数はpublicなのでパスデータへもアクセスできる

  • パスはArray配列のようなイメージでシンプルにVector3をList型でXYZ座標値データを格納している。
     
  • iTween Visual Path EditorXYZ座標値データ列をパス名で紐付けている。
     
  • iTween クラスの iTweenPath.GetPathでパス名XYZ座標値データを引っ張ってくる。
     
  • iTween.MoveTo()等の引数は
    ハッシュ名, パラメータ
    という規則性があることが伺える。※よくある可変数パラメータの引渡し方
と、いうことがなんとなくわかったところで次項移行の動作を試行確認。




■iTween開始、終了をコールバックさせる
using UnityEngine;
using System.Collections;

public class cs_iTWTest : MonoBehaviour {
 const float Time_Default = 0.5f;

 Hashtable table = new Hashtable();
 void Start () {
  table.Add( "path", iTweenPath.GetPath("MyPath") );//ITween path hash data
  table.Add( "time", Time_Default );
  table.Add( "easetype", iTween.EaseType.easeInOutSine );
  table.Add( "onstart", "cb_iTweenStart" );  //Handler func when iTween start
  table.Add( "onstartparams", "Start" );   //parameter of Handler func when iTween start
  table.Add( "oncomplete", "cb_iTweenComplete" ); //Handler func when iTween end
  table.Add( "oncompleteparams", "Complete" ); //parameter of Handler func when iTween end
  iTween.MoveTo(gameObject, table);
 }
 void cb_iTweenStart(string param){
  Debug.Log("[iTween] cb_iTweenStart: "+param);
 }
 void cb_iTweenComplete(string param){
  Debug.Log("[iTween] cb_iTweenComplete: "+param);
 }
 void cb_iTweenUpdate(float value){
  camera.orthographicSize = value;
 }
}

引渡しパラメータ用に Hashtable 型のtable を使用。そこに各種いろいろ詰め込んで最後にiTween.MoveTo()へ渡して処理。
そのパラメータの中に、
  • onstart: 開始時コールバック関数指定
  • onstartparams : 開始時コールバック関数へのパラメータ指定
  • oncomplete: 終了時コールバック関数指定
  • oncompleteparams: 終了時コールバック関数へのパラメータ指定


があるので、それを使う。




■回転拡大、カメラなど
回転、拡大を行うiTween関数は一応ある。それらの指定方法は、
  • 現在~最終的な回転角度を指定秒数で実行する
というもの。
移動もこれと同じ概念で、
  • 現在~最終的な位置へ指定秒数で実行する

となる。なので2つを同時に実行開始すればおおむねは期待する結果になる。※1つの関数で両方同時にはできない様子。
しかしラグ(?)が絡むとずれそうな気配もある。また、Unityのカメラを、

camera.orthographic = true;
camera.orthographicSize = 10f;

として camera.orthographicSize を動的に変化させてカメラビュー内の拡大率を変える場合、これに相当する引数がパッと見用意されていないように思える(ひょっとしたらあるのかもしれない?)。

そういう際に以下のような感じで実現できる。

呼び出し側
iTween.MoveTo(gameObject, table);
iTween.ValueTo(gameObject, iTween.Hash("from", 12.3f, "to", 5.0f, "time", 1, "onupdate", "cb_iTweenUpdate" ));

コールバック関数
void cb_iTweenUpdate(float value){
 camera.orthographicSize = value;
}
iTween.ValueTo()で自前コールバック関数内で処理を書ける。

上記コードはカメラの拡大率を1秒間で12.3~5.0に変動させる。コールバック関数は1フレーム毎に呼び出される。



3Dでも簡単にiTweenできるのはかなり楽ですね~。ちょっと感動。


0 件のコメント:

コメントを投稿