[英]Unity: Custom Inspector for ScriptableObject not working
我為我的一些 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 文件。
根本不要通過target
直接更改值!
手動處理設置臟和撤消/重做是復雜且不必要的!
始終使用內置的serializedObject
並通過SerializedProperty
[CustomEditor(typeof(ScriptableObjects.OBJ))]
public class OBJEditor: UnityEditor.Editor
{
private SerializedProperty offset;
private void OnEnable()
{
// Link the properties
offset = serializedObject.FindProperty("Offset");
}
public override void OnInspectorGUI()
{
DrawDefaultInspector();
// Load the real class values into the serialized copy
serializedObject.Update();
// Automatically uses the according PropertyDrawer for the type
EditorGUILayout.PropertyField(offset);
...
// Write back changed values and evtl mark as dirty and handle undo/redo
serializedObject.ApplyModifiedProperties();
}
}
在檢查器的 OnEnable 方法上緩存您投射的“目標”被認為是最佳實踐。 你也有一個錯字,你設置了一個名為 'bc' 的對象變量,而你的目標變量是 'obj',你也在每次繪制調用時設置它,這會一直弄臟你的項目,最好弄臟它當事情真正發生變化時。
[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 標記為臟,一旦您選擇File > Save Project
,它將被保存。
所以改變EditorUtility.SetDirty(bc);
到EditorUtility.SetDirty(obj);
我有同樣的問題,它需要我添加關鍵字
[CanEditMultipleObjects]
到類定義的頂部。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.