Ejemplo n.º 1
0
        /// <summary>
        /// Find all the pointers and fire raycaster events for them.
        /// </summary>
        public override void Process()
        {
            if (requestedMode != currentMode)
            {
                if (requestedMode == InputModes.Auto)
                {
                    requestedMode = SavedInputMode;
                }

                // Validate the InputModes that has been set
                var voice       = VoiceRequestApproved;
                var controllers = ControllersRequestApproved;
                var hands       = HandsRequestApproved;
                var mouse       = MouseRequestApproved;
                var gaze        = GazeRequestApproved;
                var touch       = TouchRequestApproved;

                // Enable a default device if no devices are enabled
                if (!controllers && !hands && !mouse && !touch && !gaze)
                {
                    if (ControllersAvailable)
                    {
                        controllers = true;
                    }
                    else if (HandsAvailable)
                    {
                        hands = true;
                    }
                    else if (MouseAvailable)
                    {
                        mouse = true;
                    }
                    else if (TouchAvailable)
                    {
                        touch = true;
                    }
                    else if (GazeAvailable)
                    {
                        gaze = true;
                    }
                }

                if (Voice != null)
                {
                    Voice.enabled = voice;
                }

                Gaze.SetActive(gaze);

                Mouse.SetActive(mouse);

                foreach (var touchPoint in Touches)
                {
                    touchPoint.SetActive(touch);
                }

                foreach (var handTracker in Hands)
                {
                    handTracker.SetActive(hands);
                }

                foreach (var motionController in Controllers)
                {
                    motionController.SetActive(controllers);
                }

                // record the actual input mode
                VoiceRequested       = voice;
                ControllersRequested = controllers;
                MouseRequested       = mouse;
                TouchRequested       = touch;
                HandsRequested       = hands;
                GazeRequested        = gaze;

                SavedInputMode = currentMode = requestedMode;
            }

            if (newDevices.Count > 0)
            {
                foreach (var device in newDevices)
                {
                    device.LaserPointerNormalMaterial   = laserPointerNormalMaterial;
                    device.LaserPointerEnabledMaterial  = laserPointerEnabledMaterial;
                    device.LaserPointerDisabledMaterial = laserPointerDisabledMaterial;
                }

                Devices.AddRange(newDevices);
                newDevices.Clear();
            }

            if (newKeyboardShortcuts.Count > 0)
            {
                keyboardShortcuts.AddRange(newKeyboardShortcuts);
                newKeyboardShortcuts.Clear();
            }

            keyPresses.Clear();
            toActivate.Clear();
            toRemove.Clear();

            foreach (var pointer in Devices)
            {
                if (pointer.ProcessInUpdate)
                {
                    ProcessPointer(pointer);
                }
            }

            foreach (var shortcut in keyboardShortcuts)
            {
                if (shortcut == null ||
                    !shortcut.gameObject.scene.isLoaded)
                {
                    toRemove.MaybeAdd(shortcut);
                }
                else if (shortcut.IsInteractable() &&
                         (UnityInput.GetKeyUp(shortcut.KeyCode) ||
                          keyPresses.Contains(shortcut.KeyCode)))
                {
                    toActivate.MaybeAdd(shortcut);
                }
            }

            foreach (var shortcut in toRemove)
            {
                keyboardShortcuts.Remove(shortcut);
            }

            if (!paused)
            {
                foreach (var shortcut in toActivate)
                {
                    shortcut.ActivateEvent();
                }
            }
        }