#if UNITY_PHYSICS using UnityEditor; using UnityEngine; namespace Flexalon.Editor { [CustomEditor(typeof(FlexalonInteractable)), CanEditMultipleObjects] public class FlexalonInteractableEditor : UnityEditor.Editor { private SerializedProperty _clickable; private SerializedProperty _maxClickTime; private SerializedProperty _draggable; private SerializedProperty _interpolationSpeed; private SerializedProperty _insertRadius; private SerializedProperty _restriction; private SerializedProperty _planeNormal; private SerializedProperty _localSpaceRestriction; private SerializedProperty _lineDirection; private SerializedProperty _holdOffset; private SerializedProperty _localSpaceOffset; private SerializedProperty _rotateOnDrag; private SerializedProperty _holdRotation; private SerializedProperty _localSpaceRotation; private SerializedProperty _hideCursor; private SerializedProperty _handle; private SerializedProperty _bounds; private SerializedProperty _layerMask; private SerializedProperty _clicked; private SerializedProperty _hoverStart; private SerializedProperty _hoverEnd; private SerializedProperty _selectStart; private SerializedProperty _selectEnd; private SerializedProperty _dragStart; private SerializedProperty _dragEnd; private static bool _showDragOptions = true; private static bool _showEvents = false; void OnEnable() { _clickable = serializedObject.FindProperty("_clickable"); _maxClickTime = serializedObject.FindProperty("_maxClickTime"); _draggable = serializedObject.FindProperty("_draggable"); _interpolationSpeed = serializedObject.FindProperty("_interpolationSpeed"); _insertRadius = serializedObject.FindProperty("_insertRadius"); _restriction = serializedObject.FindProperty("_restriction"); _planeNormal = serializedObject.FindProperty("_planeNormal"); _localSpaceRestriction = serializedObject.FindProperty("_localSpaceRestriction"); _lineDirection = serializedObject.FindProperty("_lineDirection"); _holdOffset = serializedObject.FindProperty("_holdOffset"); _localSpaceOffset = serializedObject.FindProperty("_localSpaceOffset"); _rotateOnDrag = serializedObject.FindProperty("_rotateOnDrag"); _holdRotation = serializedObject.FindProperty("_holdRotation"); _localSpaceRotation = serializedObject.FindProperty("_localSpaceRotation"); _hideCursor = serializedObject.FindProperty("_hideCursor"); _handle = serializedObject.FindProperty("_handle"); _bounds = serializedObject.FindProperty("_bounds"); _layerMask = serializedObject.FindProperty("_layerMask"); _clicked = serializedObject.FindProperty("_clicked"); _hoverStart = serializedObject.FindProperty("_hoverStart"); _hoverEnd = serializedObject.FindProperty("_hoverEnd"); _selectStart = serializedObject.FindProperty("_selectStart"); _selectEnd = serializedObject.FindProperty("_selectEnd"); _dragStart = serializedObject.FindProperty("_dragStart"); _dragEnd = serializedObject.FindProperty("_dragEnd"); } public override void OnInspectorGUI() { serializedObject.Update(); EditorGUILayout.PropertyField(_clickable); if (_clickable.boolValue) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(serializedObject.FindProperty("_maxClickTime"), new GUIContent("Max Click Time")); EditorGUI.indentLevel--; EditorGUILayout.Space(); } EditorGUILayout.PropertyField(_draggable); if (_draggable.boolValue) { EditorGUILayout.Space(); _showDragOptions = EditorGUILayout.Foldout(_showDragOptions, "Drag Options"); if (_showDragOptions) { EditorGUI.indentLevel++; bool showAllOptions = true; foreach (var target in targets) { var interactable = target as FlexalonInteractable; showAllOptions = showAllOptions && interactable._showAllDragProperties; } if (showAllOptions) { EditorGUILayout.PropertyField(_interpolationSpeed); } EditorGUILayout.PropertyField(_insertRadius); if (showAllOptions) { var restriction = _restriction; EditorGUILayout.PropertyField(restriction); if (restriction.enumValueIndex == (int)FlexalonInteractable.RestrictionType.Plane) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(_planeNormal, new GUIContent("Normal")); EditorGUILayout.PropertyField(_localSpaceRestriction, new GUIContent("Local Space")); EditorGUI.indentLevel--; } else if (restriction.enumValueIndex == (int)FlexalonInteractable.RestrictionType.Line) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(_lineDirection, new GUIContent("Direction")); EditorGUILayout.PropertyField(_localSpaceRestriction, new GUIContent("Local Space")); EditorGUI.indentLevel--; } EditorGUILayout.PropertyField(_holdOffset); EditorGUILayout.PropertyField(_localSpaceOffset, new GUIContent("Local Space")); var rotateOnGrab = _rotateOnDrag; EditorGUILayout.PropertyField(rotateOnGrab); if (rotateOnGrab.boolValue) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(_holdRotation, new GUIContent("Rotation")); EditorGUILayout.PropertyField(_localSpaceRotation, new GUIContent("Local Space")); EditorGUI.indentLevel--; } EditorGUILayout.PropertyField(_handle); EditorGUILayout.PropertyField(_bounds); } else { EditorGUILayout.Space(); EditorGUILayout.HelpBox("Some drag options are disabled for the selected input provider.", MessageType.Info); EditorGUILayout.Space(); } EditorGUILayout.PropertyField(_hideCursor); EditorGUILayout.PropertyField(_layerMask); EditorGUI.indentLevel--; } } EditorGUILayout.Space(); _showEvents = EditorGUILayout.Foldout(_showEvents, "Events"); if (_showEvents) { if (_clickable.boolValue) { EditorGUILayout.PropertyField(serializedObject.FindProperty("_clicked")); } EditorGUILayout.PropertyField(serializedObject.FindProperty("_hoverStart")); EditorGUILayout.PropertyField(serializedObject.FindProperty("_hoverEnd")); EditorGUILayout.PropertyField(serializedObject.FindProperty("_selectStart")); EditorGUILayout.PropertyField(serializedObject.FindProperty("_selectEnd")); if (_draggable.boolValue) { EditorGUILayout.PropertyField(serializedObject.FindProperty("_dragStart")); EditorGUILayout.PropertyField(serializedObject.FindProperty("_dragEnd")); } } serializedObject.ApplyModifiedProperties(); } } } #endif