Google

2011年10月14日金曜日

UnityのComponent操作

Unityでゲームらしいことをする場合、コード側では何をすればいいか、という話をしてみます。
本やブログで色々説明はありますが、自分なりの表現で噛み砕いて見ました。

普通、ゲーム製作者やユーザ観点では、キャラがいて弾撃って移動して、ボスがいて、当たったらどうこう、、、とかいう話になると思います。
しかしそれは仕様とか画面上の話。
システム的な観点で抽象的に言えば、オブジェクトの「プロパティ」が変化するということです。
ざっと言えば以下のような感じ。

 ・生成、消滅
 ・位置移動、回転
 ・3Dアニメーション
 ・テクスチャの変化
 ・etc...

Unityにおける画面上のオブジェはGameObjectです。
以前、GameObjectをスクリプトで操るにはMonoBehaviour派生クラスを作成という話をしました。
が、このMonoBehaviourそのものが機能盛りだくさんという訳ではありません。
以下のリファレンスを見てみましょう。

MonoBehaviour Class Reference
  http://unity3d.com/support/documentation/ScriptReference/MonoBehaviour.html

大半の関数はイベントハンドラで、他の動作面では空っぽに近い感じすらあります。
実はこのクラスを成り立たせてるのは、Component派生メンバ変数群。
重要な機能はほぼ移譲する形で構成されています。
例えばGameObjectは入れ子に出来ますが、それさえも自力ではやっていません。
Transformクラスがコンポジットパターンとして実装することで実現してます。

つまりは、オブジェクトの変化を制御したいなら、基本はGameObjectが保持しているComponent派生クラスをいじる、ということになるわけです。
まずは簡単な位置移動をやってみましょう。

GameObjectをひとつ生成し、C#スクリプトを割り当て、インスペクタウィンドウで位置を0,0,0にしてください。

解りづらいですが、0,0,0の位置にGameObjectが存在しています。

位置の管理はTransformクラスが担当し、この中には位置と回転等が入ってます。
ここからVector3というx,y,z情報を持つ構造体を抜き出し、それを変更すると位置が変わります。
以下がサンプルコード。

では解説。

Start関数の開始直後、Vector3変数posをtransform.positionからとっていますね。
(transformはTransformのインスタンスでMonoBehaviourのメンバです)
GameObjectの位置なのに、MonoBeheviourのメンバを取り出すって、、、、と思うかもしれません。
が、実はアタッチされたGameObjectのTransformメンバが自動的に反映されるため、いきなりこういう書き方でいいという訳です。

そしてx:10 y:20 z:30の位置を指定し、positionに戻しています。
できればメンバを直接変更したいところですが、C#ではpositionの内部メンバは個別変更ができません。
取り出して変更して戻すのが基本です。
これを実行すれば以下のようになっているはずです。

位置が変化しました。見た目は変わりませんが。

このように、移譲している関係から、移動に関するメソッドがMonoBehaviourに存在するわけではありません。
メンバを直にいじって変化させるのが基本的な方法です。

0 件のコメント:

コメントを投稿