Awake() 中的 ScriptableObject 更改只有在 Unity 重新启动后才会显示在 Inspector 中

问题描述 投票:0回答:1

我创建了一个 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
而导致错误。

如有任何帮助,我们将不胜感激。

c# unity-game-engine inspector unity-editor scriptable-object
1个回答
0
投票

自从我上次接触 Unity 以来已经有很多年了,但据我记得它确实使用 Mono 运行时进行脚本编写,因此它应该遵循类类型对象的 C# 成员初始化为 null 的规则。

所以基本上在你的情况下发生的是→ ※ 您创建可编写脚本的对象 ※ Unity调用其Awake方法 ※ 由于

someOtherClassList
为空,因此会出现错误 ※ 检查器中什么也没有显示

您应该做的是空检查,然后实例化对象

private void Awake() {

    if (someOtherClassList == null) {
        someOtherClassList = new List<someOtherClass>();
    }
    // Do stuff
    someOtherClassList.Add(new someOtherClass() { });
}

正如你在这里看到的,现在它出现了

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.