我有几个编辑器窗口,在其中通过对话框设置属性值。对话框很大,有一堆嵌套属性。一般来说,使用窗口看起来像这样:
using UnityEngine;
using UnityEditor;
public class MyEditorWindow : EditorWindow
{
[MenuItem("Window/My Editor Window")]
public static void ShowWindow()
{
GetWindow<MyEditorWindow>();
}
// список свойств окна к изменению
public string[] Strings = { "Larry", "Curly", "Moe" };
// ссылка на сериализованный объект где будут наши свойства окна
SerializedObject so;
private void OnEnable()
{
//здесь инициируем объект
so = new SerializedObject(this);
}
void OnGUI()
{
so.Update();
//дальше выводим нужный интерфейс через EditorGUILayout, а ля
SerializedProperty stringsProperty = so.FindProperty("Strings");
EditorGUILayout.PropertyField(stringsProperty, true);
so.ApplyModifiedProperties(); // Вот здесь периодически и падает ошибка
}
}
通过搜索,我发现有一个问题,当场景中的对象失去焦点时,以及在更新对象属性时在对话框之间进行转换时,so.ApplyModifiedProperties();编辑器经常会生成错误
SerializedObject 目标已被销毁
我尝试将渲染包含在BeginChange和中EndChange,但没有帮助。这似乎不会影响对话框中数据的完整性,但很烦人。
有谁知道如何处理这个问题?
一般来说,开发人员不想要别人自己创建的东西,
SerializedObject文档甚至没有对其属性的描述,他们是谁inspectorMode或inspectorDataMode在Editor.cs......好吧,谁知道呢。而且,我写的色情片new SerializedObject(this)完全是没有人预见到的,没有什么可抗争的。SerializedObject数据流化并出现IDisposable,其生命周期需要监控。这是在类中编写的Editor,该类是target为其创建和销毁的SerializedObject。在检查器中使用时,target它会在选定对象的上下文中自动分配,但如果您不谈论检查器,则可以轻松地手动执行此操作。理论上和一般来说,根据编程原理,数据模型应该与可视化分开。也就是说,数组不应该在 fields 中
EditorWindow,因为窗口充当视图。您EditorWindow需要Editor通过调用并一点一点地OnGUI使用它们来从集合中构建一个组合。EditorGUI我找到了出现错误的原因。在OnGUI内部,显示了一个界面,并且有一个按钮可以更新父窗口中的属性并关闭对话框本身。原来窗口已经关闭了,但是OnGUI还在绘制不存在的对话框界面。
因此,所需要的只是在界面渲染并工作后调用窗口关闭过程
so.ApplyModifiedProperties();