Google

2011年10月17日月曜日

GetComponentでプロパティ

前回はTransformを取得して位置移動を行いました。
位置以外にも様々なComponent派生クラスを保持可能になっています。
また、Componentは必要に応じて脱着できるため、存在していない場合それらのメンバ変数はnullとなります。
(TransFormだけは外すことができませんが)

プロパティの形で保持しているこれらを別の方法で取得することも可能です。
以下の例を見てみましょう。
これも今まで同様にC#コードとして生成したものです。

Transformインスタンスが4個取得されていますが、これはどれも同一のインスタンスが取得されることになります。

一番上はMonoBehaviourのメンバ変数ですが、これはアタッチされたGameObjectのTransformが自動的にバインドされます。
2番目はアタッチされたGameObjectのインスタンスであるgameObjectメンバ変数(頭文字の大小に注意)から同様に取り出してます。
つまりはこれも1番目と同様です。

3番目はGetComponent関数を使用して取得しています。
<>の間にはTypeが入りますが、Unityで準備されたComponent派生クラスなら""成しで指定するものと考えてください。
実行速度的にはプロパティ呼び出しの方が上なのは当たり前ですが、1回2回の呼び出しなら差は微々たるものです。

で、4番目ですがこれはエラーとなります。
JavaScriptでは""(ダブルクォーテーション)抜きで指定できていましたが、この方法では呼び出せません。
3番目はテンプレートとして型変換まで行なってくれるのですが、この方法では単にComponent型のインスタンスポインタが戻ってくるため、Transform型へのキャストでエラーとなる訳です。

ではどうするかというと、以下のようにしてください。
VBライクなas 型名か、Cライクな(型名)どちらでもお好みでどうぞ。
ただ、上記コードでは両方あると二重定義エラーとなるのでご注意を。

実はGetComponent()ではインスタンス的にはきっちりTransformが帰ってきていますが、Componentクラス型のままなので、派生クラスであるTransform型にダウンキャストしなければなりません。
それが上記の記述方法です。
本来ダウンキャストは望ましく有りませんが、型が完全に確定している場合は問題ありません。 
前回の位置変更サンプルの取得方法をこれにしても動作します。

この呼び方は一見無駄に見えますが、実はこの呼び方にも意味があります。
それはまた次回以降で。

0 件のコメント:

コメントを投稿