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生成するってあんまりやりたくないよなぁ…。
なにか良い方法あればコメントでおしえてください。