Unity2020.1からGenericな型がシリアライズ可能になりました。
Unity2020.1
Unity2020.1からGenericな型がシリアライズできるようになった
Unity2020.1からGenericな型をシリアライズできるようになりました。
挙動を確認するために以下のコードを記述します。
using System; using UnityEngine; public class Example : MonoBehaviour { // Genericなクラスのインスタンスをシリアライズ可能に [SerializeField] private ExampleGeneric<int> _int; [SerializeField] private ExampleGeneric<string> _string; [SerializeField] private ExampleGeneric<Rect> _rect; [SerializeField] private ExampleGeneric<AnimationCurve> _animationCurve; } // SerializableでGenericなクラス [Serializable] public class ExampleGeneric<T> { public T _testField; }
これを適当なGameObjectにアタッチしてInspectorを表示すると正常にシリアライズされていることが確認できます。
いままではシリアライズできるようにGeneric型を継承した型のクラスをたくさん作ったりしていましたが、その必要がなくなりました。
SerializeReferenceには使えない
ちなみにSerializeReferenceアトリビュートにも対応しているかなと思い試しましたが、ダメでした。
using System; using UnityEngine; public class Example : MonoBehaviour { // SerializeReferenceはダメ [SerializeReference] private ExampleGeneric<ExampleElement> _example; } [Serializable] public class ExampleGeneric<T> { public T _testField; } public class ExampleElement { }
以下のようなエラーが出ます。
SerializeReferenceは引き続きGenericな型に非対応のようです。
The field Example._example has the [SerializeReference] attribute applied, but is of type ExampleGeneric<ExampleElement>, which is a generic instance type. This is not supported. You must create a non-generic subclass of your generic instance type and use that as the field type instead.