はじめに
UnityでC#を書くとき、変数のアクセス制御とシリアライズの関係を理解しておくことはとても重要です。
間違った使い方をすると、意図せず値を変更されたり、Inspectorに表示されなかったりして困ることがあります。
publicとprivate
この2つが、Unityで基本的に用いられるアクセス修飾子です。
public
public int health;
主な特徴として、他のクラスから自由にアクセスできること、Inspectorに表示されて編集可能という点が挙げられます。
ただし、どこからでも変更できてしまうため、安全性に欠ける部分があります。
他のスクリプトから値を読み書きしたい時に使うといいでしょう。
private
private int health;
privateが使われている変数や関数は、そのクラス内だけで使うことができます。
Inspectorにも表示されないため、外部から直接触らせたくない内部データを保護することができます。
C#ではカプセル化の観点から、なるべくprivateを使うことが推奨されます。
外部から勝手に値を変更されるのを防ぎ、バグを発見しやすくなります。
シリアライズ
Unityには、変数をシーンやPrefabに保存し、Inspector上で編集できるようにする仕組みがあります。
これをシリアライズといいます。
しかし、基本的にその対象となるのはpublicなフィールドのみです。
「外部から値は変更されたくないけど、Inspector上では編集したい」といったとき、これでは困ってしまいます。
SerializeField
ここで登場するのが、SerializeFieldです。
[SerializeField] private int speed = 5;
これを付けた変数や関数は、「Inspectorに表示されるが、他クラスからはアクセスできない」という状態になります。
安全性を維持しつつも、作業性も向上させることができます、