我正在尝试为简单的Aspect创建一个自定义抽屉:ScriptableObject。只要它是一个泛型类,我就可以为Aspect类提供一切工作,但只要它是一个ScriptableObject,一切都会中断。具体做法是:
EditorGUI.PropertyField(position, property.FindPropertyRelative("AspectName"),
new GUIContent("Aspect:"));
但findPropRel为null。 using property.serializedObject返回Aspect所在的父对象,而不是Aspect。我甚至不能破解使用它的解决方案,因为我不知道它是哪个方面。
是否无法为scriptableObjects或Monobehaviours创建customDrawer?我无法想象Unity会使CustomDrawers甚至无法与最常见的Unity类一起使用。
不,在这种情况下,customEditor确实不起作用。我必须为完全不相关的课程制作几十个才能画出这个方面。
答案 0 :(得分:3)
我也有同样的问题。我已经达成了一种从 ScriptableObject 获取属性的技巧,但没有使用 FindPropertyRelative ,这对 ScriptableObject 不起作用,但效果很好对于普通物体。
如果您计划在另一个 MonoBehavior 类中实例化该类,那么使用MonoBehaviour将无效,因为 MonoBehavior 类只能作为 GameObject <的组件添加/强>(S)。您无法使用 new 创建它,或者Unity会抱怨。
我必须告诉你,但我不认为我的解决方案真的有效,因为我不确定它是否适用于预制件,但这可能是因为我试图在预制件上保存一些场景参考而这似乎无法在Unity中完成。
好。停止发言。这就是我所做的:
假设您要访问的 ScriptabeObject 属于MySOClass类。
public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label) {
// Make a new serialized object for your property that is a class that inherits
// from ScriptableObject
SerializedObject serializedObject = new SerializedObject(prop.objectReferenceValue as MySOClass);
SerializedProperty propSP = serializedObject.FindProperty("prop");
if (propSP != null) {
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(propSP , true);
if (EditorGUI.EndChangeCheck()) {
serializedObject.ApplyModifiedProperties();
}
}
}
我测试propSP的无效性是因为如果prop的实际值为null,则返回的Serialized属性也将为null。