現在のScriptがアタッチされているGameObject以外のGameObjectにアクセするには次の方法がある。
1)Inspectorでアサインする
public変数としてGameObjectを定義し、Inspector上で該当GameObjectをアサインする方法。
簡単だが、この方法だとScriptだけで完結しないため、デバッグや再利用がし辛い。
他のGameObjectにアタッチされているComponentに直接アクセスする場合は、public変数で該当Componentを定義し、InspectorでそのComponentを持つGameObjectをアサインすることに注意。(これはUnityEditor上でGameObjectを操作することしかできないための便法と思われる。)
using UnityEngine; using System.Collections; public class example : MonoBehaviour { public OtherScript target; //Inspector上でOtherScriptを持つGameObjectをアサインする void Update() { target.foo = 2; target.DoSomething("Hello"); } }
2)GameObjectの階層構造をたどる
現在のGameObjectから親または子のGameObjectをたどる方法。出発点は"transform"であることに注意。下は子GameObjectにアクセスする事例。GetComponentを組み合わている。
using UnityEngine; using System.Collections; public class example : MonoBehaviour { void Example() { transform.Find("Hand").GetComponent<OtherScript>().foo = 2; transform.Find("Hand").GetComponent<OtherScript>().DoSomething("Hello"); transform.Find("Hand").rigidbody.AddForce(0, 10, 0); } }
すべての子GameObjectに対して同じ操作を行う場合、foreach ... in transform ループで子GameObject(のTransformコンポーネント)をひとつずつ見ていく。
using UnityEngine; using System.Collections; public class example : MonoBehaviour { void Example() { foreach (Transform child in transform) { child.Translate(0, 10, 0); } } }
親GameObjectを取得するには、(childGameObject.)transform.parent とする。
3)名前またはタグを使う
using UnityEngine; using System.Collections; public class example : MonoBehaviour { void Start() { GameObject go = GameObject.Find("SomeGuy"); go.transform.Translate(0, 1, 0); go.GetComponent<OtherScript>().DoSomething(); GameObject player = GameObject.FindWithTag("Player"); player.transform.Translate(0, 1, 0); player.GetComponent<OtherScript>().DoSomething(); } }
4)メッセージの送受による
イベントハンドラを通じてColliderコンポーネントから、アタッチされているScriptを取得する。
そのScriptが存在するかどうかは、if(該当Script名)とする。
using UnityEngine; using System.Collections; public class example : MonoBehaviour { void OnTriggerStay(Collider other) { other.rigidbody.AddForce(0, 2, 0); if (other.GetComponent<OtherScript>()) other.GetComponent<OtherScript>().DoSomething(); } } }
5)同タイプのすべてのオブジェクトを取得する
FindObjectOfType(タイプ名)を使う。クラス(スクリプト)の場合のタイプ名は、typeof(スクリプト名)とする。
using UnityEngine; using System.Collections; public class example : MonoBehaviour { void Start() { OtherScript other = FindObjectOfType(typeof(OtherScript)); other.DoSomething(); } }
複数ある場合は、FindObjectsOfType()を使って配列として取得する。
using UnityEngine; using System.Collections; public class example : MonoBehaviour { void OnMouseDown() { HingeJoint[] hinges = FindObjectsOfType(typeof(HingeJoint)) as HingeJoint[]; foreach (HingeJoint hinge in hinges) { hinge.useSpring = false; } } }
なお、FindObject(s)OfTypeの実行は非常に遅い。可能であれば他の方法を使うのがよい。