internal static RayInteractor CreateRayInteractor()
        {
            GameObject interactorGO = new GameObject();

            interactorGO.name = "Ray Interactor";
            RayInteractor interactor = interactorGO.AddComponent <RayInteractor>();

            return(interactor);
        }
        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            EditorGUI.BeginDisabledGroup(true);
            EditorGUILayout.ObjectField(EditorGUIUtility.TrTempContent("Script"), MonoScript.FromMonoBehaviour((RayInteractor)target), typeof(RayInteractor), false);
            EditorGUI.EndDisabledGroup();

            foreach (Object targetObject in serializedObject.targetObjects)
            {
                RayInteractor interactor = (RayInteractor)targetObject;

                if (interactor.GetComponent <XRController>() == null && interactor.GetComponent <ActionBasedController>() == null)
                {
                    EditorGUILayout.HelpBox(Tooltips.MissingRequiredController, MessageType.Warning, true);
                    break;
                }
            }

            EditorGUILayout.PropertyField(interactionManager, Tooltips.InteractionManager);
            EditorGUILayout.PropertyField(interactionLayerMask, Tooltips.InteractionLayerMask);

            EditorGUILayout.Space();

            EditorGUILayout.PropertyField(enableUIInteraction, Tooltips.EnableUIInteraction);

            EditorGUILayout.PropertyField(useForceGrab, Tooltips.ForceGrab);
            EditorGUILayout.PropertyField(allowAnchorControl, Tooltips.AllowAnchorControl);

            if (allowAnchorControl.boolValue)
            {
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(anchorRotateSpeed, Tooltips.AnchorRotateSpeed);
                EditorGUILayout.PropertyField(anchorTranslateSpeed, Tooltips.AnchorTranslateSpeed);
                EditorGUI.indentLevel--;
            }

            EditorGUILayout.PropertyField(attachTransform, Tooltips.AttachTransform);

            EditorGUILayout.Space();

            lineType.isExpanded = EditorGUILayout.Foldout(lineType.isExpanded, EditorGUIUtility.TrTempContent("Raycast Configuration"), true);

            if (lineType.isExpanded)
            {
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(lineType, Tooltips.LineType);
                EditorGUI.indentLevel++;

                switch (lineType.enumValueIndex)
                {
                case (int)XRRayInteractor.LineType.StraightLine:
                    EditorGUILayout.PropertyField(maxRaycastDistance, Tooltips.MaxRaycastDistance);
                    break;

                case (int)XRRayInteractor.LineType.ProjectileCurve:
                    EditorGUILayout.PropertyField(referenceFrame, Tooltips.ReferenceFrame);
                    EditorGUILayout.PropertyField(velocity, Tooltips.Velocity);
                    EditorGUILayout.PropertyField(acceleration, Tooltips.Acceleration);
                    EditorGUILayout.PropertyField(additionalFlightTime, Tooltips.AdditionalFlightTime);
                    EditorGUILayout.PropertyField(sampleFrequency, Tooltips.SampleFrequency);
                    break;

                case (int)XRRayInteractor.LineType.BezierCurve:
                    EditorGUILayout.PropertyField(endPointDistance, Tooltips.EndPointDistance);
                    EditorGUILayout.PropertyField(endPointHeight, Tooltips.EndPointHeight);
                    EditorGUILayout.PropertyField(controlPointDistance, Tooltips.ControlPointDistance);
                    EditorGUILayout.PropertyField(controlPointHeight, Tooltips.ControlPointHeight);
                    EditorGUILayout.PropertyField(sampleFrequency, Tooltips.SampleFrequency);
                    break;
                }
                EditorGUI.indentLevel--;

                EditorGUILayout.Space();

                EditorGUILayout.PropertyField(raycastMask, Tooltips.RaycastMask);
                EditorGUILayout.PropertyField(raycastTriggerInteraction, Tooltips.RaycastTriggerInteraction);
                EditorGUILayout.PropertyField(hitDetectionType, Tooltips.HitDetectionType);

                if (hitDetectionType.enumValueIndex == (int)XRRayInteractor.HitDetectionType.SphereCast)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(sphereCastRadius, Tooltips.SphereCastRadius);
                    EditorGUI.indentLevel--;
                }

                EditorGUI.indentLevel--;
            }

            EditorGUILayout.Space();

            selectActionTrigger.isExpanded = EditorGUILayout.Foldout(selectActionTrigger.isExpanded, EditorGUIUtility.TrTempContent("Selection Configuration"), true);

            if (selectActionTrigger.isExpanded)
            {
                EditorGUI.indentLevel++;

                EditorGUILayout.PropertyField(selectActionTrigger, Tooltips.SelectActionTrigger);
                if (startingSelectedInteractable.objectReferenceValue != null && (selectActionTrigger.enumValueIndex == 2 || selectActionTrigger.enumValueIndex == 3))
                {
                    EditorGUILayout.HelpBox(Tooltips.StartingInteractableWarning, MessageType.Warning, true);
                }

                EditorGUILayout.PropertyField(keepSelectedTargetValid, Tooltips.KeepSelectedTargetValid);
                EditorGUILayout.PropertyField(hideControllerOnSelect, Tooltips.HideControllerOnSelect);
                EditorGUILayout.PropertyField(hoverToSelect, Tooltips.HoverToSelect);

                if (hoverToSelect.boolValue)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(hoverTimeToSelect, Tooltips.EoverTimeToSelect);
                    EditorGUI.indentLevel--;
                }

                EditorGUILayout.PropertyField(startingSelectedInteractable, Tooltips.StartingSelectedInteractable);

                EditorGUI.indentLevel--;
            }

            EditorGUILayout.Space();

            playAudioClipOnSelectEntered.isExpanded = EditorGUILayout.Foldout(playAudioClipOnSelectEntered.isExpanded, EditorGUIUtility.TrTempContent("Audio Events"), true);

            if (playAudioClipOnSelectEntered.isExpanded)
            {
                EditorGUI.indentLevel++;

                EditorGUILayout.PropertyField(playAudioClipOnSelectEntered, Tooltips.PlayAudioClipOnSelectEntered);

                if (playAudioClipOnSelectEntered.boolValue)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(audioClipForOnSelectEntered, Tooltips.AudioClipForOnSelectEntered);
                    EditorGUI.indentLevel--;
                }

                EditorGUILayout.PropertyField(playAudioClipOnSelectExited, Tooltips.PlayAudioClipOnSelectExited);

                if (playAudioClipOnSelectExited.boolValue)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(audioClipForOnSelectExited, Tooltips.AudioClipForOnSelectExited);
                    EditorGUI.indentLevel--;
                }

                EditorGUILayout.PropertyField(playAudioClipOnHoverEntered, Tooltips.PlayAudioClipOnHoverEntered);

                if (playAudioClipOnHoverEntered.boolValue)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(audioClipForOnHoverEntered, Tooltips.AudioClipForOnHoverEntered);
                    EditorGUI.indentLevel--;
                }

                EditorGUILayout.PropertyField(playAudioClipOnHoverExited, Tooltips.PlayAudioClipOnHoverExited);

                if (playAudioClipOnHoverExited.boolValue)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(audioClipForOnHoverExited, Tooltips.AudioClipForOnHoverExited);
                    EditorGUI.indentLevel--;
                }

                EditorGUI.indentLevel--;
            }

            EditorGUILayout.Space();

            playHapticsOnSelectEntered.isExpanded = EditorGUILayout.Foldout(playHapticsOnSelectEntered.isExpanded, EditorGUIUtility.TrTempContent("Haptic Events"), true);

            if (playHapticsOnSelectEntered.isExpanded)
            {
                EditorGUI.indentLevel++;

                EditorGUILayout.PropertyField(playHapticsOnSelectEntered, Tooltips.PlayHapticsOnSelectEntered);

                if (playHapticsOnSelectEntered.boolValue)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(hapticSelectEnterIntensity, Tooltips.HapticSelectEnterIntensity);
                    EditorGUILayout.PropertyField(hapticSelectEnterDuration, Tooltips.HapticSelectEnterDuration);
                    EditorGUI.indentLevel--;
                }

                EditorGUILayout.PropertyField(playHapticsOnSelectExited, Tooltips.PlayHapticsOnSelectExited);

                if (playHapticsOnSelectExited.boolValue)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(hapticSelectExitIntensity, Tooltips.HapticSelectExitIntensity);
                    EditorGUILayout.PropertyField(hapticSelectExitDuration, Tooltips.HapticSelectExitDuration);
                    EditorGUI.indentLevel--;
                }

                EditorGUILayout.PropertyField(playHapticsOnHoverEntered, Tooltips.PlayHapticsOnHoverEntered);

                if (playHapticsOnHoverEntered.boolValue)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(hapticHoverEnterIntensity, Tooltips.HapticHoverEnterIntensity);
                    EditorGUILayout.PropertyField(hapticHoverEnterDuration, Tooltips.HapticHoverEnterDuration);
                    EditorGUI.indentLevel--;
                }

                EditorGUILayout.PropertyField(playHapticsOnHoverExited, Tooltips.PlayHapticsOnHoverExited);

                if (playHapticsOnHoverExited.boolValue)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(hapticHoverExitIntensity, Tooltips.HapticHoverExitIntensity);
                    EditorGUILayout.PropertyField(hapticHoverExitDuration, Tooltips.HapticHoverExitDuration);
                    EditorGUI.indentLevel--;
                }

                EditorGUI.indentLevel--;
            }

            EditorGUILayout.Space();

            onHoverEntered.isExpanded = EditorGUILayout.Foldout(onHoverEntered.isExpanded, EditorGUIUtility.TrTempContent("Interactor Events"), true);

            if (onHoverEntered.isExpanded)
            {
                EditorGUILayout.PropertyField(onHoverEntered);
                EditorGUILayout.PropertyField(onHoverExited);
                EditorGUILayout.PropertyField(onSelectEntered);
                EditorGUILayout.PropertyField(onSelectExited);
            }

            serializedObject.ApplyModifiedProperties();
        }