Unityでグローバル変数を宣言するとインスペクターで見えたり見えなかったり、他のスクリプトから見えたり見えなかったりと色々です。
理想としてはやはり必要最低限の部分で見えるのがいいですよね。
あれ、こういうときはどうしたらよかったっけ?と忘れてしまうこともあるのでまとめてみました。
変数の見え方パターン
スクリプト内だけで見える変数
これはシンプルにprivate、もしくはアクセス修飾子なしで宣言すればOK
アクセス修飾子を省略した場合、C#ではprivate扱いとなります。
private int testPrivateA;
int testPrivateB;
インスペクター、及びすべてのスクリプトから見える変数
インスペクター上に表示しつつ、他のすべてのスクリプトからも見えるようにする方法。これもシンプルにpublicを付けてあげればOKです。
public int testPublic;
インスペクターに表示はしつつ、スクリプト内だけで見えるようにする変数
privateにして他のスクリプトからは見せたくない。だけどインスペクターには表示させたい。
そういった場合は[SerializeField]を付けたPrivateで宣言すればOK。こちらのPrivateも省略可能です。
[SerializeField] private int testInspecter_PrivateA;
[SerializeField] int testInspecter_PrivateB;
インスペクターには表示したくないけど、他のスクリプトから見えるようにしたい
そんなワガママな要望にもUnityは対応しています。
主な手法としては3つ。
- [System.NonSerialized]を付ける
- [HideInInspector] を付ける
- プロパティ化する
[System.NonSerialized] public int testNoInspector_PublicA;
[HideInInspector] public int testNoInsceptor_PublicB;
public int testProperty { get; set; }
それぞれの方法について少し補足をします。
[System.NonSerialized]を付ける方法
この方法は、Publicだけどシリアライズ化しない…インスペクターに表示しないよっていう意味となります。
[HideInInspector] を付ける方法
シリアライズ化はするけどインスペクターから非表示にします。あくまで見えなくするだけです。
ですので今回の目的では[System.NonSerialized]を使用するのがいいです。
プロパティ化する方法
これが最もスマートなやり方。他のスクリプトから参照するときも通常の変数と同じように “TestScript.testProperty = 1;” のように書けます。
また、以下のように書くことで他のスクリプトから参照のみ…読み取り専用とすることもできます。
public int testProperty2 { get; }
スポンサードサーチ
Private、Publicそれぞれ宣言方法と見え方まとめ
//スクリプト内だけで参照可能 private int testPrivateA; int testPrivateB; //インスペクター、すべてのスクリプトから参照可能 public int testPublic; //インスペクターに表示するけど、他スクリプトから参照させない [SerializeField] private int testInspector_PrivateA; [SerializeField] int testInspector_PrivateB; //インスペクターに表示しないけど、他のスクリプトから参照可能 [System.NonSerialized] public int testNoInspector_PublicA; [HideInInspector] public int testNoInsceptor_PublicB; public int testProperty { get; set; } public int testProperty2 { get; } //読み取り専用
インスペクターでの見え方
他のスクリプトからの見え方
[System.NonSerialized]ええやん!って最初は思っていましたが、多少面倒でもプロパティを使うのがスマートだし融通も効くしでよさそう。とはいえそれぞれ特徴があるので臨機応変に使っていきましょうー。