Unityのスクリプトで、ほかのGameObjectのスクリプトの値やメソッドにアクセスするのはどうしたらよいでしょうか?ここではその方法を説明していきます。
[toc]UnityにおけるGameObjectにアタッチされたスクリプトの扱い
UnityではGameObjectにTransform、Renderer、RigidbodyなどのComponentをアタッチできますが、実はスクリプト自体もComponentの一つなのです。ComponentであるためにはComponentクラスを継承している必要がありますが、スクリプトを作成するときに必ず継承するMonoBehaviourクラスがComponentクラスの派生クラスであることからもスクリプトがComponentの一つであることが分かります。例えば、Transformクラス、Rendererクラス、RigidbodyクラスもすべてComponentクラスを継承していることからも、これらのComponentと自分でアタッチしたスクリプトとの扱いが全く同じであることが分かりますね。
スクリプトから他のGameObjectにアタッチされたスクリプトを取得する
GameObjectにアタッチされたComponentを取得するにはGetComponentメソッドを用いるのでした。例えば、GameObjectにアタッチされたRendererを取得するためには次のようにします。
Renderer renderer = gameObject.GetComponent<Renderer>();
詳細はこちらをご覧ください。
GameObjectにアタッチされたスクリプトを取得する場合もこれと全く同じになります。例えば、gameObjectにアタッチされたScriptTestを取得する場合は次のようになります。
ScriptTest script = gameObject.GetComponent<ScriptTest>();
ここで取得したスクリプトの変数(testValue)やメソッド(testMethod)はそれぞれ次のようにアクセスできます。
var value1 = script.testValue //取得したスクリプトの変数の取得
script.testMethod() //取得したスクリプトのメソッドの実行
なお、ほかのスクリプトからアクセス可能にするためには、変数やメソッドのアクセス修飾子をpublicにしておく必要があるのでご注意ください。
実際にやってみる
Unity上でCubeを作成し、次のスクリプトをアタッチします。この時、ほかのスクリプトからアクセスできるように変数やメソッドはpublicにしておくことがポイントです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeScript : MonoBehaviour
{
//ほかのスクリプトからアクセス可能な変数
public string sample_text = "Hello, World!";
//ほかのスクリプトからアクセス可能なメソッド
public void Move()
{
var position_old = transform.position;
transform.position = position_old + new Vector3(0.05f, 0, 0);
}
}
次に、マネージャースクリプトを次のようにします。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Manager : MonoBehaviour
{
CubeScript script;
void Start()
{
script = GameObject.Find("Cube").GetComponent<CubeScript>();
//CubeScriptの変数にアクセスする
Debug.Log(script.sample_text);
}
void Update()
{
//CubeScriptのメソッドにアクセスする
script.Move();
}
}
12行目で、先ほど作成したCubeを検索して、そこにアタッチされたCubeScriptを取得しています。
なお、マネージャースクリプトについては以下の記事をご覧ください。
これを実行すると、以下のようにコンソール上にHello, World!が出力されて、Cubeが移動します。
Cube自身にアタッチしたスクリプトのStartメソッドやUpdateメソッドには何も書いてなくて、マネージャースクリプトのStartメソッドやUpdateメソッドから処理が実行されているのがポイントですね。
コメント