【Unity】 クラス間での変数の受け渡しまとめ

Unityでクラス間の変数にアクセスするときに様々な方法があるので

この記事でまとめておきます。

目次

変数の受け渡し

今回、前提としてRedBall、BlueBallオブジェクトがあるとします。

RedBallオブジェクトにはRedClassというスクリプト、BlueBallにはBlueClassというスクリプトが

アタッチされているものとします。

【RedClass.cs】

using UnityEngine;

public class RedClass : MonoBehaviour
{
    // RedValueをBlueClassで使います
    public string RedValue = "RedClassの変数";
}

【BlueClass.cs】

using UnityEngine;

public class BlueClass : MonoBehaviour
{

    private void Start()
    {
        Debug.Log();
    }
}

今回、RedClassの文字列型変数、RedValueをBlueClassで使い、ログを出力するとします。

この上で見ていきたいと思います。

クラス型の変数をpublicにし、インスペクタでアタッチする

クラス型の変数を用意します。

【BlueClass.cs】

using UnityEngine;

public class BlueClass : MonoBehaviour
{
    public RedClass redClass;

    private void Start()
    {
        Debug.Log(redClass.RedValue);
    }
}

その後、インスペクタでアタッチします。

こちらで実行します。

SerializeField属性を利用しprivateにする

SerializeField属性はインスペクタ上で変数の値を確認できる属性です。

こちらをクラス型に付与することでインスペクタからアタッチすることができるようになります。

【BlueClass.cs】

using UnityEngine;

public class BlueClass : MonoBehaviour
{
    [SerializeField] private RedClass redClass;

    private void Start()
    {
        Debug.Log(redClass);
    }
}

その後、publicの例と同じくアタッチするとログに

「RedClassの変数です」と出力されます。

publicの場合とSerializeField属性を使った場合、何が違うのか

という点ですが、SerializeField属性を使うと安全に変数の受け渡しができます

publicの場合だとBlueClassで定義したredClassという変数は他のクラスから値が変更できてしまいます。

しかし、SerializeField属性を使うとインスペクタ上に値を表示できます

変数をprivateにすることで他のクラスでその値を使うことができなくなります

クラスの変数は他のクラスからアクセスできないようにすることが望ましいです。

GetComponentでクラスの変数にアクセスする

GetComponentを使ってクラスの変数をアクセスする方法です。

【BlueClass.cs】

using UnityEngine;

public class BlueClass : MonoBehaviour
{
    // GameObject型の変数、redBallを用意
    [SerializeField] GameObject redBall;

    private void Start()
    {
        // redBallオブジェクトに対してRedClassのRedValueという値を取ってくる
        var redClass = redBall.GetComponent<RedClass>().RedValue;
        Debug.Log(redClass);
    }
}

GetComponentはRigidBodyやColliderなどのコンポーネントで使うことが多いですが、

スクリプトも参照することができます

「RedClassの変数」と出力されます。

GetComponentは多用すると処理が重くなるので注意

別のクラスで使いたいクラス内変数をstaticにする

RedValueを修正します。

【RedClass.cs】

using UnityEngine;

public class RedClass : MonoBehaviour
{
    // static変数
    public static string RedValue = "RedClassの変数";
}

次に変数を使う側のBlueClassで呼び出します。

【BlueClass.cs】

using UnityEngine;

public class BlueClass : MonoBehaviour
{
    private void Start()
    {
        Debug.Log(RedClass.RedValue);
    }
}

こちらで「RedClassの変数」と出力されます。

static変数を使うとクラス型の変数を定義しなくて良いなどのメリットがありますが、

変数の値をどこからでも変更できてしまいます

そのため、多用するのはNGです。

まとめ

いかがだったでしょうか。

Unityでの変数の受け渡しをまとめると以下のようになります。

①クラス型の変数をpublicにし、インスペクタでアタッチする

②SerializeField属性を利用しprivateにする

③GetComponentでクラスの変数にアクセスする

④別のクラスで使いたいクラス内変数をstaticにする

基本的にはSerializeField属性を利用しprivateにしておくのが良さそうです。

他のクラスで変数にアクセスすることが出てきた場合はpublicなどにして

受け渡すと良いと思います。

ではでは!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

電気制御設計→ITエンジニア
前職は電気系のエンジニアで物流倉庫などの設備を動かしていました。
現在はITエンジニアとして開発に従事。
業務では主にUnity、C#、.NETを利用。
UnityとC#を用いて業務用スマホアプリを完成。
現在、AWS、TypeScript、Nodeの案件に参画中。

コメント

コメントする

目次