【Unity】他のスクリプトのメソッドを実行したり変数を参照する方法

更新日:2023/05/30

Unityでスクリプトから他のゲームオブジェクトのスクリプトにアクセスしたいときがあります。
スクリプトのインスタンスはコンポーネントとしてゲームオブジェクトに関連付けられています。
今回は、ゲームオブジェクトからスクリプトコンポーネントを取り出して、メソッドを実行したり変数を参照する方法をお伝えします。

 

ゲームオブジェクトの準備

今回は、Text1とsubTextという名前でTextオブジェクトを作成しました。

subTextにメソッドと変数を定義して、Text1から呼び出してみます。

方法はいくつかあります。
今回は、2つの方法を紹介します。

 

方法1:クラス名でコンポーネント取得

最初の方法は、取得したいスクリプトのクラス名でスクリプトコンポーネントを取得して、メソッドや変数にアクセスします。

呼び出される側のコードは、次のようになります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class subTextScript : MonoBehaviour
{
    private Text t;
    public string subText = "";
    void Start()
    {
        t = gameObject.GetComponent<Text>();
    }
    public void setText(string value)
    {
        t.text = value + " " + subText;
    }
}

呼び出し側は、次のようになります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class text1Script : MonoBehaviour
{
    private subTextScript ti;

    void Start()
    {
        ti = GameObject.Find("subText").GetComponent<subTextScript>();
        ti.subText = "こんにちは";
        ti.setText( "Hello World!!" );
    }
}

GameObject.Find(オブジェクト名)でオブジェクトを検索して、そこからGetComponent(クラス名)でスクリプトコンポーネントを取得します。
ここまでできれば、後はpublicなメソッドや変数にアクセスできます。

この方法は分かりやすいですが、共通のメソッドを持つ不特定のオブジェクトにアクセスするケースだと使いにくいですね。

 

方法2:インターフェース名でコンポーネント取得

二つ目の方法は、C#のインターフェース機能を使います。
これにより、複数のオブジェクトのメソッドや変数に、同じコードでアクセスできるようになります。

まずは、新規ファイルにインターフェースを記述します。

public interface testInterface
{
    void setText(string value);
    
    string subText
    {
        get;
        set;
    }
}

次にsubTextのスクリプトにインターフェースを適用します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class subScript : MonoBehaviour , testInterface
{
    private Text t;
    private string _subText = "";

    void Start()
    {
        t = gameObject.GetComponent<Text>();
    }

    public string subText
    {
        get => _subText;
        set => _subText = value;
    }
    public void setText(string value)
    {
        t.text = value + " " + _subText;
    }
}

呼び出し側は、GetComponent()でインターフェースを取得します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class text1Script : MonoBehaviour
{
    private subTextScript ti;

    void Start()
    {
        ti = GameObject.Find("subText").GetComponent<subTextScript>();
        ti.subText = "こんにちは";
        ti.setText( "Hello World!!" );
    }
}

GameObject.FindGameObjectsWithTag()を使ってタグ単位で取得したオブジェクトのメソッドを、ループで呼び出すときなど便利に使用できると思います。

更新日:2023/05/30

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。