Can't create custom propertydrawer for ScriptableObject
I've been looking hard but can't find the answer to this, as everyone's default answer doesn't work.
"new SerializedObject(property.objectReferenceValue)" throws an exception every time because objectReferenceValue is always null. I can't seem to set objectReferenceValue to anything - I've even tried instantiating a scriptableobject in the editor code to try to set it, nothing sets it, it's always null.
My code is below, but HOW are you supposed to create a custom property drawer for a ScriptableObject with complex fields?
I'm using 2019.4.0f1. Details below.
I'm trying to get an ObjectField reference for a ScriptableObject which has a UnityEngine.Object property and a string property like so:
public class FuncTaskTarget : ScriptableObject
{
public MonoBehaviour Target;
public string MethodName;
}
Then the monobehaviour it sits on is like this:
public class BeatListener : MonoBehaviour
{
[SerializeField]
TimingType Timing;
[SerializeField]
FuncTaskTarget ListenerTask;
public int Order;
private void Reset()
{
ListenerTask = ListenerTask ?? ScriptableObject.CreateInstance<FuncTaskTarget>();
}
}
Then I have a custom property drawer
[CustomPropertyDrawer(typeof(FuncTaskTarget))]
public class FuncOfTask : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
property.serializedObject.Update();
EditorGUI.BeginProperty(position, label, property);
SerializedObject funcTaskObj = new SerializedObject(property.objectReferenceValue);
var targetProperty = funcTaskObj.FindProperty("Target");
EditorGUI.BeginChangeCheck();
EditorGUI.BeginChangeCheck();
UnityEngine.Object targetObject = EditorGUI.ObjectField(new Rect(position.x, position.y, position.width, 18), "Target", targetProperty.objectReferenceValue, typeof(MonoBehaviour), allowSceneObjects: true);
if (EditorGUI.EndChangeCheck())
{
targetProperty.objectReferenceValue = targetObject;
}
EditorGUI.EndProperty();
property.serializedObject.ApplyModifiedProperties();
}
}
Your answer
Follow this Question
Related Questions
ScriptableObject not Serializing? 0 Answers
EditorGUILayout.ObjectField on a ScriptableObject's inspector doesn't update properly 0 Answers
Hide properties by enums in array element entries. 0 Answers
ScriptableObjects inside another ScriptableObject not saving changes in Custom Editor Window 0 Answers