iTweenを使っての複合動作

Unityでトゥイーンを使いたい時に調べるとすぐ目にするiTween。
無料のトゥイーンエンジンなのだが1つのオブジェクトに複数のmoveToを適用しようとするとうまいこといかない。

調べると親に空のオブジェクトを作り親と子別にmoveToすりゃうまくいくよって書いてあったんだけどそれでもなぜか片方のmoveToしか上手く動かなかった。

どうにかそれを回避するためにvalueToを使用した方法をメモしておく。

・やりたいこと
iTween.MoveTo(gameObject, iTween.Hash(“x”, 5, “time”, 3.0f, “easetype”, “easeInOutQuad”));
iTween.MoveTo(gameObject, iTween.Hash(“y”, 5, “time”, 2.0f, “delay”, 1.0f, “easetype”, “easeInOutQuad”));
iTween.RotateTo(gameObject, iTween.Hash(“y”, 180, “time”, 2.0f, “delay”, 1.0f, “easetype”, “easeInOutQuad”));

・以下対応処理
//###################################################
//iTWEEN TRANSFORM SETTING
//###################################################
public Vector3 posVec3;
public Vector3 rotateVec3;
void UpdatePosX( float _para ){ posVec3.x = _para; UpdatePR(); }
void UpdatePosY( float _para ){ posVec3.y = _para; UpdatePR(); }
void UpdatePosZ( float _para ){ posVec3.z = _para; UpdatePR(); }
void UpdateRotateX( float _para ){ rotateVec3.x = _para; UpdatePR(); }
void UpdateRotateY( float _para ){ rotateVec3.y = _para; UpdatePR(); }
void UpdateRotateZ( float _para ){ rotateVec3.z = _para; UpdatePR(); }
void UpdatePR()
{
 transform.position = posVec3;
 transform.rotation = Quaternion.Euler(rotateVec3);
}
//###################################################

void Start () {
 posVec3 = transform.position;
 rotateVec3 = transform.rotation.eulerAngles;
}

//上記を書いた上で実行したいタイミングで以下
iTween.ValueTo(gameObject, iTween.Hash(“from”, posVec3.x, “to”, 5, “time”, 3.0f, “easetype”, “easeInOutQuad”, “onupdate”, “UpdatePosX”));
iTween.ValueTo(gameObject, iTween.Hash(“from”, posVec3.y, “to”, 5, “time”, 2.0f, “delay”, 1.0f, “easetype”, “easeInOutQuad”, “onupdate”, “UpdatePosY”));
iTween.ValueTo(gameObject, iTween.Hash(“from”, rotateVec3.y, “to”, 180, “time”, 2.0f, “delay”, 1.0f, “easetype”, “easeInOutQuad”, “onupdate”, “UpdateRotateY”));

なんで上のが上手くいかないかというと移動処理の場合はx,y,zを個別ではなくセットでtransformに入れないといけないせいらしい。
つまり他のトゥイーンで上書きされ中は他のトゥイーンがまともに動かないぽい。
サンプルのFlythrough使ってもいいんだけどやるまでに手数が多いのとそこまで細かくてながい動きを求めていないときは面倒。
対応処理で上手くいくものの、もっとスマートにならないものか。

NGUIメモ1

取り急ぎNGUIが何者なのかを把握するために、
簡単に初期設定をやってくれるCreate a New UIやCreate a Widgetは使わないで
色々試してみる。
上記の物を使うとRoot->Camera->Anchor->Panel->以下パーツ
な階層が作られる。

まずパーツだけ作成した場合
「デフォルトのカメラ+(空Objを作ってUISprite(Basic)等を適用)」
は何も表示されない。

「(空Obj+UICamera)+(空Obj+UISprite(Basic)等)」
でも表示されない。

「(空Obj+UICamera)+(空ObjB->(空ObjA+UISprite(Basic)等))」
だと表示された。

なぜなのかよく見てみると、
UISpriteコンポーネントを付加した空ObjAの親である空ObjBに
自動的にUIPanelコンポーネントが付加されていた。
各パーツはUIPanelを付加されたオブジェクト内でしか表示されないのようだ。
その場でUIPanelを削除しても光速で再びUIPanelが追加された。。
ツールを使って初期セットが作成されるがパーツがPanel以下になってるのはこのせいね。

しかしCameraとPanelは並列に置いてるけどなんら問題はなさそう。
一緒に動かすために一括りにしているのか。。な?
…何かへんなこと起こるのかな?(´・ω・`)知ってたらだれかオセーテ。
NGUIパーツと通常の3Dデータとの深度処理に影響がでた。

さて一個上のAnchor、これはいったいなんの訳に立つのか。
いじってみた感じAnchorの子要素を画面の9箇所に寄せることができる。
ただ2箇所異なった場所にパーツを別々に固定する場合はAnchorが2個必要みたい。
それならPanel->Anchor->各パーツな階層でいい気がした。ってかしてる。
Anchor分Panel作らなくていいしね?
…ここも何かへんなこと起こるのかな?(´・ω・`)知ってたらだれかオセーテ。
Anchorはついでに、常に画面の寸法に合わせてオブジェクトを
スケーリングするために使用できるよう?

さて一番上のRootは必要あるのかってとこまで登ってきたわけだけど、、、
訳すと
ゲームオブジェクトのスケーリングを2/(Screen.height)に保持するためのものらしい。
同時にUIOrthoCameraを使用しないでねとのこと。

・CameraのProjectionがPerspectiveの時はAnchorが無視される。
 完全2Dな画面用のorthographicの時だけ適用されるようです。

・カメラがPerspective時に、配置された3Dオブジェクトは
 NGUIパーツより後方に配置される。NGUIパーツのDepth関係なし。

 追記:ちゃんとRoot以下にcameraを設置したら、
    3Dオブジェクトが手前においた場合手前に表示された。

・どうしても透過処理が効かないなぁと思ったら
 サンプルはMaterialのshaderをUnlit/TransparentColoredに
 してたのでTransparentDiffuseからそれにしたら解決。

Unity小メモ1

◯環境光の調整

Edit -> RenderSettings -> Ambient Lightの色を変更

◯表示

・デフォルトの表示非表示の切り替えは
オブジェクト撰択後インスペクタの名前左側のチェックボタンのオンオフで。

◯スクリプト周り

・C#でスクリプトを作成時にインスペクタにメンバーを表示させたい場合は、
publicで宣言しないと表示されない。

◯書き出しサイズの変更

1.File -> BuildSettings で開いたウィンドウで、platFormを撰択。
2.下部のPlayerSettings…を押す。
3.インスペクタウィンドウのPer-Platform SettingsのResolutionでサイズを指定。

◯NGUIメモ

・テクスチャ

TexturePackerで作ったテクスチャと座標データで作ったAtlasは
プレハブ化しておき、透過png時はAtlas生成時に作るMaterialの
ShaderをDiffuseからTransparent/Diffuseに変更。

・テキストの途中で色を変更

Labelの文字入力欄内にて「あいう[FF0000]えお」な感じで途中で色を指定
途中で色を戻す場合は[-]を戻したいところで追加
Encodingチェックボックスをアクティブにすると反映される。

・ボタン

ボタン(image Button等)を作った場合は、
Component -> NGUI -> Interaction -> ButtonMessage
を追加した後、スクリプトファイル(A)を作って、
空のスクリプト用ゲームオブジェクト(B)を生成し、
AをBに貼り付ける。ボタンのTargetにBを指定。
A内にボタンから叩かれる関数を作成後、
ボタンのFunction Nameに今作った関数名を入力。
Triggerに任意のイベントを撰択する。

NGUIの導入

Unityでのインターフェイス周りについてのメモ。
使用バージョン NGUI:2.0.0 Unity:3.5.2

ろくにネイティブのGUI(ぐらふぃかるゆーざーいんたーふぇいす)周りを学ぶ前に、
評判がいいNGUIをいきなり使ってみる(オイ

・販売元

http://www.tasharen.com/

・ドキュメント

http://www.tasharen.com/ngui/docs/

・チュートリアル

http://www.tasharen.com/?page_id=197

以下チュートリアルを適当に訳しながら進めてみる

1:

AssetStoreでNGUIを購入しimportした後、
取り急ぎ最初に作成されているカメラを削除し(既存のプロジェクト使用時は省略)、

2:

◎メニュー -> NGUI -> Create a New UI で開くウィンドウでベースを作成
Layer:Default
Camera:Simple2D

進む前に作成された内容を確認。
・UI Root(2D) はUIRootスクリプトを持っていて、
ゲーム世界の領域と比較して2/ScreenHeightでリスケールされている(いまいち訳が分からず)
・CameraオブジェクトはカメラとUICameraスクリプトを含んでいる。
UICameraスクリプトはNGUIのevent systemを含んでいる。
・AnchorはUIAnchorスクリプトを含んでいる。
windowsは半ピクにしてあるとか…(いまいち訳が分からず)
・PanelはUIPanelスクリプトを持っている。
UIPanelはその下に全てのUIウィジェットを持っており、
数回の描画で結合することを可能にする。

つまり、いろいろなパーツはPanel以下に追加してって
UIを構成していくってことですね。

3:

◎メニュー -> NGUI -> Create a Widgetで開くウィンドウで各パーツを作成

・このウィザードで基本的なウィジェットを作成することができる。

Atlas:使用テイスト(後々オリジナルのAtlasを作成し、実装していくもの)

・オリジナルAtlasを作成

ざっくりな流れは…
Texturepackerってソフトでテクスチャ作って(テクスチャの各パーツの座標ファイルも)
Unity3D用のデータを書き出ししてUnityに入れてAtlas化らしい。
参考サイト様:http://terasur.blog.fc2.com/blog-entry-122.html

Font:使用フォント(こちらも使用フォントを用意する)

・使いたいフォントの作成

ざっくりな流れは…
BitmapFontGeneratorでフォントのテクスチャ画像等を作って
Unityに読み込んでAtlasの準備をしてフォントを登録。
参考サイト様:http://terasur.blog.fc2.com/blog-entry-108.html

Templete:
・Label(テキストを表示)
・Sprite(単純にスプライトをそのまま表示)
・Sliced Sprite(9-slicingが使用されている。拡縮してもエッジ部分が劣化しない)
・Tiled Sprite(拡縮しても引き伸ばされず、パターンで敷かれていく)
・Filled Sprite(表示に関して特殊なパラメータが用意されている。弧を描くように表示していく等)
・SimpleTexture(Assetからマテリアルを指定して表示)
・Button(ボタンを作成。UIButton,UIButtonScale,UIButtonOffset,UIButtonSoundスクリプト等が適用される)
・ImageButton(Normal,Hover,Pressed等、通常時、マウスオーバー時、押下時を指定できるボタン)
・Checkbox(背景とチェックマークを指定できるチェックボックス)
・ProgressBar(背景と前景を指定できるプログレスバー)
・Slider(背景、前景、バー部分を指定できるスライダー)
・Input(背景指定できる入力欄)
・PopupList(背景、前景、ハイライトを指定できるポップアップリスト)
・PopupMenu(背景、前景、ハイライトを指定できるポップアップメニュー)
・ScrollBar(背景、前景、方向を指定できるスクロールバー)
Templete内容の選択によって下にでるオプションは変わる。

ウィジェット撰択時のインスペクター
・Depthで重なりを変更
・ColorTintでカラー変更

Cinema4dのデータをUnityへ

せっかくCinema4dで素材を作れるようになったのでUnityへ持って行って何か作りたい。
Flashで使いたいけどaway3dにはまだ持っていけなそうだし、
Cinema4d -> Unity -> Flash書き出し が今のところ行けそうな感じ。

取り急ぎ、アニメ付きで持って行きたい。
c4dデータのままでも行けそう?な記事を見たけどもってけなかった。
恐らく何か一手間が必要なのかプラグインがUnity側に必要なのかわからないので一回放置。
代案でCinema4dから.fbxで書き出してUnityに読み込ませたら問題なくいけた。

ただ一部ポリゴンが裏返ってしまってる部分があったのでCinema4dに戻って、
メッシュ>法線>法線を反転を選択して治す。
再度.fbxで書き出ししなおしてUnityに再読み込み。

アニメデータも一緒に持ってイケてるので、
Unityのプロジェクトウィンドウで読み込んだデータを選択し、
インスペクターでアニメの名前と該当フレームを選択し用意する。

あとはスクリプト
animation.Play(“idle”);
でそのポーズにしたり、
animation.CrossFade(“jump”);
等でアニメをスイッチ。

Cinema4dプラグインメモ

◯Nitro4d

http://nitro4d.com/blog/

・MagicSlowMotion 映像再生中に部分スローモーションをかける
・MagicPixel 読み込んだ画像をピクセル化し並べる
・MMDツール 初音ミク関係のキャラクター、アニメーションを読み込み設置
・MagicMarge 2つ以上のオブジェクトを合体したり、くりぬいたりして一つのオブジェクトにする。
・Magic3D 青と赤で飛び出す映像を作成?
・MagicSelect 自由に色々選択出来るようになる。
・MagicDomino ドミノ作成
・MagicPaint ドラッグしたところに液体でモコモコオブジェクトを作成?
・EasyParent 動的に親子関係を操作する
・MagicRoll 形状に合わせた転がり方をさせる
・MagicCube どんな形状もキューブ化。キューブ以外も可能。
・Thrausi オブジェクトをバラバラに砕けさせる。
・SoundFX waveファイルの読み込みを簡単にでき、いろいろいじれる?
・MagicMesh2 モデリングやアニメ作成時のステップを細かく記録?
・MagicCar,snow,pazzle,book ままの内容を簡単に作成

◯X-Particles
http://www.x-particle.com/ 100ユーロ

・色々なパーティクルを使った表現が可能になる。

◯Tools4d

http://www.tools4d.com/

・Additional Effectors Volume1 33ユーロ
・SelectionEffect 色々な選択方法で色々なエフェクトをかけれる
・FitEffector クローナー等で並べた時に、隣とかぶらないように大きさを調整可能。部分的にも可能。
・surfaceEffector オブジェクト郡を何かのオブジェクトの動きに沿わせる?合わせる?
・WhiteLights2 33ユーロ
ネオン管のような、長時間露光でのペンライトで描いたような表現が可能

◯AHMED El-HOFY

http://www.ahmedelhofy.com/

・EasyRain 簡単に雨を作成
・EasyPixelate 簡単にピクセルアートを作れる。オブジェクトをピクセルブロック化。部分的にも。
・EasyCarDriveTool 簡単に車の構造を作れる?

◯CactusDanのキャラクターアニメ用

http://www.cactus3d.com/

・CD IK Tools
・CD Joints & Skin
・CD Morph
・CD Constraints

◯流体物

・EFFEX 8,4000円
・Real Flow 4700ユーロ バカ高い

◯煙、炎

http://www.jawset.com/

・TurbulenceFD 400ユーロ

◎便利スクリプト集

◯HB Modeling bundle

http://www.holgerbiebrach.com/?p=1378