Overview: Accessing Other Game Objects Manual     Reference     Scripting  
Scripting
Overview: 他のゲームオブジェクトを使う(Accessing Other Game Objects)

発展的なゲームコードは1つのオブジェクトだけを扱いません。Unityスクリプティングインタフェースは他のゲーム オブジェクトやコンポーネントを見つける様々な方法を提供します。次の例では、OtherScript.js
というスクリプトがシーン中のゲームオブジェクトに付加されていることを前提とします。

var foo = 5;
function DoSomething ( param : String) {
print(param + " with foo: " + foo);
}

1. インスペクタで割り当て可能な参照を通して指定(Through inspector assignable references)

任意の型の変数をインスペクタで割り当てられます:

// Translate the object dragged on the target slot
var target : Transform;
function Update () {
target.Translate(0, 1, 0);
}

参照を他のオブジェクトのインスペクタに渡すことも出来ます。次では、OtherScriptを含むゲームオブジェク トをインスペクタの対象となる項目にドラッグすることが出来ます。

// Set foo DoSomething on the target variable assigned in the inspector.
var target : OtherScript;
function Update () {
// Set foo variable of the target object
target.foo = 2;
// Call do something on the target
target.DoSomething("Hello");
}

2. オブジェクトの階層から指定(Located through the object hierarchy)

子や親のオブジェクトをゲームオブジェクトのTransformコンポーネントからさがすことが出来ます:

// Find the child "Hand" of the game object
// we attached the script to
transform.Find("Hand").Translate(0, 1, 0);

transformを階層から発見したら、GetComponentを 用いて、他のスクリプトを取得できます。

// Find the child named "Hand".
// On the OtherScript attached to it, set foo to 2.
transform.Find("Hand").GetComponent(OtherScript).foo = 2;

// Find the child named "Hand".
// Call DoSomething on the OtherScript attached to it.
transform.Find("Hand").GetComponent(OtherScript).DoSomething("Hello");

// Find the child named "Hand".
// Then apply a force to the rigidbody attached to the hand.
transform.Find("Hand").rigidbody.AddForce(0, 10, 0);

全ての子供をループ出来ます:

// Moves all transform children 10 units upwards!
for (var child : Transform in transform) {
child.Translate(0, 1, 0);
}

詳細についてはTransformを 参照してください。

3. 名前やタグでの指定(Located by name or Tag.)

ゲームオブジェクトを指定したタグでGameObject.FindWithTagGameObject.FindGameObjectsWithTagを用いて探せます。GameObject.Find を使えば、名前で探すことも出来ます。

function Start ()
{
// By name
var go = GameObject.Find("SomeGuy");
go.transform.Translate(0, 1, 0);

// By tag
var player = GameObject.FindWithTag("Player");
player.transform.Translate(0, 1, 0);

}

GetComponentを使い、発見したゲームオブジェクトの他のコンポーネントやスクリプトを取得できます。

function Start ()
{
// By name
var go = GameObject.Find("SomeGuy");
go.GetComponent(OtherScript).DoSomething();

// By tag
var player = GameObject.FindWithTag("Player");
player.GetComponent(OtherScript).DoSomething();
}

main camera(メインカメラ)など、いくつかの特別なオブジェクトは、Camera.mainのよう に、ショートカットで使えます。

4. 引数として指定(Passed as parameters)

イベントメッセージの中には、イベントの詳細情報を含むものがあります。例えば、トリガーイベントは衝突したオブジェ クトのColliderコンポーネントをハンドラ関数に 渡します。

OnTriggerStayはコライダへの参照を提供します。コライダからリジッドボディを取得できます。

function OnTriggerStay( other : Collider ) {
// If the other collider also has a rigidbody
// apply a force to it!
if (other.rigidbody) {
other.rigidbody.AddForce(0, 2, 0);
}
}

また、ゲームオブジェクトに付与されたコンポーネントにもアクセスできます。

function OnTriggerStay( other : Collider ) {
// If the other collider has a OtherScript attached
// call DoSomething on it.
// Most of the time colliders won't have this script attached,
// so we need to check first to avoid null reference exceptions.
if (other.GetComponent(OtherScript)) {
other.GetComponent(OtherScript).DoSomething();
}
}

上記の例ではother変数に続けて書く事で、衝突しているオブジェクトの全てのコンポーネントにアクセスできます。

5. 特定の型の全てのスクリプト(All scripts of one Type)

特定のクラスやスクリプトを持ったオブジェクトはObject.FindObjectsOfTypeで 探せます。1つ目のオブジェクトだけを探す場合はObject.FindObjectOfTypeを使います。

function Start ()
{
// Find the OtherScript which is attached to any game object in the scene.
var other : OtherScript = FindObjectOfType(OtherScript);
other.DoSomething();
}