我创建了一个 ScriptableObject 类
MySO
,它在其 Awake()
函数中进行了修改。我还添加了 EditorUtility.SetDirty(this);
作为最后一个命令。该类有一个 List<someOtherClass> myList
字段。在 Awake
函数中,我向此列表添加了几个实例。
当通过 AssetMenu 创建
MySO
的新实例时,起初,它似乎在检查器中正确显示列表,但当我单击任意位置或按 Enter 键时,列表会清空。只有重新启动 Unity 后,更改才会显示出来。
所有相关内容都是
public
或 [Serializable]
。
[CreateAssetMenu(fileName = "NewMySO", menuName = "MySO")]
[System.Serializable]
public class MySO : ScriptableObject
{
public List<someOtherClass> someOtherClassList;
private void Awake()
{
//-------------------------
//add instances to someOtherClassList
//--------------
EditorUtility.SetDirty(this);
//AssetDatabase.SaveAssets(); //Didn't help
//AssetDatabase.Refresh(); // Didn't help
}
}
我也尝试在
AssetDatabase.SaveAssets()
之后添加 AssetDatabase.Refresh()
和 SetDirty(this)
。两者都不起作用,并且第一个会由于 restrictions during asset importing
而导致错误。
如有任何帮助,我们将不胜感激。
自从我上次接触 Unity 以来已经有很多年了,但据我记得它确实使用 Mono 运行时进行脚本编写,因此它应该遵循类类型对象的 C# 成员初始化为 null 的规则。
所以基本上在你的情况下发生的是→ ※ 您创建可编写脚本的对象 ※ Unity调用其Awake方法 ※ 由于
someOtherClassList
为空,因此会出现错误
※ 检查器中什么也没有显示
您应该做的是空检查,然后实例化对象
private void Awake() {
if (someOtherClassList == null) {
someOtherClassList = new List<someOtherClass>();
}
// Do stuff
someOtherClassList.Add(new someOtherClass() { });
}
正如你在这里看到的,现在它出现了