public override void OnInspectorGUI() { LimitRotation cp = (LimitRotation)target; EditorGUI.BeginChangeCheck(); EConUtil.DrawActiveLine(cp); EUtil.DrawSplitter(); EUtil.PushGUIEnable(cp.IsActiveConstraint); { //affect X/Y/Z m_foldoutLimit = EditorGUILayout.Foldout(m_foldoutLimit, "Limits"); if (m_foldoutLimit) { ELimitEuler eLimit = cp.LimitEuler; Vector3 limitMin = cp.LimitMin; Vector3 limitMax = cp.LimitMax; EConUtil.DrawEulerLimitField(ref eLimit, "X", ref limitMin, ref limitMax, ELimitEuler.X, -180f, 180f); EConUtil.DrawEulerLimitField(ref eLimit, "Y", ref limitMin, ref limitMax, ELimitEuler.Y, -180f, 180f); EConUtil.DrawEulerLimitField(ref eLimit, "Z", ref limitMin, ref limitMax, ELimitEuler.Z, -180f, 180f); cp.LimitEuler = eLimit; cp.LimitMin = limitMin; cp.LimitMax = limitMax; GUILayout.Space(5f); } //space mapping //m_foldoutSpace = EditorGUILayout.Foldout(m_foldoutSpace, "Space Mapping"); //if (m_foldoutSpace) //{ // // owner space // cp.OwnerSpace = (ESpace)EditorGUILayout.EnumPopup("Owner Space", cp.OwnerSpace); // GUILayout.Space(5f); //} //record modify //cp.ModifyInternalData = EditorGUILayout.Toggle(new GUIContent("Modify Internal Data", "This modification will modify the ConstraintStack's internal transform data"), cp.ModifyInternalData); // influence cp.Influence = EUtil.ProgressBar(cp.Influence, 0, 1f, "Influence: {0:F2}"); } EUtil.PopGUIEnable(); if (EditorGUI.EndChangeCheck()) { EditorUtility.SetDirty(cp); //so ConstraintStack.Update can be called in edit-mode } }
public static void DrawEulerLimitField( ref ELimitEuler eLimit, string label, ref Vector3 limitMin, ref Vector3 limitMax, ELimitEuler field, float minVal, float maxVal) { bool v = (eLimit & field) != 0; EditorGUILayout.BeginHorizontal(); { Rect rc = GUILayoutUtility.GetRect(16f, 18f); bool newV = EditorGUI.Toggle(rc, v); if (v != newV) { if (newV) { eLimit |= field; } else { eLimit &= (~field); } } EUtil.PushGUIEnable(newV); { float min = 0, max = 0; switch (field) { case ELimitEuler.X: min = limitMin.x; max = limitMax.x; break; case ELimitEuler.Y: min = limitMin.y; max = limitMax.y; break; case ELimitEuler.Z: min = limitMin.z; max = limitMax.z; break; } GUILayout.Label(label); GUILayout.Label("Min"); min = Mathf.Clamp(EditorGUILayout.FloatField(min), minVal, maxVal); max = Mathf.Max(max, min); GUILayout.Label(" => "); GUILayout.Label("Max"); max = Mathf.Clamp(EditorGUILayout.FloatField(max), minVal, maxVal); min = Mathf.Min(max, min); switch (field) { case ELimitEuler.X: limitMin.x = min; limitMax.x = max; break; case ELimitEuler.Y: limitMin.y = min; limitMax.y = max; break; case ELimitEuler.Z: limitMin.z = min; limitMax.z = max; break; } } EUtil.PopGUIEnable(); } EditorGUILayout.EndHorizontal(); }