うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】Interface や abstract class をシリアライズする

Unity 2019.3 から SerializeReference が導入され
interface や abstract class でもシリアライズできるようになりました

Unity - Scripting API: SerializeReference

SerializeField では 値型でシリアライズされるのですが
SerializeReference は 参照型でシリアライズできるようになっているため
interface や abstract class でもシリアライズできるようになっております

Interface の シリアライズ

f:id:hacchi_man:20200902041538p:plain:w200

using UnityEngine;
 
public interface ISample {}
 
public class SampleMonoBehaviour : MonoBehaviour
{
    [SerializeReference]
    private ISample target = new Sample1();
 
    private class Sample1 : ISample
    {
        public int Value;
    }
 
    private class Sample2 : ISample
    {
        public string Value;
    }
}

abstract class のシリアライズ

f:id:hacchi_man:20200902041754p:plain:w200

using UnityEngine;
 
public abstract class SampleBase
{
    public int BaseValue;
}
 
public class SampleMonoBehaviour : MonoBehaviour
{
    [SerializeReference]
    private SampleBase target = new Sample1();
 
    private class Sample1 : SampleBase
    {
        public int Value;
    }
 
    private class Sample2 : SampleBase
    {
        public string Value;
    }
}

Array List には非対応

例えば以下のように Array にしてみると何も表示されないので
Editor を拡張して表示できるようにする必要がある

f:id:hacchi_man:20200902042517p:plain:w200

   [SerializeReference]
    private SampleBase[] target = new SampleBase[]
    {
        new Sample1(),
        new Sample2(),
    };