2013年3月21日木曜日

Unity基本メソッド覚書

Unityでいろいろ作っている時に,
「あれってどう実装するんだっけ…」「これ動かすときどこの値をいじるんだっけ…」
なんてことが最近多かったのでメモメモφ(・ω・ )

Unityでスクリプトを書くとき覚えておきたいメソッド-移動と回転-


0. 基本

移動にしても回転にしても, 座標を用いてパラメータをいじるのは基本
var myTransform : Transform = this.gameObject.transform;
ここ.
Hierarchyウィンドウから適当なオブジェクトを選択して, Inspectorを眺めると必ずあるのがこの transform.
位置, 回転, スケールを管理するここはスクリプトからもよくアクセスされる.
スクリプト中で何度もアクセスするようなら, 上記のように変数として持ってしまうのも, 処理の高速化として有効らしい.
ちなみにC#で書くなら, 
Transform myTransform = this.gameObject.transform;
ほぼ変わらない.

1. 移動

ゲーム作成において必須項目. なので「プレイヤーを歩かせる」「足場を動かす」「弾を打ち出す」など, いろいろなところで使う. ちなみにC#でもUnityScriptでもほとんどコードは変わらず. おかげでC#のお勉強にならない…(・ω・`)

・ positionをいじる

myTransform.position = new Vector3( x, y, z);
Vector3型で指定した x, y, zの座標に「ワープ」する.
なので「歩く」モーションなどには向かない.
ヨ○テレ○ートみたいなワープ移動や, ロック○ンの"消える足場"みたいなものなら使えるかもしれないが, 基本移動を表現するには不向き.

・ Translate

myTransform.Translate(Vector3 vec);
Vector3型で指定したベクトル方向に「動かす」メソッド. プレイヤーを歩かせるならこれか.
コード中で使うなら,
var speed: float;
myTransform.Translate(Vector3 vec * speed * Time.deltaTime)
となるかと. Vector3で方向を, speedで移動速度を設定. Time.deltaTimeで環境ごとのフレームレートの差を補完させる. 処理がマシンによってばらばらになるのが嫌なら, つけておくと安心できるかと.
参考

・addForce

これだけちょっと毛色が違う. こちらは
this.gameObject.rigidbody.addForce(Vector3 vec);
Vector3型で宣言した方向に力を加えるメソッド. まずアクセスするのが Transformではなく Rigidbody. これは「Unityが面倒な物理演算を自分でやってくれる」ための重要なコンポーネント. ここにアクセスして, 「力を加えて」動かす.
要するに「物を殴って動かす」ようなもの. このメソッドを呼んだ一瞬は力がかかるけど, 以降は慣性で移動する.
おもに弾丸の発射やピンボールのバンパーなんかに用いると幸せになれるかも.
当然対象に rigidBodyがないとだめ. addしておきましょう.

2. 回転

同じく必須項目. たとえ横スクロールアクションであろうと左右の向きくらいは変えるはず. 「向きを変える」「ターゲットの方向を向く」「軸を合わせる」なんかでいろいろ使う.

・LookAt

var targetTransform: Transform;
myTransform.LookAt(targetTransform);
Transformから直接呼び出すメソッド. シンプルに
「targetTransformに指定したものの方を見る」
というもの.
一見便利なのだが, 問題は myTransformと targetTransformが接近したとき.
「近づく」まではぎりぎり行けるかいけないかはわかれるが, 接触してしまうとかなり猛烈な荒ぶり方をしてしまう.
またこの「見る」は, 全身の正面を targetTransformに向けるので, 両者のサイズ差が大きいと, 見上げる or 見下ろす ような体制になりやすいのが難点.

逆に接近することがないようなもの, 侵入者を照らすサーチライトの光源なんかはこれで十分かと.

・rotation- 1

myTransform.rotation = Quaternion.Euler( x, y, z);
transformのrotationに, オイラー角で指定して角度を入れる. この Quaternionクラスが角度の操作をする時に便利.特に,
myTransform.rotation = Quaternion.AngleAxis( float angle, Vector3( x, y, z));
と, AngleAxisメソッドを使うと便利. これは第一引数に角度を, 第二引数に回転軸を設定して回転させる, というもの. Update()メソッドの中で徐々に角度の部分を増やしてやれば, ゆっくり回転する物体の出来上がり. 変に角度いじるよりわかりやすいかと.
またこれは掛け合わせることで, 複数の軸へのそれぞれの回転量を表すこともできる.
たとえば, 「x軸を軸に45度, y軸を軸に120度回転させた状態」にしたいなら,
myTransform.rotation = Quaternion.AngleAxis( 45, Vector3( 1, 0, 0))
                       * Quaternion.AngleAxis( 120, Vector3( 0, 1, 0));
と, それぞれの条件を書いた式をかけてやるだけでいい. これはわかりやすい.
ただし順序があり, 最後にかけた回転から順に行われるらしく, この場合は
「 y軸を軸に120度回転させてから, x軸を軸に45度回転させる」という順序で回転が行われる. 結果が同じならいいけれども….
たとえば

こんな棒があった時,

上記の y軸 → x軸回転時
その逆 x軸 → y軸回転時
とここまで変わるので注意が必要.

主に回転し続ける足場やカメラなど, 常に角度が変化するものに強い?

・rotation - 2

myTransform.rotation = Quaternion.LookRotation(myTransform.position - targetTransform.position);

いじる場所は一個前と同じ myTransform, 使うクラスも Quaternionとこれまた同じ.
やることは二個前と同じ, 「自分を targetTransformの方に向かせる」 というもの.
では何が違うのかというと, 引数に Vector3クラスが使える という点だろう.
LookAtの際問題になるのが, 両者が接近したとき, と紹介したが, これを回避できるのがコイツ.
やり方は
var vec: Vector3 = myTransform.position - targettransform.position;
vec.y = 0;
myTransform.rotation = Quaternion.LookRotation(vec);
としてやる. 要は両者の y軸(高さ)の差を0としてやれば, 変に上下に傾くことがなくなる.
応用してやれば, myTransformの y = 0の場所から見た方向を向く, などもいじりやすいのが利点. 
2D視点など軸が一ついらないゲームなんかではこっちの方が変な動きをしなくて安心かと. 

・Rotate

myTransform.Rotate( x, y, z);
//or
myTransform.Rotate(Vector3 vec);
こちらは x, y, z の角度をそれぞれ指定して回すメソッド. 角度が完璧に決まっているならこちらのが早い. がやはり徐々に変化させるタイプには向かない.
スポーン時に最初の向きを決めてやったり, マ○オのような2Dスクロールで進行方向を変える時などはこっち?.

最近の○リオはちゃんと振り向きモーションあるけどね(・ω・`).


・おまけ

myTransform.rotation = Quaternion.identity;
回転なしの状態にする = すべての角度を 0 にする.
角度の初期化などに便利?





-移動と回転-とか書いたけどこれは他にもまとめる時がくるフラグなんだろうか…(・ω・`)

0 件のコメント:

コメントを投稿

AWS CDKで立てたEC2インスタンスのTimeZoneとかいじりたかった話

EC2を立てることはできたけど、立てたインスタンスは UTCのままだし設定ファイルとかいちいちscpしてくるのはダルい。 当初UserDataでなんとかしようとしたものの、「書く量がヤバいしメンテしにくい」と悩んでいたところ見かけたのが  AWS::CloudFormation:...