public void OnSceneGUI() { MovementController mc = (MovementController)target; //serializedObject.Update(); if (mc.animatePosition && (mc.positionAnimIndex == 0 || mc.positionAnimIndex == 1)) { Vector3 offset = Vector3.zero; if (mc.positionAsOffset) { offset += mc.defaultPosition; } if (mc.transform.parent != null) { EditorGUI.BeginChangeCheck(); Vector3 pos1 = Vector3.zero; if (Tools.current != Tool.Rotate) { pos1 = Handles.PositionHandle(mc.transform.parent.TransformPoint(mc.posA), Quaternion.identity); } if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(mc, "Move Handle A"); mc.posA = mc.transform.parent.InverseTransformPoint(pos1); } EditorGUI.BeginChangeCheck(); Vector3 pos2 = Vector3.zero; if (Tools.current != Tool.Rotate) { pos2 = Handles.PositionHandle(mc.transform.parent.TransformPoint(mc.posB), Quaternion.identity); } if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(mc, "Move Handle B"); mc.posB = mc.transform.parent.InverseTransformPoint(pos2); } } else { EditorGUI.BeginChangeCheck(); Vector3 pos1 = Vector3.zero; if (Tools.current != Tool.Rotate) { pos1 = Handles.PositionHandle(mc.posA + offset, Quaternion.identity); } if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(mc, "Move Handle A"); mc.posA = pos1 - offset; } EditorGUI.BeginChangeCheck(); Vector3 pos2 = Vector3.zero; if (Tools.current != Tool.Rotate) { pos2 = Handles.PositionHandle(mc.posB + offset, Quaternion.identity); } if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(mc, "Move Handle B"); mc.posB = pos2 - offset; } } } }
public override void OnInspectorGUI() { //DrawDefaultInspector(); EditorGUI.BeginChangeCheck(); MovementController mc = (MovementController)target; serializedObject.Update(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.BeginVertical(); EditorGUILayout.PrefixLabel("General Parameters:"); EditorGUILayout.PropertyField(gizmoPositionColorProp, new GUIContent("Gizmo Color")); EditorGUILayout.PropertyField(positionAsOffsetProp, new GUIContent("Use position as offset")); EditorGUILayout.EndVertical(); GUILayout.Label(logo, GUILayout.MaxWidth(64), GUILayout.MaxHeight(64)); EditorGUILayout.EndHorizontal(); EditorGUILayout.PropertyField(timeScaleProp, new GUIContent("Time Scale")); if (mc.simulate) { if (GUILayout.Button("Stop Simulation")) { mc.simulate = false; mc.time = 0f; mc.transform.position = mc.defaultPosition; mc.transform.rotation = mc.defaultRotation; } } else { if (GUILayout.Button("Start Simulation")) { mc.simulate = true; mc.time = 0f; mc.defaultPosition = mc.transform.position; mc.defaultRotation = mc.transform.rotation; } } EditorGUILayout.Space(); //->POSITION animatePositionProp.boolValue = EditorGUILayout.ToggleLeft("Animate Position:", animatePositionProp.boolValue); showPositionFields.target = animatePositionProp.boolValue; if (EditorGUILayout.BeginFadeGroup(showPositionFields.faded)) { EditorGUI.indentLevel++; if (!positionAnimIndexProp.hasMultipleDifferentValues) { positionAnimIndexProp.intValue = EditorGUILayout.Popup("Animation Type", positionAnimIndexProp.intValue, positionAnimOptions); switch (positionAnimIndexProp.intValue) { case 0: //Linear EditorGUILayout.PropertyField(posAProp, new GUIContent("Position A")); EditorGUILayout.PropertyField(posBProp, new GUIContent("Position B")); if (posFrequencyProp.hasMultipleDifferentValues) { EditorGUILayout.PropertyField(posFrequencyProp, new GUIContent("% of Path")); } else { posFrequencyProp.floatValue = EditorGUILayout.Slider("% of Path", posFrequencyProp.floatValue, 0, 1); } if (!loopIndexProp.hasMultipleDifferentValues) { loopIndexProp.intValue = EditorGUILayout.Popup("Loop Type", loopIndexProp.intValue, loopOptions); } else { EditorGUILayout.LabelField("Selection contains different Loop Types!"); } break; case 1: //Sine EditorGUILayout.PropertyField(posAProp, new GUIContent("Position A")); EditorGUILayout.PropertyField(posBProp, new GUIContent("Position B")); if (posPhaseShiftProp.hasMultipleDifferentValues) { EditorGUILayout.PropertyField(posPhaseShiftProp, new GUIContent("Phase Shift")); } else { posPhaseShiftProp.floatValue = EditorGUILayout.Slider("Phase Shift", posPhaseShiftProp.floatValue, 0, 1); } break; case 2: //Circle EditorGUILayout.PropertyField(positionCircleCenterProp, new GUIContent("Center")); EditorGUILayout.PropertyField(positionCircleRadiusProp, new GUIContent("Radius")); if (positionCircleZenithProp.hasMultipleDifferentValues) { EditorGUILayout.PropertyField(positionCircleZenithProp, new GUIContent("Zenith Angle")); } else { positionCircleZenithProp.floatValue = EditorGUILayout.Slider("Zenith Angle", positionCircleZenithProp.floatValue, 0, 180f); } if (positionCircleAzimuthProp.hasMultipleDifferentValues) { EditorGUILayout.PropertyField(positionCircleAzimuthProp, new GUIContent("Azimuth Angle")); } else { positionCircleAzimuthProp.floatValue = EditorGUILayout.Slider("Azimuth Angle", positionCircleAzimuthProp.floatValue, 0, 180f); } if (posFrequencyProp.hasMultipleDifferentValues) { EditorGUILayout.PropertyField(posFrequencyProp, new GUIContent("% of Path")); } else { posFrequencyProp.floatValue = EditorGUILayout.Slider("% of Path", posFrequencyProp.floatValue, 0, 1); } if (!loopIndexProp.hasMultipleDifferentValues) { loopIndexProp.intValue = EditorGUILayout.Popup("Loop Type", loopIndexProp.intValue, loopOptions); } else { EditorGUILayout.LabelField("Selection contains different Loop Types!"); } if (posPhaseShiftProp.hasMultipleDifferentValues) { EditorGUILayout.PropertyField(posPhaseShiftProp, new GUIContent("Phase Shift")); } else { posPhaseShiftProp.floatValue = EditorGUILayout.Slider("Phase Shift", posPhaseShiftProp.floatValue, 0, 1); } break; case 3: //Follow Target EditorGUILayout.PropertyField(positionTargetProp, new GUIContent("Target Transform")); EditorGUI.BeginDisabledGroup(velocityApproachProp.boolValue); if (positionHardnessProp.hasMultipleDifferentValues) { EditorGUILayout.PropertyField(positionHardnessProp, new GUIContent("Hardness")); } else { positionHardnessProp.floatValue = EditorGUILayout.Slider("Hardness", positionHardnessProp.floatValue, 0, 1); } EditorGUI.EndDisabledGroup(); EditorGUILayout.PropertyField(velocityApproachProp, new GUIContent("Velocity Approach")); EditorGUI.BeginDisabledGroup(!velocityApproachProp.boolValue); EditorGUI.indentLevel++; EditorGUILayout.PropertyField(maxVelocityProp, new GUIContent("Maximum Velocity")); if (maxVelocityProp.floatValue < 0) { maxVelocityProp.floatValue = 0f; } EditorGUILayout.PropertyField(accelerationProp, new GUIContent("Acceleration")); if (accelerationProp.floatValue < 0) { accelerationProp.floatValue = 0f; } EditorGUILayout.PropertyField(snapRangeProp, new GUIContent("Snap Range")); if (snapRangeProp.floatValue < 0) { snapRangeProp.floatValue = 0f; } if (snapHardnessProp.hasMultipleDifferentValues) { EditorGUILayout.PropertyField(snapHardnessProp, new GUIContent("Snap Hardness")); } else { snapHardnessProp.floatValue = EditorGUILayout.Slider("Snap Hardness", snapHardnessProp.floatValue, 0, 1); } EditorGUI.indentLevel--; EditorGUI.EndDisabledGroup(); break; case 4: //Bezier EditorGUILayout.PropertyField(bezierCurveProp, new GUIContent("Curve Object")); if (bezierSpeedProp.hasMultipleDifferentValues) { EditorGUILayout.PropertyField(bezierSpeedProp, new GUIContent("% of Path")); } else { bezierSpeedProp.floatValue = EditorGUILayout.Slider("% of Path", bezierSpeedProp.floatValue, 0, 1); } EditorGUI.BeginDisabledGroup(true); EditorGUILayout.PropertyField(bezierConstSpeedProp, new GUIContent("Constant Velocity")); if (bezierConstSpeedProp.boolValue == true) { bezierConstSpeedProp.boolValue = false; } EditorGUI.EndDisabledGroup(); if (!loopIndexProp.hasMultipleDifferentValues) { loopIndexProp.intValue = EditorGUILayout.Popup("Loop Type", loopIndexProp.intValue, loopOptions); } else { EditorGUILayout.LabelField("Selection contains different Loop Types!"); } if (bezierPhaseShiftProp.hasMultipleDifferentValues) { EditorGUILayout.PropertyField(bezierPhaseShiftProp, new GUIContent("Phase Shift")); } else { bezierPhaseShiftProp.floatValue = EditorGUILayout.Slider("Phase Shift", bezierPhaseShiftProp.floatValue, 0, 1); } break; case 5: //Perlin Noise EditorGUILayout.PropertyField(perlinAmplitudeProp, new GUIContent("Amplitude")); EditorGUILayout.PropertyField(perlinSynchronProp, new GUIContent("Synchronized")); break; default: //Default Debug.LogError("Unrecognized Option"); break; } } else { EditorGUILayout.LabelField("Selection contains different Animation Types!"); } EditorGUI.indentLevel--; } EditorGUILayout.EndFadeGroup(); EditorGUILayout.Space(); //->ROTATION animateRotationProp.boolValue = EditorGUILayout.ToggleLeft("Animate Rotation:", animateRotationProp.boolValue); showRotationFields.target = animateRotationProp.boolValue; if (EditorGUILayout.BeginFadeGroup(showRotationFields.faded)) { EditorGUI.indentLevel++; if (!rotationAnimIndexProp.hasMultipleDifferentValues) { rotationAnimIndexProp.intValue = EditorGUILayout.Popup("Animation Type", rotationAnimIndexProp.intValue, rotationAnimOptions); switch (rotationAnimIndexProp.intValue) { case 0: //Linear EditorGUI.BeginDisabledGroup(true); EditorGUILayout.Toggle("Bound to Movement", true); EditorGUI.EndDisabledGroup(); EditorGUILayout.PropertyField(rotationAnglesProp, new GUIContent("Angles")); break; case 1: //LookAtTarget EditorGUILayout.PropertyField(rotationTargetProp, new GUIContent("Target Transform")); if (rotationHardnessProp.hasMultipleDifferentValues) { EditorGUILayout.PropertyField(rotationHardnessProp, new GUIContent("Hardness")); } else { rotationHardnessProp.floatValue = EditorGUILayout.Slider("Hardness", rotationHardnessProp.floatValue, 0, 1); } break; case 2: //Bezier Nodes if (positionAnimIndexProp.intValue != 4) { GUI.contentColor = Color.red; EditorGUILayout.LabelField("Position Animation must be set to Bezier Curve!", EditorStyles.whiteLabel); GUI.contentColor = Color.white; } break; case 3: //LookAlongCurve EditorGUILayout.PropertyField(curvePredictionProp, new GUIContent("Curve Prediction Amount")); if (curvePredictionProp.floatValue <= 0) { curvePredictionProp.floatValue = 0.0001f; } if (rotationHardnessProp.hasMultipleDifferentValues) { EditorGUILayout.PropertyField(rotationHardnessProp, new GUIContent("Hardness")); } else { rotationHardnessProp.floatValue = EditorGUILayout.Slider("Hardness", rotationHardnessProp.floatValue, 0, 1); } break; default: //Default Debug.LogError("Unrecognized Option"); break; } } else { EditorGUILayout.LabelField("Selection contains different Animation Types!"); } EditorGUI.indentLevel--; } EditorGUILayout.EndFadeGroup(); EditorGUILayout.Space(); serializedObject.ApplyModifiedProperties(); if (EditorGUI.EndChangeCheck()) { SceneView.RepaintAll(); } }