前置き
UnityでInspectorから設定値を変更するためには、 public
で値を宣言する必要がある。
public MyScript : MonoBehaviour {
public string Value = "";
}

ここでinspectorには表示したくないが、他のクラスからアクセスさせたい変数を設けたい場合がある.
その手段についてメモ。
手段
パターン1: HideInspector
public class MyScript : MonoBehaviour
{
[HideInInspector] public string Value = "";
}
メリット
- 初期値が設定できる
デメリット
- Serializeで値保持の問題 (※1)
- 公開権限をいじれない (get可能 set不可など).
- get/set時に処理記述ができない. (ちょっとした変換とか)
※1
- Prefab化した後にアノテーションを追加すると、値が保持される続けるような予期せぬ挙動をする
- HideInInspectorはinspector常に表示しないだけ、Serialize objectの値保存は行なってしまう.
- 下記は Valueに
abc
を入れた状態でPrefab化したobjectからHideInSpectorをつけた場合のPrefabの値の状態 - objectの値が保存されている & そのfieldがSerializableなので、予期せずinspectorの値が復元されてしまう
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
...(中略)...
--- !u!114 &114625309749185936
MonoBehaviour:
m_ObjectHideFlags: 1
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 100100000}
m_GameObject: {fileID: 1202429588961352}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4dbbba54007a4473fb3737c795b998a3, type: 3}
m_Name:
m_EditorClassIdentifier:
Value: abc
パターン2: NonSerialized
public class MyScript : MonoBehaviour
{
[NonSerialized] public string Value = "";
}
メリット
- 初期値が設定できる
- Serializeで値保持の問題なし
デメリット
- 公開権限をいじれない (get可能 set不可など).
- get/set時に処理記述ができない. (ちょっとした変換とか)
パターン3: getter, setterプロパティ
public class MyScript : MonoBehaviour
{
public string Value { get; set; }
void Awake()
{
this.Value = "";
}
}
メリット
- get, setで公開範囲と権限を自由に絞れる
- getterの中で処理を書いたり、 setだけprivateにしたりできる (
private set;
) - Serializeで値保持の問題なし
デメリット
- 初期値が宣言時に入れられない. Awakeの中などで初期化する必要がある.
個人的にはこのパターンが好みです。
getter, setterを通して他クラスからアクセスさせるというのも自然な記述だなと。
まとめ
HideInInspectorは予期せぬ挙動あるので原則やめよう.
NonSerializedかpropertyを使おう