我有这个大型 ScriptableObject (+150MB),用于存储与游戏中角色相关的各种数据。
选择后,Unity 编辑器的速度会大大减慢,我的第一个想法是创建一个自定义检查器,因为默认设置可能会很慢,其中包含所有收集数据。
但即使使用这个空的自定义检查器,在编辑器中选择大型 ScriptableObject 时也会出现同样的速度减慢。
[CustomEditor(typeof(NPCData))]
public class NPCDataEditor : Editor
{
CustomSampler samplerOnInspectorGUI = CustomSampler.Create("samplerOnInspectorGUI");
CustomSampler samplerOnEnable = CustomSampler.Create("samplerOnEnable");
private void OnEnable()
{
onEnableSampler.Begin();
Debug.Log("NPCDataEditor::OnEnable");
onEnableSampler.End();
}
public override void OnInspectorGUI()
{
OnInspectorGUISampler.Begin();
// base.OnInspectorGUI();
OnInspectorGUISampler.End();
}
}
令我惊讶的是,这并没有帮助,当在编辑器中选择 ScriptableObject 时,Unity 仍然在处理 ScriptableObject 的大小问题。
因此,我认为我应该创建一个单独的编辑器窗口或代理脚本对象,它从大型 ScriptableObject 异步加载数据,然后仅在其自己的轻量级自定义检查器/窗口中呈现一小部分数据。
这样,大型 ScriptableObject 将不会在编辑器中被选择,我仍然可以通过代码操作它的数据。
但这听起来并不理想。
谢谢你,
我通过创建自定义编辑器窗口并加载/缓存可编写脚本的对象解决了这个问题。
然后我在窗口内渲染了可编写脚本的对象检查器。
不再减速。无需使用自定义检查器创建较小的代理复制脚本对象。
我们使用 ODIN,因此创建窗口并嵌入 SO 检查器只需几行即可完成。
附注我们总是在游戏中明确禁用 ODIN 序列化,我们只保留编辑器的好处。