ValeTouchReceiver RaycastForReceiver(Vector3 localizedScreenPosition)
    {
        //Debug.Log(localizedScreenPosition);
        Vector3 mouseWorldPos = raycastCamera.ScreenToWorldPoint(localizedScreenPosition + Vector3.forward * raycastCamera.nearClipPlane);
        //Debug.Log(mouseWorldPos);
        Collider2D collider = Physics2D.OverlapArea(mouseWorldPos - mousetipSize / 2, mouseWorldPos + mousetipSize / 2, layers);

        if (collider == null)
        {
            return(null);
        }
        ValeTouchReceiver hitMouseInteractable = collider.GetComponent <ValeTouchReceiver>();

        if (hitMouseInteractable != null)
        {
            return(hitMouseInteractable);
        }
        return(null);
    }
    void ProcessTouchEventsOnReceivers(ValeTouchReceiver newlyActivatedReceiver)
    {
        if (newlyActivatedReceiver != null)
        {
            newlyActivatedReceiver.onTouchDown.Invoke();
        }


        if (activatedReceiver != null)
        {
            if (touchEnabled)
            {
                foreach (Touch touch in Input.touches)
                {
                    if (touch.fingerId == touchID)
                    {
                        if (touch.phase == TouchPhase.Ended)
                        {
                            activatedReceiver.onTouchUp.Invoke();
                            activatedReceiver = newlyActivatedReceiver;
                        }
                    }
                }
            }
            else
            {
                if (Input.GetMouseButtonUp(0))
                {
                    activatedReceiver.onTouchUp.Invoke();
                    activatedReceiver = newlyActivatedReceiver;
                }
            }
        }
        if (activatedReceiver == null && newlyActivatedReceiver != null)
        {
            activatedReceiver = newlyActivatedReceiver;
        }
    }
    void Update()
    {
        hasActiveTouch = false;
        ValeTouchReceiver newlyActivatedReceiver = null;

        if (isWindowMode)
        {
            UpdateScreenRelationship();
            if (touchEnabled)
            {
                foreach (Touch touch in Input.touches)
                {
                    if (!screenBounds.Value.Contains(touch.position))
                    {
                        continue;
                    }
                    if (!hasActiveTouch)
                    {
                        activeTouch    = touch;
                        hasActiveTouch = true;
                    }
                    if (touch.phase == TouchPhase.Began)
                    {
                        newlyActivatedReceiver = RaycastForReceiver(LocalizeScreenPosition(touch.position));
                    }
                    if (newlyActivatedReceiver != null)
                    {
                        touchID = touch.fingerId;
                        break;
                    }
                }
            }
            else if (Input.GetMouseButtonDown(0))
            {
                if (screenBounds.Value.Contains(Input.mousePosition))
                {
                    newlyActivatedReceiver = RaycastForReceiver(mousePosition);
                }
            }
        }
        else
        {
            if (touchEnabled)
            {
                foreach (Touch touch in Input.touches)
                {
                    if (!hasActiveTouch)
                    {
                        activeTouch    = touch;
                        hasActiveTouch = true;
                    }
                    if (touch.phase == TouchPhase.Began)
                    {
                        newlyActivatedReceiver = RaycastForReceiver(touch.position);
                    }
                    if (newlyActivatedReceiver != null)
                    {
                        touchID = touch.fingerId;
                        break;
                    }
                }
            }
            else if (Input.GetMouseButtonDown(0))
            {
                newlyActivatedReceiver = RaycastForReceiver(Input.mousePosition);
            }
        }

        ProcessTouchEventsOnReceivers(newlyActivatedReceiver);
        UpdateTouchGlobalEvents();
    }