簡體   English   中英

Unity:檢查器找不到ScriptableObject的字段

[英]Unity: Inspector can't find field of ScriptableObject

我在顯示ScriptableObject的公共字段時遇到麻煩,這是我正在檢查的組件的子級。 盡管我可以通過另一種方式輕松完成此操作,但我需要此方法來處理其他變量。 (可重排序列表)

我簡化了問題,也許我只是在做一些明顯的錯誤,但看不到我在做什么。

代碼+錯誤: http//answers.unity3d.com/storage/temp/70243-error.png

class SomeComponent : MonoBehaviour{
   public MyScriptable scriptable; //instantiated and saved as asset
}

[Serializable] class MyScriptable : ScriptableObject{
   [SerializeField] public float value = 0.1f;
}

[CustomEditor(typeof(SomeComponent))] class SomeComponentEditor : Editor{
     public override void OnInspectorGUI() {

         if((target as SomeComponent).scriptable==null) (target as SomeComponent).scriptable = ScriptableObject.CreateInstance(typeof(MyScriptable)) as MyScriptable;

         EditorGUILayout.PropertyField(serializedObject.FindProperty("scriptable"));                                 
         //shows the asset
         EditorGUILayout.PropertyField(serializedObject.FindProperty("scriptable").FindPropertyRelative("value"));   
         //error
    }
}

要修復您的代碼,您可以執行以下操作:

using UnityEditor;
using UnityEngine;

class SomeComponent : MonoBehaviour
{
    public MyScriptable myScriptable;
}

class MyScriptable : ScriptableObject
{
    public float myChildValue = 0.1f;
}

[CustomEditor(typeof(SomeComponent))]
class SomeComponentEditor : Editor
{
    public override void OnInspectorGUI()
    {
        SomeComponent someComponent = target as SomeComponent;
        if (someComponent.myScriptable == null)
            someComponent.myScriptable = CreateInstance<MyScriptable>();

        SerializedProperty myScriptableProp = serializedObject.FindProperty("myScriptable");
        EditorGUILayout.PropertyField(myScriptableProp);

        SerializedObject child = new SerializedObject(myScriptableProp.objectReferenceValue);
        SerializedProperty myChildValueProp = child.FindProperty("myChildValue");
        EditorGUILayout.PropertyField(myChildValueProp);
        child.ApplyModifiedProperties();
    }
}

要檢查子對象,您首先需要為其創建一個SerializedObject版本,然后可以像往常一樣搜索其屬性。

此外,不需要在其上從個ScriptableObject派生並且僅需要SerializeField屬性序列化私有字段時類Serializable屬性; 默認情況下,公共字段在Unity中被序列化。

在不了解代碼原始上下文的情況下,您的方法對我來說似乎有點特殊。 ScriptableObject實例旨在用作Unity項目中的資產文件。 您是否使用過CreateAssetMenu屬性? 通常,您可以通過菜單手動創建資產,然后將其插入組件。 您執行此操作的方式不會將其寫入磁盤,那么為什么要使用ScriptableObject而不是普通的類呢? 但是,也許這一切在您的實際情況下都是有意義的,所以請不要介意我錯了。

找到黑客解決方案:

    SerializedObject newserobj = new SerializedObject(serializedObject.FindProperty("scriptable").objectReferenceValue );
    EditorGUILayout.PropertyField(newserobj.FindProperty("value"));   
    newserobj.ApplyModifiedProperties();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM