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などにして
受け渡すと良いと思います。
ではでは!
コメント