Ejemplo n.º 1
0
    public void OnBeforeFocusChange(FocusEventData eventData)
    {
        if (!EnableForce || !TryToVerifyPointerAndController(eventData.Pointer, out var pointer))
        {
            return;
        }

        // this should never trigger!
        Debug.Assert(pointer != null);

        if (eventData.NewFocusedObject != null && eventData.NewFocusedObject.transform.IsChildOf(transform))
        {
            // if already listed then ignore
            if (!_focusers.Add(pointer))
            {
                return;
            }
            eventData.Pointer.FocusTarget = this;

            var isHoloLens2OrVr = !IsGgvOrDesktopController(eventData.Pointer.Controller);

            var tractorBeam = isHoloLens2OrVr ? AttachTractorBeamToPointer(pointer) : null;

            switch (ForceState)
            {
            case State.Root:
            case State.Free:
                if (!IsGgvOrDesktopController(eventData.Pointer.Controller))
                {
                    Debug.Assert(_activeTractorBeams.Add(tractorBeam));
                    StartDwell();
                }

                break;

            case State.Dwell:

                if (isHoloLens2OrVr)
                {
                    Debug.Assert(_activeTractorBeams.Add(tractorBeam));
                }
                break;

            case State.Manipulation:
            case State.Attraction:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        else
        {
            _focusers.Remove(pointer);
            if ((ForceSolver)eventData.Pointer.FocusTarget == this)
            {
                eventData.Pointer.FocusTarget = null;
            }
            _activeTractorBeams.Remove(ForceTractorBeam.GetTractorBeamFromPointer(pointer));
        }
    }
Ejemplo n.º 2
0
 private ForceTractorBeam AttachTractorBeamToPointer(ShellHandRayPointer pointer)
 {
     return(ForceTractorBeam.AttachToHandRayPointer(pointer, TractionBeamPrefab));
 }