Skip to content

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の全属性 ​

リンク先では正式な型名、コンストラクター、引数を確認できます。

属性付ける対象用途記述例
SerializeFieldFieldprivateなどのFieldを保存・Inspector編集の対象にする[SerializeField] private float speed;
SerializeReferenceField基底クラス・インターフェース型へ、実際の派生型を保持して保存する[SerializeReference] private IAction? action;
HideInInspectorField保存対象のままInspectorから隠す[HideInInspector] public int count;
ReadOnlyFieldInspectorで値を表示するが編集させない。C#からの書き換えと保存は維持する[SerializeField, ReadOnly] private int hitCount;
Range数値FieldInspectorの数値編集に最小値・最大値を指定する[SerializeField, Range(0.0f, 10.0f)] private float speed;
Min数値Field数値編集の下限を指定する[SerializeField, Min(0.0f)] private float radius;
DragSpeed数値FieldInspectorでドラッグして数値を変更するときの増減速度を指定する[SerializeField, DragSpeed(0.05f)] private float power;
Multilinestring Field複数行で文字列を編集する[SerializeField, Multiline] private string text = "";
SeparatorTextFieldFieldの上に区切り見出しを表示する[SerializeField, SeparatorText("移動")] private float speed;
LabelFieldInspectorの表示名を変更する。C#の変数名は変更しない[SerializeField, Label("移動速度")] private float speed;
TooltipFieldInspectorでホバーしたときの説明を指定する[SerializeField, Tooltip("1秒あたりの移動量")] private float speed;
FormerlySerializedAsField名前変更前のField名を指定し、保存値の対応付けを維持する[SerializeField, FormerlySerializedAs("oldSpeed")] private float speed;
FormerlyKnownScriptTypeScriptクラス名前空間・クラス名を変更する前の完全修飾名を指定する[FormerlyKnownScriptType("Game.OldMover")]
DefaultExecutionOrderScriptクラス型の既定実行順を指定する。小さい値の型が先になる[DefaultExecutionOrder(-50)]
ScriptTypeIDScriptクラスScriptの永続GUIDを明示する。既存の指定があれば維持する[ScriptTypeID("c34dd7a7-c3e0-466d-8f3c-bf8742d80413")]
SerializedFieldID保存FieldFieldの永続GUIDを明示する。既存の指定があれば維持する[SerializedFieldID("b91177c9-35a7-4ae3-99a4-e914a1151fe1")]
NativeAssetTypeEngineの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.NonSerializedFieldpublic 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形式の読み込み機能が追加されるものではありません。

属性を変更した後の確認 ​

  1. C#ファイルを保存し、ビルド・再読み込みを完了させます。
  2. 対象GameObjectを選択し、ScriptのInspectorを確認します。
  3. 値を編集してSceneを保存し、再読み込み後にも保持されるか確認します。
  4. Play中の編集は実行用Worldへの変更です。Stop後の編集値へ自動保存されるものとして扱わないでください。

関連項目 ​

現行版マニュアル · 8ea58ba2 · 2026-10-28確認