表示テーマ
SerializeFieldなどの属性
属性は、C#のFieldやクラスに付ける[SerializeField]などの指定です。保存、Inspector表示、実行順、名前変更前の参照の維持に使います。using NEMEngine;を記述すると、通常は名前末尾のAttributeを省略して使えます。
このページは、NEMEngineが提供する公開属性17種類すべてと、保存で使用する.NET標準のSystem.Serializable・System.NonSerializedを扱います。Unity専用の属性がそのまま使える、という意味ではありません。
保存とInspectorの対象
対応する型のpublicなインスタンスFieldは、通常は保存とInspectorの対象になります。privateなどのFieldにはSerializeFieldまたはSerializeReferenceを付けて対象にします。
static・const・C#のreadonly Field、およびNonSerializedを付けたFieldは対象外です。通常のpublicプロパティを宣言するだけでは、public Fieldと同じ保存対象にはなりません。
LabelやRangeなどの表示用属性を付けるだけでは、private Fieldが保存対象になるわけではありません。 保存したいFieldには、併せてSerializeFieldなどを指定してください。
NEMEngineの全属性
リンク先では正式な型名、コンストラクター、引数を確認できます。
| 属性 | 付ける対象 | 用途 | 記述例 |
|---|---|---|---|
| SerializeField | Field | privateなどのFieldを保存・Inspector編集の対象にする | [SerializeField] private float speed; |
| SerializeReference | Field | 基底クラス・インターフェース型へ、実際の派生型を保持して保存する | [SerializeReference] private IAction? action; |
| HideInInspector | Field | 保存対象のままInspectorから隠す | [HideInInspector] public int count; |
| ReadOnly | Field | Inspectorで値を表示するが編集させない。C#からの書き換えと保存は維持する | [SerializeField, ReadOnly] private int hitCount; |
| Range | 数値Field | Inspectorの数値編集に最小値・最大値を指定する | [SerializeField, Range(0.0f, 10.0f)] private float speed; |
| Min | 数値Field | 数値編集の下限を指定する | [SerializeField, Min(0.0f)] private float radius; |
| DragSpeed | 数値Field | Inspectorでドラッグして数値を変更するときの増減速度を指定する | [SerializeField, DragSpeed(0.05f)] private float power; |
| Multiline | string Field | 複数行で文字列を編集する | [SerializeField, Multiline] private string text = ""; |
| SeparatorText | Field | Fieldの上に区切り見出しを表示する | [SerializeField, SeparatorText("移動")] private float speed; |
| Label | Field | Inspectorの表示名を変更する。C#の変数名は変更しない | [SerializeField, Label("移動速度")] private float speed; |
| Tooltip | Field | Inspectorでホバーしたときの説明を指定する | [SerializeField, Tooltip("1秒あたりの移動量")] private float speed; |
| FormerlySerializedAs | Field | 名前変更前のField名を指定し、保存値の対応付けを維持する | [SerializeField, FormerlySerializedAs("oldSpeed")] private float speed; |
| FormerlyKnownScriptType | Scriptクラス | 名前空間・クラス名を変更する前の完全修飾名を指定する | [FormerlyKnownScriptType("Game.OldMover")] |
| DefaultExecutionOrder | Scriptクラス | 型の既定実行順を指定する。小さい値の型が先になる | [DefaultExecutionOrder(-50)] |
| ScriptTypeID | Scriptクラス | Scriptの永続GUIDを明示する。既存の指定があれば維持する | [ScriptTypeID("c34dd7a7-c3e0-466d-8f3c-bf8742d80413")] |
| SerializedFieldID | 保存Field | Fieldの永続GUIDを明示する。既存の指定があれば維持する | [SerializedFieldID("b91177c9-35a7-4ae3-99a4-e914a1151fe1")] |
| NativeAssetType | EngineのAssetクラス | NativeのAssetTypeと対応付け、InspectorのAsset参照フィルターへ伝える。通常のゲームScriptでは指定しない | [NativeAssetType("Texture")] |
Range・MinはInspectorや保存データの検証向けの指定です。ゲームコードでFieldへ代入するたびに値が自動で制限される、という意味ではありません。実行時に範囲を保証したい値は、C#の処理側でも検証します。
ReadOnly属性はC#のreadonlyキーワードとは異なります。[ReadOnly] private int count;はInspectorの編集制限であり、C#のreadonly Fieldは保存対象外です。
.NET標準の保存関連属性
| 属性 | 付ける対象 | NEMEngineでの使い方 |
|---|---|---|
System.Serializable | 通常のデータ用クラス・構造体 | 設定データのメンバーを展開して保存・編集する。SerializeReferenceの派生型候補にも必要 |
System.NonSerialized | Field | public Fieldでも保存対象から外す。SerializeFieldと併記してもこちらが優先される |
Serializableを付けるのは、MonoBehaviour自体ではなく、Scriptが保持するデータ型などです。対応するメンバー型やコレクションの制限もあります。任意の.NETオブジェクトをすべて保存できるわけではありません。
基本的な書き方
次の例をScriptとして作成し、GameObjectへ追加すると、ラベル、説明、数値範囲、複数行文字列、参照欄、派生型の選択欄を確認できます。
cs
using NEMEngine;
[DefaultExecutionOrder(-50)]
public sealed class InspectorAttributesExample : MonoBehaviour {
// 保存対象へラベル・範囲・説明を組み合わせる
[SerializeField, Label("移動速度"), Tooltip("1秒あたりの移動量")]
[NEMEngine.Range(0.0f, 10.0f)]
private float speed = 2.0f;
[SerializeField, Min(0.0f), DragSpeed(0.05f)]
private float power = 1.0f;
[SerializeField, ReadOnly]
private int hitCount = 0;
// 非表示の保存値と、保存しない一時値を分ける
[HideInInspector] public int savedCount;
[System.NonSerialized] public int temporaryCount;
[SerializeField, Multiline]
private string description = "動作の説明";
[SerializeField, SeparatorText("参照")]
private GameObject? target = null;
[SerializeField, FormerlySerializedAs("oldDuration")]
private float duration = 1.0f;
// 固定した設定型と、選んだ派生型を持つ設定を用意
[SerializeField] private MovementOptions options = new MovementOptions();
[SerializeReference] private IExampleAction? action = new JumpAction();
}
[System.Serializable]
public sealed class MovementOptions {
public float duration = 1.0f;
}
public interface IExampleAction {
}
[System.Serializable]
public sealed class JumpAction : IExampleAction {
public float height = 1.0f;
}savedCountは非表示でも保存対象、temporaryCountは保存対象外です。hitCountは表示されますがInspectorから変更できません。
SerializeFieldとSerializeReferenceの選び方
固定した型の設定を持つ場合はSerializeFieldを使います。上のMovementOptionsがその例です。保存するデータ用クラス・構造体にはSystem.Serializableを付けます。
実際に選んだ派生型の種類まで保持したい場合はSerializeReferenceを使います。上のIExampleActionに対するJumpActionがその例です。候補はゲームAssembly内にあるSerializable付きの具象型です。配列・Listへ指定した場合は、その要素を対象にします。
GameObjectやComponentへの参照は、通常のGameObject参照としてSerializeFieldで指定します。GameObjectを参照するためにSerializeReferenceへ変える必要はありません。
名前を変更するとき
Field名を変更する場合、FormerlySerializedAsに変更前の名前を記述します。表示だけを日本語へ変えたい場合は、Field名を変更せずLabelを使います。
クラス名や名前空間を変える場合は、FormerlyKnownScriptTypeへ変更前の完全修飾名を記述します。Fieldの変更とは対象が違います。いずれも、異なる型へのデータ変換まで自動で保証するものではありません。
両方の属性は複数指定できます。ただし、以前の名前を省いたり、無関係なField・Scriptの名前を引き継いだりしないでください。
実行順と識別用の属性
DefaultExecutionOrderは、同じ更新段階での型の実行順を指定します。プロジェクトのスクリプト実行順設定に上書きがある場合は、そちらが優先されます。Startより先にLateUpdateを実行する、といったコールバックの段階自体を並べ替えるものではありません。
ScriptTypeID・SerializedFieldIDは、名前とは別の永続識別子を明示します。未指定時には生成処理がIDを決定します。作成済みScriptにこれらの属性が付いている場合は、名前変更だけでIDを作り直さないでください。表のGUIDは書式の例です。同じGUIDを複数のScriptやFieldへコピーして使い回しません。
NativeAssetTypeはEngine側の既存Asset型へ付いている接続用の属性です。ゲーム用の独自クラスへ付けるだけで、新しいAsset形式の読み込み機能が追加されるものではありません。
属性を変更した後の確認
- C#ファイルを保存し、ビルド・再読み込みを完了させます。
- 対象GameObjectを選択し、ScriptのInspectorを確認します。
- 値を編集してSceneを保存し、再読み込み後にも保持されるか確認します。
- Play中の編集は実行用Worldへの変更です。Stop後の編集値へ自動保存されるものとして扱わないでください。