【Unity】Unity2020.1でGenericな型がシリアライズ可能になりました

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を表示すると正常にシリアライズされていることが確認できます。

f:id:halya_11:20200726223705p:plain
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.

関連

light11.hatenadiary.com