You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
4.8 KiB
C#
113 lines
4.8 KiB
C#
3 months ago
|
// Animancer // Copyright 2020 Kybernetik //
|
||
|
|
||
|
#if UNITY_EDITOR
|
||
|
|
||
|
using System;
|
||
|
using UnityEditor;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace Animancer.Editor
|
||
|
{
|
||
|
/// <summary>[Editor-Only] Draws the Inspector GUI for an <see cref="AnimancerState"/>.</summary>
|
||
|
public abstract class ParametizedAnimancerStateDrawer<T> : AnimancerStateDrawer<T> where T : AnimancerState
|
||
|
{
|
||
|
/************************************************************************************************************************/
|
||
|
|
||
|
/// <summary>The number of parameters being managed by the target state.</summary>
|
||
|
public virtual int ParameterCount { get { return 0; } }
|
||
|
|
||
|
/// <summary>Returns the name of a parameter being managed by the target state.</summary>
|
||
|
/// <exception cref="NotSupportedException">Thrown if the target state doesn't manage any parameters.</exception>
|
||
|
public virtual string GetParameterName(int index) { throw new NotSupportedException(); }
|
||
|
|
||
|
/// <summary>Returns the type of a parameter being managed by the target state.</summary>
|
||
|
/// <exception cref="NotSupportedException">Thrown if the target state doesn't manage any parameters.</exception>
|
||
|
public virtual AnimatorControllerParameterType GetParameterType(int index) { throw new NotSupportedException(); }
|
||
|
|
||
|
/// <summary>Returns the value of a parameter being managed by the target state.</summary>
|
||
|
/// <exception cref="NotSupportedException">Thrown if the target state doesn't manage any parameters.</exception>
|
||
|
public virtual object GetParameterValue(int index) { throw new NotSupportedException(); }
|
||
|
|
||
|
/// <summary>Sets the value of a parameter being managed by the target state.</summary>
|
||
|
/// <exception cref="NotSupportedException">Thrown if the target state doesn't manage any parameters.</exception>
|
||
|
public virtual void SetParameterValue(int index, object value) { throw new NotSupportedException(); }
|
||
|
|
||
|
/************************************************************************************************************************/
|
||
|
|
||
|
/// <summary>
|
||
|
/// Constructs a new <see cref="ParametizedAnimancerStateDrawer{T}"/> to manage the Inspector GUI for the `state`.
|
||
|
/// </summary>
|
||
|
protected ParametizedAnimancerStateDrawer(T state) : base(state) { }
|
||
|
|
||
|
/************************************************************************************************************************/
|
||
|
|
||
|
/// <summary> Draws the details of the target state in the GUI.</summary>
|
||
|
protected override void DoDetailsGUI(IAnimancerComponent owner)
|
||
|
{
|
||
|
base.DoDetailsGUI(owner);
|
||
|
|
||
|
if (!IsExpanded)
|
||
|
return;
|
||
|
|
||
|
var count = ParameterCount;
|
||
|
if (count <= 0)
|
||
|
return;
|
||
|
|
||
|
var labelWidth = EditorGUIUtility.labelWidth;
|
||
|
EditorGUIUtility.labelWidth -= AnimancerGUI.IndentSize;
|
||
|
|
||
|
var area = AnimancerGUI.LayoutSingleLineRect(AnimancerGUI.SpacingMode.Before);
|
||
|
area = EditorGUI.IndentedRect(area);
|
||
|
EditorGUI.LabelField(area, "Parameters", count.ToString());
|
||
|
|
||
|
for (int i = 0; i < count; i++)
|
||
|
{
|
||
|
var type = GetParameterType(i);
|
||
|
if (type == 0)
|
||
|
continue;
|
||
|
|
||
|
var name = GetParameterName(i);
|
||
|
var value = GetParameterValue(i);
|
||
|
|
||
|
EditorGUI.BeginChangeCheck();
|
||
|
|
||
|
area = AnimancerGUI.LayoutSingleLineRect(AnimancerGUI.SpacingMode.Before);
|
||
|
area = EditorGUI.IndentedRect(area);
|
||
|
|
||
|
switch (type)
|
||
|
{
|
||
|
case AnimatorControllerParameterType.Float:
|
||
|
value = EditorGUI.FloatField(area, name, (float)value);
|
||
|
break;
|
||
|
|
||
|
case AnimatorControllerParameterType.Int:
|
||
|
value = EditorGUI.IntField(area, name, (int)value);
|
||
|
break;
|
||
|
|
||
|
case AnimatorControllerParameterType.Bool:
|
||
|
value = EditorGUI.Toggle(area, name, (bool)value);
|
||
|
break;
|
||
|
|
||
|
case AnimatorControllerParameterType.Trigger:
|
||
|
value = EditorGUI.Toggle(area, name, (bool)value, EditorStyles.radioButton);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
EditorGUI.LabelField(area, name, "Unhandled Type: " + type);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (EditorGUI.EndChangeCheck())
|
||
|
SetParameterValue(i, value);
|
||
|
}
|
||
|
|
||
|
EditorGUIUtility.labelWidth = labelWidth;
|
||
|
}
|
||
|
|
||
|
/************************************************************************************************************************/
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|