C# Unity:ScriptableObject的自定义检查器不工作
我为一些ScriptableObject创建了自定义检查器。检查员似乎工作得很好。如果在检查器中更改了一个值,则在游戏中使用该值。但只要我重新启动Unity,该值就会恢复到原来的值,因此更改后的值不会应用于该文件。我已经查过文件了。这是我的海关检查员:C# Unity:ScriptableObject的自定义检查器不工作,c#,unity3d,save,scriptable-object,C#,Unity3d,Save,Scriptable Object,我为一些ScriptableObject创建了自定义检查器。检查员似乎工作得很好。如果在检查器中更改了一个值,则在游戏中使用该值。但只要我重新启动Unity,该值就会恢复到原来的值,因此更改后的值不会应用于该文件。我已经查过文件了。这是我的海关检查员: [CustomEditor(typeof(ScriptableObjects.OBJ))] public class OBJEditor: UnityEditor.Editor { public override void OnInspe
[CustomEditor(typeof(ScriptableObjects.OBJ))]
public class OBJEditor: UnityEditor.Editor {
public override void OnInspectorGUI() {
_ = DrawDefaultInspector();
ScriptableObjects.OBJ obj = (ScriptableObjects.OBJ) target;
obj.Offset = EditorGUILayout.Vector2Field("Offset", obj.Offset);
...
EditorUtility.SetDirty(obj);
}
}
我添加了行EditorUtility.SetDirty(bc)代码>因为我读到这一行应该对文件应用更改。…
代表一些与点上方的两行几乎相同的其他行
如何将更改保存到ScriptableObject文件。将强制转换的“目标”缓存到inspector的OnEnable方法被认为是最佳做法。
你也有一个输入错误,你正在设置一个名为“bc”的对象变量,而你的目标变量是“obj”,你也在每次绘图调用时将其设置为“dirty”,这会一直弄脏你的项目,最好在实际发生变化时弄脏它
[CustomEditor(typeof(ScriptableObjects.OBJ))]
public class OBJEditor: UnityEditor.Editor
{
ScriptableObjects.OBJ obj = null;
protected void OnEnable()
{
obj = (ScriptableObjects.OBJ)target;
}
public override void OnInspectorGUI()
{
serializedObject.Update();
_ = DrawDefaultInspector();
EditorGUI.BeginChangeCheck();
obj.Offset = EditorGUILayout.Vector2Field("Offset", obj.Offset);
...
bool somethingChanged = EditorGUI.EndChangeCheck();
if(somethingChanged)
{
EditorUtility.SetDirty(obj);
}
serializedObject.ApplyModifiedProperties();
}
}
您需要将要标记为脏的正确对象传递给EditorUtility.SetDirty()代码>。
目前您正在通过bc
,但您需要通过obj
,因为这就是您在代码中对其命名的方式。
这会将ScriptableObject标记为脏对象,一旦选择了文件>保存项目
,它就会被保存
因此,更改EditorUtility.SetDirty(bc)代码>至EditorUtility.SetDirty(obj)代码>不要通过目标直接更改值强>
手动处理设置脏和撤消/重做是复杂和不必要的
始终使用内置和直通
[CustomEditor(typeof(ScriptableObjects.OBJ))]
公共类对象编辑器:UnityEdit.Editor
{
私有财产抵销;
私有void OnEnable()
{
//链接属性
偏移量=serializedObject.FindProperty(“偏移量”);
}
公共覆盖无效OnInspectorGUI()
{
DrawDefaultInspector();
//将实际类值加载到序列化副本中
serializedObject.Update();
//自动为类型使用相应的PropertyDrawer
EditorGUILayout.PropertyField(偏移量);
...
//写回更改的值并将evtl标记为脏并处理撤消/重做
serializedObject.ApplyModifiedProperties();
}
}
我也有同样的问题,需要添加关键字
[CanEditMultipleObjects]
到类定义的顶部。哦,对不起,我忘了更改名称。但不幸的是,这不是问题所在。这只是我的问题中的一个输入错误。serializedObject.ApplyModifiedProperties()
只有在您更改serializedObject
的属性时才有意义,这在您的代码中不是这样的……我知道,但这只是为了防止“DrawDefaultInspector”中发生更改。EditorGUILayout.PropertyField(偏移量)
给我一个NullReferenceException:对象引用未设置为对象的实例
。我认为,OnEnable()
没有被调用。OnEnable
被调用(您可以使用断点查找)。。由于我没有看到您的OBJ
类的实现,我假设您将有一个公共向量2偏移量
或[SerializeField]专用矢量2偏移量代码>名称必须完全匹配,并且必须是序列化字段。。如果它是一个财产,它将不起作用。