ScriptableObject是Unity自建的一種序列化文件格式.
問(wèn)題:
在項(xiàng)目中自定義保存的時(shí)候. 出現(xiàn)了關(guān)閉項(xiàng)目后, ScriptableObject不序列化的問(wèn)題.
解決:
由于使用了自定義Editor面板和按鍵. //2020.4.12日修正: 無(wú)論是否使用自定義的Editor面板, 要保存ScriptableObject,必須加上序列化命令.?
而在Editor中, 序列化對(duì)象, 需要將對(duì)象標(biāo)識(shí)為Dirty. 具體命令為:
EditorUtility.SetDirty(target);
其中, target代表你需要序列化的對(duì)象, 在項(xiàng)目中, 為對(duì)應(yīng)的ScriptableObject.
完整代碼附錄:
[CustomEditor(typeof(SaveKeyAndTrigger))]
public class SaveKeyAndTriggerEditor : Editor {
? ? SaveKeyAndTrigger cur_SaveKeyAndTrigger;
? ? public override void OnInspectorGUI()
? ? {
? ? ? ? base.OnInspectorGUI();
? ? ? ? cur_SaveKeyAndTrigger = (SaveKeyAndTrigger)target;
? ? ? ? if (GUILayout.Button("Load"))
? ? ? ? {
? ? ? ? ? ? cur_SaveKeyAndTrigger.LoadFile();
? ? ? ? }
? ? ? ? if (GUILayout.Button("Check"))
? ? ? ? {
? ? ? ? ? ? cur_SaveKeyAndTrigger.CheckFile();
? ? ? ? }
? ? ? ? if (GUILayout.Button("Save"))
? ? ? ? {
? ? ? ? ? ? cur_SaveKeyAndTrigger.SaveFile();
? ? ? ? ? ? EditorUtility.SetDirty(cur_SaveKeyAndTrigger.cur_SkillInfoData);//這里就是關(guān)鍵的一句.其中SkillInfoData是腳本化對(duì)象.//2020-4-12, 這句可以直接寫在原類中的SaveFile()函數(shù)中.
? ? ? ? }
? ? }
}
問(wèn)題:
ScriptableObject中的數(shù)組無(wú)法直接賦予初始值. 并且, 數(shù)組中的元素也無(wú)法給予初始值?
回答:
目前的解決辦法是在Awake()函數(shù)中直接建立新對(duì)象, 可以正常獲得初始值, 但通過(guò)修改數(shù)組容量獲得的新對(duì)象依舊無(wú)法獲得初始值.("想罵人")
e.g.
[CreateAssetMenu(menuName ="Jauved/SkillDataFile")]
public class SkillData : ScriptableObject {
? ? //public Dictionary<string,string> skills;//Unity無(wú)法序列化Dictionary, Fxxk
? ? public List<Skill> SkillList;
? ? private void Awake()
? ? {
? ? ? ? SkillList = new List<Skill>(4) { new Skill(), new Skill(), new Skill(), new Skill()};//這里就是粗暴的新建定容的List, 并且還需要加入初始值才可以讓ScriptableObject中的數(shù)組/List有初始值. 而且, 通過(guò)修改容量獲得的新對(duì)象依舊無(wú)法擁有初始值.
? ? }
? ? public void Save(Skill skill)
? ? {
? ? ? ? SkillList.Add(skill);
? ? }
}