Example #1
0
 // clears the hovered object so it can re-hover
 public void Reset()
 {
     _hoveredCollider = null;
     _clickTarget     = null;
     _grabTarget      = null;
     _hoverTarget     = null;
     _state           = State.Seek;
 }
Example #2
0
        private void GoToInertState()
        {
            if (_hoverTarget != null)
            {
                _hoverTarget.HandleUnhover(this);
            }

            _hoveredCollider = null;
            _clickTarget     = null;
            _grabTarget      = null;
            _hoverTarget     = null;

            _state = State.Inert;
        }
Example #3
0
 private void Update()
 {
     if (Input.GetMouseButtonUp(0))                                                                // Jeżeli lewy przycisk myszki został podniesiony
     {
         Ray mouseRay = _camera.ScreenPointToRay(Input.mousePosition);                             // Promień z pozycji myszki w głąb sceny
         if (Physics.Raycast(mouseRay, out var hitInfo))                                           // Sprawdź czy promień w coś trafił
         {
             IClickTarget clickTarget = hitInfo.collider.gameObject.GetComponent <IClickTarget>(); // Wyciągnijmy obiekt typu IClickTarget
             if (clickTarget != null)                                                              //Sprawdź czy był obiekt typu IClickTarget
             {
                 clickTarget.Clicked();                                                            // Powiedź obiektowi że został kliknięty
             }
         }
     }
 }
Example #4
0
        private void SingleCast(Ray mouseRay, float maxDistance)
        {
            if (Caster == null)
            {
                Debug.LogWarning("There is no ICaster for ClickController");
                return;
            }

            if (Caster.Cast(mouseRay, out var hitInfo, maxDistance, _targetLayers))                   // Sprawdź czy caster w coś trafił
            {
                IClickTarget clickTarget = hitInfo.collider.gameObject.GetComponent <IClickTarget>(); // Wyciągnijmy obiekt typu IClickTarget
                if (clickTarget != null)                                                              //Sprawdź czy był obiekt typu IClickTarget
                {
                    clickTarget.Clicked();                                                            // Powiedź obiektowi że został kliknięty
                }
            }
        }
Example #5
0
        private void NonAllocCast(Ray mouseRay, float maxDistance)
        {
            if (Caster == null)
            {
                Debug.LogWarning("There is no ICaster for ClickController");
                return;
            }

            var hitsCount = Caster.CastNonAlloc(mouseRay, _allocatedHits, maxDistance, _targetLayers);

            for (int i = 0; i < hitsCount; i++)
            {
                IClickTarget clickTarget = _allocatedHits[i].collider.gameObject.GetComponent <IClickTarget>(); // Wyciągnijmy obiekt typu IClickTarget
                if (clickTarget != null)                                                                        //Sprawdź czy był obiekt typu IClickTarget
                {
                    clickTarget.Clicked();                                                                      // Powiedź obiektowi że został kliknięty
                }
            }
        }
Example #6
0
        private void AllCast(Ray mouseRay, float maxDistance)
        {
            if (Caster == null)
            {
                Debug.LogWarning("There is no ICaster for ClickController");
                return;
            }

            var allHits = Caster.CastAll(mouseRay, maxDistance, _targetLayers);

            foreach (var hit in allHits)
            {
                IClickTarget clickTarget = hit.collider.gameObject.GetComponent <IClickTarget>(); // Wyciągnijmy obiekt typu IClickTarget
                if (clickTarget != null)                                                          //Sprawdź czy był obiekt typu IClickTarget
                {
                    clickTarget.Clicked();                                                        // Powiedź obiektowi że został kliknięty
                }
            }
        }
    void Update()
    {
        if (Input.GetMouseButtonDown(0) && SceneController.state == SceneController.SceneState.game)
        {
            PlayMouseClickEffect();

            Ray        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                IClickTarget clickHandler = hit.collider.GetComponent <IClickTarget>();

                if (clickHandler != null)
                {
                    if (clickHandler.OnTargetClicked())
                    {
                        AudioManager.Instance.Play(coinSound, 1f, 0.3f);
                    }
                    ;
                    print("Click");
                }
            }
        }
    }
Example #8
0
        protected void Update()
        {
            if (_isActive == false)
            {
                return;
            }

            if (CanvasPointerCheck.IsOverCanvas)
            {
                GoToInertState();
                _state = State.BlockedByCanvas;
                return;
            }
            // We're no longer pointed at a canvas: go to Seek state
            else if (_state == State.BlockedByCanvas)
            {
                _state = State.Seek;
            }

            // Store previous state
            Collider     previousHoveredCollider = _hoveredCollider;
            IClickTarget previousClickTarget     = _clickTarget;
            IGrabTarget  previousGrabTarget      = _grabTarget;
            IHoverTarget previousHoverTarget     = _hoverTarget;

            bool isPrimaryButtonDown = IsPrimaryButtonDown();

            // An inert state is triggered when the button is pressed without a target
            if (_state == State.Inert)
            {
                if (isPrimaryButtonDown == false)
                {
                    // Continue with normal Seek behavior
                    _state = State.Seek;
                }
                else
                {
                    // Do nothing and clear current state
                    _hoveredCollider = null;
                    _clickTarget     = null;
                    _grabTarget      = null;
                    _hoverTarget     = null;
                    return;
                }
            }

            // Always identify the object under the pointer
            _hoveredCollider = GetHoveredCollider();

            if (_hoveredCollider)
            {
                // note that these might be null
                _clickTarget = _hoveredCollider.transform.GetComponentInParent <IClickTarget>();
                _hoverTarget = _hoveredCollider.transform.GetComponentInParent <IHoverTarget>();
            }
            else
            {
                _clickTarget = null;
                _hoverTarget = null;
            }

            // Hover / Unhover
            if (_state == State.Seek)
            {
                // if we have a new target, unhover the old and hover the new
                if (_hoverTarget != previousHoverTarget)
                {
                    if (previousHoverTarget != null)
                    {
                        previousHoverTarget.HandleUnhover(this);
                    }
                    if (_hoverTarget != null)
                    {
                        _hoverTarget.HandleHover(this);
                    }
                }

                if (isPrimaryButtonDown)
                {
                    if (_hoveredCollider == null)
                    {
                        GoToInertState();
                    }
                    else
                    {
                        _buttonDownTime = Time.timeSinceLevelLoad;
                        _state          = State.Active;
                    }
                }

                return;
            }

            // Button is down. Click, Grab, or Cancel.
            // NOTE: This means it is possible for objects to move between the pointer and the target and interrupt events.
            if (_state == State.Active)
            {
                // Did the hovered collider change? Then unhover and cancel.
                if (_hoveredCollider != previousHoveredCollider)
                {
                    if (previousHoverTarget != null)
                    {
                        previousHoverTarget.HandleUnhover(this);
                    }
                    GoToInertState();
                    return;
                }

                // Still trying to click (mouse up within duration on same collider)
                if (ButtonDownDuration < _maxClickDuration)
                {
                    // Try to click, then return to Seek
                    if (isPrimaryButtonDown == false)
                    {
                        if (_clickTarget != null && _clickTarget == previousClickTarget)
                        {
                            _clickTarget.HandleClick(this);
                            _clickTarget = null;
                            _state       = State.Seek;
                        }
                    }
                }
                // Button is still down, we are moving to grab state if we have a valid target
                else
                {
                    _grabTarget = _hoveredCollider.transform.GetComponentInParent <IGrabTarget>();
                    if (_grabTarget != null && _grabTarget == previousGrabTarget)
                    {
                        _grabTarget.HandleGrab(this);
                        _state = State.Grab;
                    }
                    else
                    {
                        GoToInertState();
                    }
                }

                return;
            }

            // The grabbed object has the reins at this point. We're just waiting for primary button up.
            if (_state == State.Grab)
            {
                if (isPrimaryButtonDown)
                {
                    // the target was destroyed, bail.
                    if (previousGrabTarget == null)
                    {
                        GoToInertState();
                        return;
                    }
                }
                else                 // release
                {
                    // the target was destroyed, bail.
                    if (previousGrabTarget != null)
                    {
                        previousGrabTarget.HandleRelease(this);
                    }
                    _state = State.Seek;
                    return;
                }
            }

            Debug.LogError("Pointer fell through to unknown state " + _state.ToString());
        }