シリアライズドオブジェクト

SerializedObject クラスは、シリアル化されたオブジェクトを操作し、そのプロパティやフィールドへのアクセスを提供するためにエディター拡張で使用する。

カスタムエディターを定義した場合、その内部では対象のシリアル化されたオブジェクトに対して serializedObject プロパティを介してアクセスできる。オブジェクトのプロパティは FindProperty メソッドにより得られる SerializedProperty クラスを介してアクセスする。

ドキュメント:

UnityEditor.SerializedObject | Unity スクリプトリファレンス [公式]

導入

参考:

Seriazlied Object に迫る – Qiita

使い方

[CustomEditor(typeof(ExampleClass))]
class ExampleClassEditor : Editor
{
    SerializedProperty prop;

    void OnEnable() {
        prop = serializedObject.FindProperty("propOfExampleClass");
    }

    public override void OnInspectorGUI() {
        serializedObject.Update();
        EditorGUILayout.PropertyField(prop);
        serializedObject.ApplyModifiedProperties();
    }
}Code language: C# (cs)

参考:

Serialized Object の勘所をまとめてみる | LIGHT11

非 public リストの各要素に名前を付ける | ミドリ黄のプログラミングメモノート

object field getting serialized object in Custom Editor – Unity Answers

Custom Inspector for Scriptable Object not working – Stack Overflow

I can’t change the value of a serialized variable in Custom Inspector – Stack Overflow

FindProperty retuns null – Stack Overflow

Null Reference Exception when SerializedProperty has any accessor – Stack Overflow

全てのプロパティを表示する

参考:

Serialized Object のもつ全てのプロパティを描画する | LIGHT11

Serialized Object を使用して指定されたオブジェクトのすべてのプロパティのパス名を抽出するエディタ拡張 | コガネブログ

Editor Window で独自クラスの配列を行う | 万年素人から Hacker への道

シリアル化

フィールド
  • public フィールド、または、SerializedField 属性が付与されたフィールドがシリアライズの対象となる。
  • staticconstreadonly が指定されたフィールドはシリアライズされない。
タイプ
  • プリミティブデータ型 (intfloatdoubleboolstring など)
  • Enum
  • ビルトイン型
    • Vector2Vector3Vector4RectQuaternionMatrix4x4ColorColor32LayerMaskAnimationCurveGradientRectOffsetGUIStyle
  • Object から派生したクラスへの参照
  • Serializable 属性が付与されたカスタムクラス、または、カスタム構造体
  • 抽象クラスはシリアライズされない
  • ジェネリッククラスはシリアライズされない
  • ポリモーフィズムはサポートされない

ドキュメント:

スクリプトのシリアル化 | Unity マニュアル [公式]

ビルトインのシリアル化 | Unity 2020.3 マニュアル [公式]

テキストシリアル化ファイルの形式 | Unity マニュアル [公式]

参考:

スクリプトがシリアライズされる仕組み | ねこじゃらシティ

シリアライズされたフィールドの値はどこにあるの? | エクスプラボ

Custom Editor of List don’t show properties but a GameObject – Stack Overflow

シリアライズドプロパティ

メンバ変数

ドキュメント:

UnityEditor.SerializedProperty | Unity スクリプトリファレンス [公式]

SerializedObject.FindProperty | Unity スクリプトリファレンス [公式]

SerializedProperty.FindPropertyRelative | Unity スクリプトリファレンス [公式]

参考:

Why `SerializedProperty.Update` is called in the beginning? – Unity Answers

SerializedProperty doesn’t update displayed value in Editor – Unity Answers

Trying to access properties inside a class with SerializedProperty not working – Unity Forum

プロパティフィールド

ドキュメント:

EditorGUILayout.PropertyField | Unity スクリプトリファレンス [公式]

参考:

手抜きしてインスペクター拡張 – Qiita

インスペクター拡張の基礎 | Unity でコードからGUIを作る (kumaS)

スクリプタブルオブジェクト

こちらのページを参照

ドキュメント:

UnityEngine.ScriptableObject | Unity スクリプトリファレンス [公式]

参考:

エディタ拡張で自作クラスの Serialized Object 取得 – teratail

配列

参考:

シリアライズ化されたインスタンスを配列として扱う | ソフトライム

編集/保存

  • Undo.RegisterCompleteObjectUndo アンドゥ用にオブジェクトの状態を保存する
  • EditorUtility.SetDirty 編集が未保存であることをマークする
  • AssetDatabase.SaveAssets 未保存のアセット変更を全て保存する
  • AssetDatabase.SaveAssetIfDirty 指定したアセットの未保存の変更を保存する (※ 2020.3.16 ~)

ドキュメント:

Undo.RegisterCompleteObjectUndo | Unity スクリプトリファレンス [公式]

EditorUtility.SetDirty | Unity スクリプトリファレンス [公式]

AssetDatabase.SaveAssets | Unity スクリプトリファレンス [公式]

AssetDatabase.SaveAssetIfDirty | Unity スクリプトリファレンス [公式]

参考:

AssetDatabase.SaveAssetIfDirty – 指定したアセットだけを保存する方法 – Qiita

シリアライズ対象の値を直接編集する際の挙動をちゃんと理解する | LIGHT11

Scriptable Object の変更した値が戻ってしまう場合の対処法 | kan のメモ帳

EditorUtility.SetDirty のなく頃に | 徳島ゲーム開発ごっこ技術ブログ

オブジェクト参照 (objectReferenceValue)

objectReferenceValue から値を取得すると UnityEngine.Object 型を返すので本来の型にキャストして使用する。

ドキュメント:

SerializedProperty.objectReferenceValue | Unity スクリプトリファレンス [公式]

参考:

GameObject を Serialized Property へ設定する – Qiita

Missing があるアセットを検索する | WonderPlanet Developers’ Blog

Get a general object value from SerializedProperty? – Unity Forum

Trying to access properties inside a class with SerializedProperty not working – Unity Forum

After assigned to SerializedProperty.objectReferenceValue it is still null – Unity Forum

objectReferenceValue in SerializedProperty – Unity Answers

How to properly check serializedProperty.objectReferenceValue for null? – Unity Answers

SerializedProperty is null (Property Drawer) – Unity Answers

Help with SerializedProperty.ObjectReferenceValue – Unity Answers

SerializedProperty always null with Property Drawers – Stack Overflow

カスタムクラス

参考:

自作クラス型の Serialized Property に値をセットする | LIGHT11

隣の Serialized Property を知りたくて | 徳島ゲーム開発ごっこ 技術ブログ

Convert Serialized Property to Custom Class – Unity Answers

マネージド参照 (managedReferenceValue)

ドキュメント:

SerializedProperty.managedReferenceValue | Unity スクリプトリファレンス [公式]

参考:

SerializedProperty.managedReferenceValue の値を取得する – Qiita

boxedValue

※ 2022.1 ~

ドキュメント:

SerializedProperty.boxedValue | Unity 2022.1 スクリプトリファレンス [公式]

参考:

Null Reference when trying to retreive boxed value from Serialized Property – Unity Forum

Writing drawers for classes with properties that can’t be bound – Unity Forum

ジェネリッククラス (Generic)

ドキュメント:

カスタム製のシリアル化 | Unity 2020.3 マニュアル [公式]

参考:

Inspector で扱える Dictionary – Qiita

ジェネリッククラスを Inspector に表示するにはどうすればいいの? | ケットシーウェア

Unity 2020.1 で Generic な型がシリアライズ可能になりました | LIGHT11

Generic なクラスをシリアライズできた | テラシュールブログ

シリアライズ可能なコレクション | wizaman’s blog

自前のクラスをインスペクタから編集できるようにする | ftvlog

generics serialization – Unity Forum

serializable class using generics – Unity Answers

まとめ

インスペクター拡張の基礎 | Unity でコードから GUI を作る (kumaS)

Serialized Object の勘所をまとめてみる | LIGHT11

Serializable Dictionary (azixMcAze)

入手:

Serializable Dictionary | Unity Asset Store [Official]

リポジトリ:

azixMcAze/Unity-SerializableDictionary: Serializable Dictionary – GitHub

フォーラム:

Serializable Dictionary | Unity Forum

Serialized Dictionary (Prastiwar)

リポジトリ:

Prastiwar/UnitySerializedDictionary: Serialized Dictionary – GitHub

参考:

Serialized Dictionary – Inspector で編集できる Dictionary | コガネブログ

Serializable Dictionary (baba-s)

リポジトリ:

baba-s/UniSerializableDictionary: Dictionary を Inspector で設定できるようにするクラス – GitHub

Serializable Collections (neuecc)

リポジトリ:

neuecc/SerializableDictionary: Serializable Collections – Serializable Dictionary / Serializable Lookup / Serializable Tuple – GitHub

参考:

Serializable Dictionary – 高速に辞書復元するためのライブラリ | neue cc

Scriptable Dictionary

動画:

Demo

入手:

Scriptable Dictionary | Unity Asset Store [Official]

記事をシェアする:
タグ:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Protected by reCAPTCHA