390 lines
17 KiB
C#
390 lines
17 KiB
C#
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace Passer.Humanoid {
|
|
|
|
public static class HumanoidTarget_Editor {
|
|
public static Target Inspector(Target target, string name) {
|
|
if (target == null)
|
|
return target;
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
Transform defaultTargetTransform = null; // target.GetDefaultTarget(target.humanoid);
|
|
Transform targetTransform = target.transform ?? defaultTargetTransform;
|
|
targetTransform = (Transform)EditorGUILayout.ObjectField(name, targetTransform, typeof(Transform), true);
|
|
|
|
if (!Application.isPlaying) {
|
|
if (targetTransform == defaultTargetTransform && GUILayout.Button("Show", GUILayout.MaxWidth(60))) {
|
|
// Call static method CreateTarget on target
|
|
target = (HumanoidTarget)target.GetType().GetMethod("CreateTarget").Invoke(null, new object[] { target });
|
|
//} else if (targetTransform != target.transform) {
|
|
// target = (HumanoidTarget)target.GetType().GetMethod("SetTarget").Invoke(null, new object[] { target.humanoid, targetTransform });
|
|
}
|
|
}
|
|
EditorGUILayout.EndHorizontal();
|
|
return target;
|
|
}
|
|
|
|
public static HumanoidTarget Inspector(HumanoidTarget target, string name) {
|
|
if (target == null)
|
|
return target;
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
Transform defaultTargetTransform = target.GetDefaultTarget(target.humanoid);
|
|
Transform targetTransform = target.transform ?? defaultTargetTransform;
|
|
|
|
GUIContent text = new GUIContent(
|
|
name,
|
|
"The transform controlling the " + name
|
|
);
|
|
targetTransform = (Transform)EditorGUILayout.ObjectField(text, targetTransform, typeof(Transform), true);
|
|
|
|
if (!Application.isPlaying) {
|
|
if (targetTransform == defaultTargetTransform && GUILayout.Button("Show", GUILayout.MaxWidth(60))) {
|
|
// Call static method CreateTarget on target
|
|
target = (HumanoidTarget)target.GetType().GetMethod("CreateTarget").Invoke(null, new object[] { target });
|
|
} else if (targetTransform != target.transform) {
|
|
target = (HumanoidTarget)target.GetType().GetMethod("SetTarget").Invoke(null, new object[] { target.humanoid, targetTransform });
|
|
}
|
|
}
|
|
EditorGUILayout.EndHorizontal();
|
|
return target;
|
|
}
|
|
|
|
public static bool ControllerInspector(HumanoidSensor controller) {
|
|
EditorGUILayout.BeginHorizontal();
|
|
|
|
controller.enabled = EditorGUILayout.ToggleLeft(controller.name, controller.enabled, GUILayout.MinWidth(80));
|
|
if (controller.enabled && Application.isPlaying)
|
|
EditorGUILayout.EnumPopup(controller.status);
|
|
|
|
EditorGUILayout.EndHorizontal();
|
|
return controller.enabled;
|
|
}
|
|
|
|
public static bool ControllerInspector(HumanoidSensor controller, Target target) {
|
|
EditorGUILayout.BeginHorizontal();
|
|
EditorGUI.BeginChangeCheck();
|
|
GUIContent text = new GUIContent(
|
|
controller.name,
|
|
"Activate " + controller.name + " support for this humanoid"
|
|
);
|
|
|
|
bool enabled = EditorGUILayout.ToggleLeft(text, controller.enabled, GUILayout.MinWidth(80));
|
|
if (EditorGUI.EndChangeCheck()) {
|
|
Undo.RecordObject(target, enabled ? "Enabled " : "Disabled " + controller.name);
|
|
controller.enabled = enabled;
|
|
}
|
|
if (Application.isPlaying && enabled)
|
|
EditorGUILayout.EnumPopup(controller.status);
|
|
|
|
EditorGUILayout.EndHorizontal();
|
|
return enabled;
|
|
}
|
|
|
|
|
|
|
|
public static void BoneAngleInspector(SerializedProperty minProperty, SerializedProperty maxProperty, float defaultMin, float defaultMax, string boneAxisName, string label) {
|
|
float min = minProperty.floatValue;
|
|
float max = maxProperty.floatValue;
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
|
|
EditorGUILayout.LabelField(label, GUILayout.MinWidth(70));
|
|
|
|
min = EditorGUILayout.FloatField(min, GUILayout.Width(65));
|
|
GUI.SetNextControlName(boneAxisName + "1");
|
|
EditorGUILayout.MinMaxSlider(ref min, ref max, -180, 180);
|
|
GUI.SetNextControlName(boneAxisName + "2");
|
|
max = EditorGUILayout.FloatField(max, GUILayout.Width(65));
|
|
|
|
if (GUILayout.Button("R")) {
|
|
min = defaultMin;
|
|
max = defaultMax;
|
|
GUI.FocusControl(boneAxisName + "1");
|
|
}
|
|
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
if (EditorGUI.EndChangeCheck()) {
|
|
minProperty.floatValue = min;
|
|
maxProperty.floatValue = max;
|
|
}
|
|
|
|
SceneView.RepaintAll();
|
|
}
|
|
|
|
public static void BoneXAngleInspector(HumanoidTarget.TargetedBone bone, float defaultMin, float defaultMax) {
|
|
float oldMin = bone.bone.minAngles.x;
|
|
float oldMax = bone.bone.maxAngles.x;
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
|
|
EditorGUILayout.LabelField("X Limits", GUILayout.MinWidth(70));
|
|
|
|
GUI.SetNextControlName(bone.bone.transform.name + "X1");
|
|
bone.bone.minAngles.x = EditorGUILayout.FloatField(bone.bone.minAngles.x, GUILayout.Width(65));
|
|
|
|
EditorGUILayout.MinMaxSlider(ref bone.bone.minAngles.x, ref bone.bone.maxAngles.x, -180, 180);
|
|
|
|
GUI.SetNextControlName(bone.bone.transform.name + "X2");
|
|
bone.bone.maxAngles.x = EditorGUILayout.FloatField(bone.bone.maxAngles.x, GUILayout.Width(65));
|
|
|
|
if (GUILayout.Button("R")) {
|
|
bone.bone.minAngles.x = defaultMin;
|
|
bone.bone.maxAngles.x = defaultMax;
|
|
GUI.FocusControl(bone.bone.transform.name + "X1");
|
|
}
|
|
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
if (bone.bone.maxAngles.x != oldMax || bone.bone.minAngles.x != oldMin)
|
|
SceneView.RepaintAll();
|
|
}
|
|
|
|
public static void BoneYAngleInspector(HumanoidTarget.TargetedBone bone, float defaultMin, float defaultMax) {
|
|
float oldMin = bone.bone.minAngles.y;
|
|
float oldMax = bone.bone.maxAngles.y;
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
|
|
EditorGUILayout.LabelField("Y Limits", GUILayout.MinWidth(70));
|
|
|
|
GUI.SetNextControlName(bone.bone.transform.name + "Y1");
|
|
bone.bone.minAngles.y = EditorGUILayout.FloatField(bone.bone.minAngles.y, GUILayout.Width(65));
|
|
|
|
EditorGUILayout.MinMaxSlider(ref bone.bone.minAngles.y, ref bone.bone.maxAngles.y, -180, 180);
|
|
|
|
GUI.SetNextControlName(bone.bone.transform.name + "Y2");
|
|
bone.bone.maxAngles.y = EditorGUILayout.FloatField(bone.bone.maxAngles.y, GUILayout.Width(65));
|
|
|
|
if (GUILayout.Button("R")) {
|
|
bone.bone.minAngles.y = defaultMin;
|
|
bone.bone.maxAngles.y = defaultMax;
|
|
GUI.FocusControl(bone.bone.transform.name + "Y1");
|
|
|
|
}
|
|
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
if (bone.bone.maxAngles.y != oldMax || bone.bone.minAngles.y != oldMin)
|
|
SceneView.RepaintAll();
|
|
}
|
|
|
|
public static void BoneYAngleInspector(HumanoidTarget.TargetedBone bone, SerializedProperty minProperty, SerializedProperty maxProperty, float defaultMin, float defaultMax) {
|
|
float min = minProperty.floatValue;
|
|
float max = maxProperty.floatValue;
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
|
|
EditorGUILayout.LabelField("Limits Y", GUILayout.MinWidth(70));
|
|
|
|
min = EditorGUILayout.FloatField(min, GUILayout.Width(65));
|
|
GUI.SetNextControlName(bone.bone.transform.name + "Y1");
|
|
EditorGUILayout.MinMaxSlider(ref min, ref max, -180, 180);
|
|
GUI.SetNextControlName(bone.bone.transform.name + "Y2");
|
|
max = EditorGUILayout.FloatField(max, GUILayout.Width(65));
|
|
|
|
if (GUILayout.Button("R")) {
|
|
min = defaultMin;
|
|
max = defaultMax;
|
|
GUI.FocusControl(bone.bone.transform.name + "Y1");
|
|
}
|
|
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
if (EditorGUI.EndChangeCheck()) {
|
|
minProperty.floatValue = min;
|
|
maxProperty.floatValue = max;
|
|
SceneView.RepaintAll();
|
|
}
|
|
}
|
|
|
|
public static void BoneZAngleInspector(HumanoidTarget.TargetedBone bone, float defaultMin, float defaultMax) {
|
|
float oldMin = bone.bone.minAngles.z;
|
|
float oldMax = bone.bone.maxAngles.z;
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
|
|
EditorGUILayout.LabelField("Z Limits", GUILayout.MinWidth(70));
|
|
|
|
GUI.SetNextControlName(bone.bone.transform.name + "Z1");
|
|
bone.bone.minAngles.z = EditorGUILayout.FloatField(bone.bone.minAngles.z, GUILayout.Width(65));
|
|
|
|
EditorGUILayout.MinMaxSlider(ref bone.bone.minAngles.z, ref bone.bone.maxAngles.z, -180, 180);
|
|
|
|
GUI.SetNextControlName(bone.bone.transform.name + "Z2");
|
|
bone.bone.maxAngles.z = EditorGUILayout.FloatField(bone.bone.maxAngles.z, GUILayout.Width(65));
|
|
|
|
if (GUILayout.Button("R")) {
|
|
bone.bone.minAngles.z = defaultMin;
|
|
bone.bone.maxAngles.z = defaultMax;
|
|
GUI.FocusControl(bone.bone.transform.name + "Z1");
|
|
|
|
}
|
|
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
if (bone.bone.maxAngles.y != oldMax || bone.bone.minAngles.y != oldMin)
|
|
SceneView.RepaintAll();
|
|
}
|
|
|
|
public static void BoneZAngleInspector(HumanoidTarget.TargetedBone bone, SerializedProperty minProperty, SerializedProperty maxProperty, float defaultMin, float defaultMax) {
|
|
float min = minProperty.floatValue;
|
|
float max = maxProperty.floatValue;
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
|
|
EditorGUILayout.LabelField("Limits Z", GUILayout.MinWidth(70));
|
|
|
|
min = EditorGUILayout.FloatField(min, GUILayout.Width(65));
|
|
GUI.SetNextControlName(bone.bone.transform.name + "Z1");
|
|
EditorGUILayout.MinMaxSlider(ref min, ref max, -180, 180);
|
|
GUI.SetNextControlName(bone.bone.transform.name + "Z2");
|
|
max = EditorGUILayout.FloatField(max, GUILayout.Width(65));
|
|
|
|
if (GUILayout.Button("R")) {
|
|
min = defaultMin;
|
|
max = defaultMax;
|
|
GUI.FocusControl(bone.bone.transform.name + "Z1");
|
|
}
|
|
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
if (EditorGUI.EndChangeCheck()) {
|
|
minProperty.floatValue = min;
|
|
maxProperty.floatValue = max;
|
|
SceneView.RepaintAll();
|
|
}
|
|
}
|
|
|
|
//public static void DrawTargetBone(HumanoidTarget.TargetedBone bone) {
|
|
// if (bone.target.transform != null) {
|
|
// Handles.color = Color.white;
|
|
// Handles.DrawLine(bone.target.transform.position, bone.target.transform.position + bone.target.transform.rotation * bone.target.normalDirection * bone.bone.length);
|
|
// }
|
|
//}
|
|
|
|
#region xArcs
|
|
public static void DrawXArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle) {
|
|
DrawXArcs(position, rotation, minAngle, maxAngle, rotation * Vector3.down);
|
|
}
|
|
public static void DrawXArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle, Vector3 zeroDirection) {
|
|
Vector3 planeNormal = rotation * Vector3.right;
|
|
DrawXArcs(position, rotation, minAngle, maxAngle, planeNormal, zeroDirection);
|
|
}
|
|
public static void DrawXArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle, Vector3 planeNormal, Vector3 zeroDirection) {
|
|
DrawArcs(position, rotation, minAngle, maxAngle, planeNormal, zeroDirection, Color.red);
|
|
}
|
|
#endregion
|
|
#region yArcs
|
|
public static void DrawYArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle) {
|
|
DrawYArcs(position, rotation, minAngle, maxAngle, rotation * Vector3.forward);
|
|
}
|
|
|
|
public static void DrawYArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle, Vector3 zeroDirection) {
|
|
Vector3 planeNormal = rotation * Vector3.up;
|
|
DrawYArcs(position, rotation, minAngle, maxAngle, planeNormal, zeroDirection);
|
|
}
|
|
|
|
public static void DrawYArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle, Vector3 planeNormal, Vector3 zeroDirection) {
|
|
DrawArcs(position, rotation, minAngle, maxAngle, planeNormal, zeroDirection, Color.green);
|
|
}
|
|
#endregion
|
|
#region zArcs
|
|
public static void DrawZArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle) {
|
|
DrawZArcs(position, rotation, minAngle, maxAngle, rotation * Vector3.down);
|
|
}
|
|
|
|
public static void DrawZArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle, Vector3 zeroDirection) {
|
|
Vector3 planeNormal = rotation * Vector3.forward;
|
|
DrawZArcs(position, rotation, minAngle, maxAngle, planeNormal, zeroDirection);
|
|
}
|
|
|
|
public static void DrawZArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle, Vector3 planeNormal, Vector3 zeroDirection) {
|
|
DrawArcs(position, rotation, minAngle, maxAngle, planeNormal, zeroDirection, Color.blue);
|
|
}
|
|
#endregion
|
|
|
|
public static void DrawArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle, Vector3 planeNormal, Vector3 zeroDirection, Color color) {
|
|
color.a = 0.1F;
|
|
Handles.color = color;
|
|
Handles.DrawSolidArc(position, planeNormal, zeroDirection, minAngle, HandleUtility.GetHandleSize(position));
|
|
Handles.DrawSolidArc(position, planeNormal, zeroDirection, maxAngle, HandleUtility.GetHandleSize(position));
|
|
|
|
color.a = 1;
|
|
Handles.color = color;
|
|
Handles.DrawWireArc(position, planeNormal, zeroDirection, minAngle, HandleUtility.GetHandleSize(position));
|
|
Handles.DrawWireArc(position, planeNormal, zeroDirection, maxAngle, HandleUtility.GetHandleSize(position));
|
|
|
|
Handles.DrawLine(position, position + zeroDirection * HandleUtility.GetHandleSize(position));
|
|
}
|
|
|
|
#region MinMaxSlider
|
|
|
|
}
|
|
|
|
public class MinMaxSliderAttribute : PropertyAttribute {
|
|
public readonly string name;
|
|
public readonly float defaultMin;
|
|
public readonly float defaultMax;
|
|
public readonly float minLimit;
|
|
public readonly float maxLimit;
|
|
|
|
public MinMaxSliderAttribute(string _name, float _defaultMin, float _defaultMax, float _minLimit, float _maxLimit) {
|
|
name = _name;
|
|
defaultMin = _defaultMin;
|
|
defaultMax = _defaultMax;
|
|
minLimit = _minLimit;
|
|
maxLimit = _maxLimit;
|
|
}
|
|
}
|
|
|
|
[CustomPropertyDrawer(typeof(MinMaxSliderAttribute))]
|
|
class MinMaxSliderDrawer : PropertyDrawer {
|
|
|
|
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) {
|
|
if (property.propertyType == SerializedPropertyType.Vector2) {
|
|
Vector2 range = property.vector2Value;
|
|
float min = range.x;
|
|
float max = range.y;
|
|
MinMaxSliderAttribute attr = attribute as MinMaxSliderAttribute;
|
|
EditorGUI.BeginChangeCheck();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
|
|
EditorGUILayout.LabelField(label, GUILayout.MinWidth(70));
|
|
|
|
min = EditorGUILayout.FloatField(min, GUILayout.Width(65));
|
|
GUI.SetNextControlName(attr.name + "1");
|
|
EditorGUI.MinMaxSlider(position, label, ref min, ref max, attr.minLimit, attr.maxLimit);
|
|
GUI.SetNextControlName(attr.name + "2");
|
|
max = EditorGUILayout.FloatField(max, GUILayout.Width(65));
|
|
|
|
if (GUILayout.Button("R")) {
|
|
min = attr.defaultMin;
|
|
max = attr.defaultMax;
|
|
GUI.FocusControl(attr.name + "Y1");
|
|
}
|
|
|
|
if (EditorGUI.EndChangeCheck()) {
|
|
range.x = min;
|
|
range.y = max;
|
|
property.vector2Value = range;
|
|
}
|
|
|
|
EditorGUILayout.EndHorizontal();
|
|
} else {
|
|
EditorGUI.LabelField(position, label, "Use only with Vector2");
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
}
|