LIGHT11LIGHT11読者になるLIGHT112020-01-30【Unity】Unity2019.3から抽象クラスやインタフェースがシリアライズ可能に!使い方と注意点UnityUnity2019.3から抽象クラスやインタフェースがシリアライズ対象として指定できるようになりました。この記事ではその使い方と注意点についてまとめます。SerializeReferenceSerializeReferenceは「参照」をシリアライズする初期化処理の違いYAMLを見て理解を深めるUnity2019.3.0ちゃんと理解するための記事を書きましたSerializeReferenceをしっかり理解するための記事を別記事として投稿しました。light11.hatenadiary.comより踏み込んだ内容となっていますので、必要に応じてこちらも参照してください。SerializeFieldまず従来のシリアライズとその制約についてまとめます。フィールドをpublicにするか、SerializeFieldアトリビュートをつけるとその値はシリアライズされます。_someInt2;}シリアライズされた値はInspectorから編集することができます。これらの値はPrefabやScene、ScriptableObjectに保存されます。抽象クラスやインタフェースのフィールドをシリアライズできないという制約がありました。}この制約はポリモーフィズムを前提とした設計をする上で大きな制約となっていました。Unity2019.3からは次節で説明するSerializeReferenceアトリビュートを使うことでシリアライズできるようになりました。抽象クラスやインタフェースのフィールドをシリアライズすることができます。}上記のスクリプトをGameObjectにアタッチすると、下図のようにBaseClassのサブクラスであるSomeClass型のフィールドがInspectorに表示されます。SerializeReferenceは「参照」をシリアライズするこのSerializeReferenceは、実はSerializeFieldのようにオブジェクトのフィールドの値を直接シリアライズしているのではなく、オブジェクトの参照をシリアライズしています。これを確認するために以下のコードを書いてみます。_someField;}これをGameObjectにアタッチしてInspectorを見ると、_someClass1と_someClass2の値が連動することが確認できます。これは_someClass1と_someClass2が同じオブジェクトを参照しているためです。初期化処理の違いSerializeReferenceを使う際の注意点として、SerializeFieldとの初期化処理の違いがあります。SerializeFieldはデフォルトコンストラクタで初期化が行われます。明示的な初期化を行わなくてもnullになることはありません。これに対してSerializeReferenceは明示的に初期化しないとnullが代入されます。この仕様は以下のソースコードで確認できます。_someField;}YAMLを見て理解を深める最後に、より理解を深めるために実際にシリアライズされたYAMLを見てみます。クラス型のフィールドをSerializeFieldでシリアライズすると、以下のようにフィールドの中にフィールドのマッピングを入れ子にして直接書かれます。456これに対してSerializeReferenceでシリアライズすると、以下のようにオブジェクトの情報がreferencesの中に全て書かれます。このIDだけがSerializeReferenceを付けたフィールドのシリアライズ情報として書き込まれています。この仕組みにより前述の「参照のシリアライズ」が実現されています。1はてなブログをはじめよう!halya_11さんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。