C# 统一:检查员可以';找不到ScriptableObject的字段

C# 统一:检查员可以';找不到ScriptableObject的字段,c#,unity3d,C#,Unity3d,我无法显示ScriptableObject的公共字段,该对象是我正在检查的组件的子对象。虽然我可以用另一种方式轻松地做到这一点,但我需要这种方法来处理其他变量。(可重分类列表) 我简化了问题,也许我只是做错了什么,但我看不出我做错了什么 代码+错误: 找到黑客解决方案: SerializedObject newserobj = new SerializedObject(serializedObject.FindProperty("scriptable").objectReference

我无法显示ScriptableObject的公共字段,该对象是我正在检查的组件的子对象。虽然我可以用另一种方式轻松地做到这一点,但我需要这种方法来处理其他变量。(可重分类列表)

我简化了问题,也许我只是做错了什么,但我看不出我做错了什么

代码+错误:

找到黑客解决方案:

    SerializedObject newserobj = new SerializedObject(serializedObject.FindProperty("scriptable").objectReferenceValue );
    EditorGUILayout.PropertyField(newserobj.FindProperty("value"));   
    newserobj.ApplyModifiedProperties();
找到黑客解决方案:

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

要修复代码,可以执行以下操作:

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();
    }
}
使用UnityEditor;
使用UnityEngine;
类组件:单行为
{
公共MyScriptable MyScriptable;
}
类MyScriptable:ScriptableObject
{
公共浮动myChildValue=0.1f;
}
[CustomEditor(typeof(SomeComponent))]
类SomeComponentEditor:Editor
{
公共覆盖无效OnInspectorGUI()
{
SomeComponent SomeComponent=目标为SomeComponent;
if(someComponent.myScriptable==null)
someComponent.myScriptable=CreateInstance();
SerializedProperty myScriptableProp=serializedObject.FindProperty(“myScriptable”);
EditorGUILayout.PropertyField(myScriptableProp);
SerializedObject子对象=新的SerializedObject(myScriptableProp.objectReferenceValue);
SerializedProperty myChildValueProp=child.FindProperty(“myChildValue”);
EditorGUILayout.PropertyField(myChildValueProp);
ApplyModifiedProperties();
}
}
要检查子对象,首先需要创建它的SerializedObject版本,然后可以像往常一样搜索它的属性

此外,派生自ScriptableObject的类不需要Serializable属性,只有序列化私有字段时才需要SerializeField属性;默认情况下,公共字段在Unity中序列化


在不知道代码的原始上下文的情况下,您的方法对我来说似乎有点奇怪。ScriptableObject实例将用作Unity项目中的资产文件。您使用了该属性了吗?通常,您会通过菜单手动创建资产,然后将其插入组件中。按照您的方式,它不会被写入磁盘,那么为什么要使用ScriptableObject而不仅仅是普通类呢?但是,在您的实际环境中,这一切可能都是有意义的,所以不要介意我是否错了。

要修复您的代码,您可以执行以下操作:

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();
    }
}
使用UnityEditor;
使用UnityEngine;
类组件:单行为
{
公共MyScriptable MyScriptable;
}
类MyScriptable:ScriptableObject
{
公共浮动myChildValue=0.1f;
}
[CustomEditor(typeof(SomeComponent))]
类SomeComponentEditor:Editor
{
公共覆盖无效OnInspectorGUI()
{
SomeComponent SomeComponent=目标为SomeComponent;
if(someComponent.myScriptable==null)
someComponent.myScriptable=CreateInstance();
SerializedProperty myScriptableProp=serializedObject.FindProperty(“myScriptable”);
EditorGUILayout.PropertyField(myScriptableProp);
SerializedObject子对象=新的SerializedObject(myScriptableProp.objectReferenceValue);
SerializedProperty myChildValueProp=child.FindProperty(“myChildValue”);
EditorGUILayout.PropertyField(myChildValueProp);
ApplyModifiedProperties();
}
}
要检查子对象,首先需要创建它的SerializedObject版本,然后可以像往常一样搜索它的属性

此外,派生自ScriptableObject的类不需要Serializable属性,只有序列化私有字段时才需要SerializeField属性;默认情况下,公共字段在Unity中序列化

在不知道代码的原始上下文的情况下,您的方法对我来说似乎有点奇怪。ScriptableObject实例将用作Unity项目中的资产文件。您使用了该属性了吗?通常,您会通过菜单手动创建资产,然后将其插入组件中。按照您的方式,它不会被写入磁盘,那么为什么要使用ScriptableObject而不仅仅是普通类呢?但也许这一切在你的实际情况下是有意义的,所以不管我是否错了