偶発ゲーム開発

主にUnityでゲームを作ります。

ScriptableObjectのシリアライズしてない変数はビルド実行時に保持されない??

タイトルまんまですが、
UnityはDictionaryのシリアライズがデフォではできない…(Godotならできるのに!)

よって下記みたいにクラスを作ってからDictionaryに流し込んだりしなくてはいけない。

 [SerializeField]
    private List<Clip> clipList = new List<Clip>();
//インスペクタで設定

    private Dictionary<string, AudioClip> clipDic = new Dictionary<string, AudioClip>();


    [System.Serializable]
    public class Clip{

        [SerializeField]
        private string title;
        
        [SerializeField]
        private AudioClip audioClip;

        public string Title => title;
        public AudioClip AudioClip => audioClip;
    }//Dictionaryに流し込むクラスを定義

    private void OnValidate()
    {
        DictionaryUpdate();
    }//変数が変更されたらDictionaryを更新

    public Dictionary<string, AudioClip> GetDictionary() {
        
        return clipDic;
    }//Dictionaryを返す


    public void DictionaryUpdate() {
        clipDic = new Dictionary<string, AudioClip>();
        foreach (Clip clip in clipList) {
            clipDic.Add(clip.Title, clip.AudioClip);
        }//Dictionaryの更新
    }


しかしこのコード、エディタ上では動作するがビルド時だとDictionaryが空になってしまっている!

    public Dictionary<string, AudioClip> GetDictionary() {
        DictionaryUpdate();
        return clipDic;
    }//Dictionaryを返す

のようにランタイムで生成を行ってから返すことで動作するようになった。
ScriptableObjectはビルド時にインスペクタの値以外を保持してくれるわけではないっぽい。

でもランタイムでDictionary生成するってあんまりやりたくないよなぁ…。

なにか良い方法あればコメントでおしえてください。