98 lines
3.2 KiB
C#
98 lines
3.2 KiB
C#
namespace Fusion.Addons.KCC.Editor
|
|
{
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
|
|
[CustomPropertyDrawer(typeof(KCCProcessorReferenceAttribute))]
|
|
public sealed class KCCProcessorReferenceDrawer : PropertyDrawer
|
|
{
|
|
// PropertyDrawer INTERFACE
|
|
|
|
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
|
{
|
|
Object currentObject = ResolveCurrentObject(property);
|
|
Object selectedObject = EditorGUI.ObjectField(position, label, currentObject, typeof(UnityEngine.Object), true);
|
|
|
|
if (ReferenceEquals(selectedObject, currentObject) == true)
|
|
return;
|
|
|
|
if (selectedObject == null)
|
|
{
|
|
property.objectReferenceValue = selectedObject;
|
|
EditorUtility.SetDirty(property.serializedObject.targetObject);
|
|
return;
|
|
}
|
|
|
|
bool isResolved = KCCUtility.ResolveProcessor(selectedObject, out IKCCProcessor processor, out GameObject gameObject, out Component component, out ScriptableObject scriptableObject);
|
|
if (isResolved == false)
|
|
{
|
|
Debug.LogError($"Failed to resolve {nameof(IKCCProcessor)} in {selectedObject.name} ({selectedObject.GetType().FullName})", selectedObject);
|
|
return;
|
|
}
|
|
|
|
if (ReferenceEquals(component, null) == false)
|
|
{
|
|
if (ReferenceEquals(component, currentObject) == false)
|
|
{
|
|
property.objectReferenceValue = component;
|
|
EditorUtility.SetDirty(property.serializedObject.targetObject);
|
|
}
|
|
}
|
|
else if (ReferenceEquals(scriptableObject, null) == false)
|
|
{
|
|
if (ReferenceEquals(scriptableObject, currentObject) == false)
|
|
{
|
|
property.objectReferenceValue = scriptableObject;
|
|
EditorUtility.SetDirty(property.serializedObject.targetObject);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError($"Failed to resolve serializable Unity object in {selectedObject.name} ({selectedObject.GetType().FullName})", selectedObject);
|
|
}
|
|
}
|
|
|
|
// PRIVATE METHODS
|
|
|
|
private Object ResolveCurrentObject(SerializedProperty property)
|
|
{
|
|
Object currentObject = property.objectReferenceValue;
|
|
if (ReferenceEquals(currentObject, null) == true)
|
|
return null;
|
|
|
|
IKCCProcessor currentProcessor = currentObject as IKCCProcessor;
|
|
if (ReferenceEquals(currentProcessor, null) == false)
|
|
{
|
|
Component currentComponent = currentObject as Component;
|
|
if (ReferenceEquals(currentComponent, null) == false)
|
|
return currentObject;
|
|
|
|
ScriptableObject currentScriptableObject = currentObject as ScriptableObject;
|
|
if (ReferenceEquals(currentScriptableObject, null) == false)
|
|
return currentObject;
|
|
}
|
|
|
|
bool isResolved = KCCUtility.ResolveProcessor(currentObject, out IKCCProcessor processor, out GameObject gameObject, out Component component, out ScriptableObject scriptableObject);
|
|
if (isResolved == true)
|
|
{
|
|
if (ReferenceEquals(component, null) == false)
|
|
{
|
|
property.objectReferenceValue = component;
|
|
EditorUtility.SetDirty(property.serializedObject.targetObject);
|
|
return component;
|
|
}
|
|
else if (ReferenceEquals(scriptableObject, null) == false)
|
|
{
|
|
property.objectReferenceValue = scriptableObject;
|
|
EditorUtility.SetDirty(property.serializedObject.targetObject);
|
|
return scriptableObject;
|
|
}
|
|
}
|
|
|
|
property.objectReferenceValue = null;
|
|
EditorUtility.SetDirty(property.serializedObject.targetObject);
|
|
return null;
|
|
}
|
|
}
|
|
}
|