首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unity:检查器找不到ScriptableObject的字段

Unity:检查器找不到ScriptableObject的字段
EN

Stack Overflow用户
提问于 2016-05-17 21:49:33
回答 2查看 1.9K关注 0票数 0

我在显示ScriptableObject的公共字段时遇到问题,该字段是我正在检查的组件的子级。虽然我可以用另一种方法很容易地做到这一点,但我需要这种方法来处理其他变量。(ReorderableLists)

我简化了问题,也许我只是做了一些明显的错误,但我看不出我做错了什么。

代码+错误:http://answers.unity3d.com/storage/temp/70243-error.png

代码语言:javascript
复制
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
    }
}
EN

回答 2

Stack Overflow用户

发布于 2016-05-18 06:00:05

要修复您的代码,您可以这样做:

代码语言:javascript
复制
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派生的类不需要Serializable属性,只有在序列化私有字段时才需要SerializeField属性;在Unity中,公共字段默认是序列化的。

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

票数 3
EN

Stack Overflow用户

发布于 2016-05-17 22:07:03

发现黑客解决方案:

代码语言:javascript
复制
    SerializedObject newserobj = new SerializedObject(serializedObject.FindProperty("scriptable").objectReferenceValue );
    EditorGUILayout.PropertyField(newserobj.FindProperty("value"));   
    newserobj.ApplyModifiedProperties();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37278087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档