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.

59 lines
2.8 KiB
C#

using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System;
namespace RootMotion.Dynamics {
#if UNITY_2018 || UNITY_2019 || UNITY_2020 || UNITY_2021
[CustomEditor(typeof(ConfigurableJoint))]
#endif
public class ConfigurableJointInspector : JointInspector {
private static Color
highAngularXColor = new Color(1, 0.75f, 0, 0.3f),
lowAngularXColor = new Color(0.8f, 0.65f, 0, 0.3f),
angularYColor = new Color(0, 1, 0, 0.3f),
angularZColor = new Color(0, 0, 1, 0.3f);
private const string lowX = "Low X", highX = "High X", y = "Y", z = "Z";
public static void DrawJoint(ConfigurableJoint joint, bool modifiable = true, float alphaMlp = 1f) {
if (joint == null) return;
Vector3 axis = Vector3.zero;
if (joint.axis != Vector3.zero) axis = joint.axis.normalized;
Vector3 secondaryAxis = Vector3.zero;
if (joint.secondaryAxis != Vector3.zero) secondaryAxis = joint.secondaryAxis.normalized;
Vector3 crossAxis = secondaryAxis;
if (secondaryAxis != axis) crossAxis = Vector3.Cross(secondaryAxis, axis);
if (joint.angularXMotion == ConfigurableJointMotion.Limited) {
float newLowAngularXLimit = DrawJointLimit(joint as Joint, lowX, axis, joint.lowAngularXLimit.limit, MlpAlpha(lowAngularXColor, alphaMlp), -25, modifiable);
joint.lowAngularXLimit = NewJointLimit(newLowAngularXLimit, joint.lowAngularXLimit, -180, 180);
float newHighAngularXLimit = joint.highAngularXLimit.limit;
if (newLowAngularXLimit != 0 || (newLowAngularXLimit == 0 && newHighAngularXLimit != 0)) newHighAngularXLimit = DrawJointLimit(joint as Joint, highX, axis, joint.highAngularXLimit.limit, MlpAlpha(highAngularXColor, alphaMlp), 25, modifiable);
joint.highAngularXLimit = NewJointLimit(newHighAngularXLimit, joint.highAngularXLimit, -180, 180);
}
if (joint.angularYMotion == ConfigurableJointMotion.Limited) {
float newAngularYLimit = DrawJointLimit(joint as Joint, y, secondaryAxis, -joint.angularYLimit.limit, MlpAlpha(angularYColor, alphaMlp), 25, false);
newAngularYLimit = DrawJointLimit(joint as Joint, y, secondaryAxis, -newAngularYLimit, MlpAlpha(angularYColor, alphaMlp), 25, modifiable);
joint.angularYLimit = NewJointLimit(newAngularYLimit, joint.angularYLimit, 0, 180);
}
if (joint.angularZMotion == ConfigurableJointMotion.Limited) {
float newAngularZLimit = DrawJointLimit(joint as Joint, z, crossAxis, -joint.angularZLimit.limit, MlpAlpha(angularZColor, alphaMlp), 25, false);
newAngularZLimit = DrawJointLimit(joint as Joint, z, crossAxis, -newAngularZLimit, MlpAlpha(angularZColor, alphaMlp), 25, modifiable);
joint.angularZLimit = NewJointLimit(newAngularZLimit, joint.angularZLimit, 0, 180);
}
}
public void OnSceneGUI() {
DrawJoint(target as ConfigurableJoint);
}
}
}