Unityで他のスクリプトの変数や関数を利用する

スクリプトから、他のスクリプトの変数や関数を利用したい場合があります。そのやり方について。

他のスクリプトが、同じゲームオブジェクトのコンポーネントである場合とそうでない(他のオブジェクトのコンポーネントである)場合とがあります。でも、どちらの場合もやり方はほぼ同様です。

シーン内のヒエラルキーが次のようである状況を考えます。

– Main Camera
– Directional Light
– Cube
  – Lucy.cs
  – Diamond.cs
– Sphere
  – Diamond.cs

Cube には Lucy と Diamond というスクリプトがコンポーネントとして追加されています。
Sphere には Diamond が追加されています。こんな感じ。

unity_referring

ちなみに Camera と Light は無くてかまいません。

ここでは、Lucy から Diamond スクリプト内の変数や関数を利用したいとします。
Lucy と Diamond のスクリプトの中身は以下のようです。

using UnityEngine;
using System.Collections;

public class Lucy : MonoBehaviour {

	GameObject refObj;

	void Start() {
		refObj = GameObject.Find( "Sphere" );
	}

	void Update() {
		if( Input.GetMouseButtonDown( 0 ) ) {
			// public な static 変数は直接読み書きできる
			Diamond.Sint = 72;

			// 同じオブジェクト(Cube)内の他のスクリプトを参照する場合
			Diamond d1 = GetComponent<Diamond>();
			d1.CountUp();
			d1.SayInfo();

			// 別のオブジェクト(Sphere)のスクリプトを参照する場合
			Diamond d2 = refObj.GetComponent<Diamond>();
			d2.SetCount( 91 );
			d2.SayInfo();
		}
	}
}
using UnityEngine;
using System.Collections;

public class Diamond : MonoBehaviour {

	private string Text;
	private int count;
	public static int Sint;

	public void Start() {
		Text = transform.root.gameObject.name;
		count = 0;
		Sint = 0;
	}

	public void SayInfo() {
		Debug.Log( "Text: " + Text + ", count: " + count + ", Sint: " + Sint );
	}

	public void CountUp(){
		count++;
	}

	public void SetCount( int i ){
		count = i;
	}

}

Diamond.cs は3つの変数を持つクラスです。
Text には親オブジェクトの名前がスタート時に入るようにしていますが、特に意味はありません。
SayInfo() で各変数の値をコンソールに出力します。

Lucy から Diamond を参照したいのですが、シーン内には Diamond は Cube オブジェクト及び Sphere オブジェクトの2箇所に存在します。

同じオブジェクト内のスクリプトを参照する際は、GetComponent<Diamond>() によってスクリプトを参照し、その参照(ここでは d1 という名前)を用いて Diamond の関数を実行します。

別のオブジェクト内のスクリプトを参照する際は、事前にそのオブジェクトへの参照を保持しておき(ここでは refObj という変数)、その変数を用いて同様に GetComponent<Diamond>() を実行すれば良いです。

また、public な static 変数であれば「クラス名.変数名」とすれば直接値の読み書きが可能です。

この例では Update 関数内でマウスクリックのたびにスクリプトへの参照を行っていますが、頻繁に他のスクリプトを利用する場合には d1 や d2 は refObj 変数と同じようにクラス変数として宣言し、スクリプトの参照命令( GetComponent<Diamond>() )は Start 関数内で一度だけ実行するようにした方がパフォーマンス的には良いと思われます。

コメント