他のスクリプトの変数・メソッドにアクセスする【Unity】

Unityのスクリプトで、ほかのGameObjectのスクリプトの値やメソッドにアクセスするのはどうしたらよいでしょうか?ここではその方法を説明していきます。

UnityにおけるGameObjectにアタッチされたスクリプトの扱い

UnityではGameObjectにTransform、Renderer、RigidbodyなどのComponentをアタッチできますが、実はスクリプト自体もComponentの一つなのです。ComponentであるためにはComponentクラスを継承している必要がありますが、スクリプトを作成するときに必ず継承するMonoBehaviourクラスComponentクラスの派生クラスであることからもスクリプトがComponentの一つであることが分かります。例えば、TransformクラスRendererクラスRigidbodyクラスもすべてComponentクラスを継承していることからも、これらのComponentと自分でアタッチしたスクリプトとの扱いが全く同じであることが分かりますね。

ポイント
GameObjectにアタッチされたスクリプトは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メソッドから処理が実行されているのがポイントですね。

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)