2016-05-17 11 views
0

私が検査しているコンポーネントの子であるScriptableObjectのパブリックフィールドを表示するのに問題があります。私はこれを他の方法で簡単に行うことができますが、私はこのメソッドを他の変数のために使う必要があります。 (ReorderableLists)Unity:Inspectorが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 
    } 
} 

答えて

0

ハックソリューションが見つかりました:

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

はあなたのコードを修正するには、あなたがこれを行うことができます:

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を作成する必要がありますのバージョンです。このバージョンでは、いつものようにプロパティを検索できます。また

Serializableを属性がプライベートフィールドをシリアル化するときはScriptableObject から派生し、SerializeField属性のみが必要とされているクラスには必要ありません。パブリックフィールドは、Unityではデフォルトでシリアル化されています。

あなたのコードの元のコンテキストを知らなくても、私のアプローチは少し独特のようです。 ScriptableObjectインスタンスは、Unityプロジェクトでアセットファイルとして使用されます。 CreateAssetMenu属性をまだ使用していますか?通常は、メニューから手動でアセットを作成し、コンポーネントにプラグインします。あなたがそれをやっているように、ディスクには書き込まれません。なぜ、普通のクラスだけでなく、ScriptableObjectを使うのですか?しかし、多分あなたの実際の状況では理にかなっているので、間違っていても大丈夫です。

関連する問題