2011年10月24日月曜日

Unity GameObjectへのアクセス

http://unity3d.com/support/documentation/ScriptReference/index.Accessing_Other_Game_Objects.html

UnityはGameObjectへのアクセス方法がたくさんある。Unity初心者のこのアクセス方法の多様さに少し戸惑うと思う。
GameObjectにアクセスするいくつかの方法を示す。


シーンに付加された「OtherScript.js」にアクセスする
var otherScript: OtherScript = GetComponent(OtherScript);
otherScript.DoSomething();
スクリプト名とクラス名は同じ名前で対応している。

インスペクタから設定したObjectにアクセスする
var target : Transform;
target.Translate(0, 1, 0);
上記のようにスクリプトを書くと、Unityのインスペクタを利用して、GameObjectをtargetスロットに設定することができる。GameObjectを設定した後はスクリプト内からそのGameObjectにアクセスすることができる。

オブジェクトの階層構造を利用する
自身の子要素にあるオブジェクトはTransformコンポーネントを通してアクセスすることができる。
//子要素"Hand"にアクセス
transform.Find("Hand").Translate(0, 1, 0);
//子要素すべてにアクセスする
for (var child : Transform in transform) {
    child.Translate(0, 10, 0);
}
名前またはタグでアクセスする
UnityEditorのインスペクタはオブジェクトにタグをつけることができる。タグ付けしたオブジェクトはGameObject.FindWithTagやGameObject.FindGameObjectsWithTagを利用してアクセスできる。
また、GameObject.Findはオブジェクト名を指定してアクセスするこができる。
// 名前でアクセス
var go = GameObject.Find("SomeGuy");
go.transform.Translate(0, 1, 0);
// タグでアクセス
var player = GameObject.FindWithTag("Player");
player.transform.Translate(0, 1, 0);

パラメータで渡された場合
いくつかのイベント関数には、イベントが発生したときの対象のオブジェクトが関数の引数で渡される。たとえば、トリガーイベントに渡されるColliderオブジェクトのコードを示す。
function OnTriggerStay( other : Collider ) {
    // Colliderのrigidbodyに力を加える
    if (other.rigidbody)
        other.rigidbody.AddForce(0, 2, 0);
}
特定の型にアクセスする場合
特定の型をもつクラスやスクリプトにアクセスする場合は、Object.FindObjectsOfTypeまたはObject.FindObjectOfTypeを使う。Object.FindObjectOfTypeは最初のオブジェクトを返す。
var other : OtherScript = FindObjectOfType(OtherScript);
other.DoSomething();



インスペクタでタグ付けやスロットにアサインする方法でGameObjectを扱うのは、ソースコード管理や協調作業がしづらいかもしれない。
なるべくならスクリプトのみでオブジェクトアクセスを完結させたいと思うのがプログラマの性かもしれない。

0 件のコメント:

コメントを投稿