- Home /
Question by
JeffBert · Mar 12, 2021 at 07:17 PM ·
custom editorgenerics
Custom editor: Drawing generic properties
I want to display a generic property in the editor, but I can't figure out how to do this without implementing a bunch of concrete classes for each of my generic implementations.
public abstract class ComponentModel<T> : ScriptableObject
where T : Component
{
public T Data { get; set; }
}
I'm trying to draw the Data
field in the inspector. My attempt:
[CustomEditor(typeof(ComponentModel<>), true)]
public class ComponentModelEditor : UnityEditor.Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
var component = (ComponentModel<Component>)target;
EditorGUILayout.ObjectField(component.Data, typeof(Component), false);
}
}
Isn't working. I don't really know where to start looking to fix this.
Comment
Answer by JeffBert · Mar 17, 2021 at 12:07 AM
Fixed this by having my generic class derive from a base class that contains the component. Interface would work too.
// Base
public abstract class ComponentModel : ScriptableObject
{
public abstract Component Component { get; }
}
// Generic component
public class ComponentModel<T> : ComponentModel
[...]
// Editor
[CustomEditor(typeof(ComponentModel), true)]
public class ComponentModelEditor : UnityEditor.Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
GUI.enabled = false;
Component component = ((ComponentModel)target).Component;
EditorGUILayout.ObjectField(component , typeof(Component), false);
GUI.enabled = true;
}
}