Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity:ScriptableObject的自定义检查器不工作_C#_Unity3d_Save_Scriptable Object - Fatal编程技术网

C# Unity:ScriptableObject的自定义检查器不工作

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

我为一些ScriptableObject创建了自定义检查器。检查员似乎工作得很好。如果在检查器中更改了一个值,则在游戏中使用该值。但只要我重新启动Unity,该值就会恢复到原来的值,因此更改后的值不会应用于该文件。我已经查过文件了。这是我的海关检查员:

[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偏移量名称必须完全匹配,并且必须是序列化字段。。如果它是一个财产,它将不起作用。