LoginSignup
5
6

More than 5 years have passed since last update.

UnityのMonoBehaviourでInspectorに値を出さない方法

Last updated at Posted at 2017-04-14

前置き

UnityでInspectorから設定値を変更するためには、 public で値を宣言する必要がある。

public MyScript : MonoBehaviour {
    public string Value = "";
}

スクリーンショット 2017-04-14 22.50.20.png

ここで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を使おう

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6