private void UpdateJoystick()
    {
        #region dynamic joystick
        if (joystickType == JoystickType.Dynamic && !_visible && _activated)
        {
            Vector2 localPosition  = Vector2.zero;
            Vector2 screenPosition = Vector2.zero;

            if (isTouchOverJoystickArea(ref localPosition, ref screenPosition))
            {
                GameObject overGO = GetFirstUIElement(screenPosition);

                if (overGO == null || (allowJoystickOverTouchPad && overGO.GetComponent <ETCTouchPad>()) || (overGO != null && overGO.GetComponent <ETCArea>()))
                {
                    cachedRectTransform.anchoredPosition = localPosition;
                    visible = true;
                }
            }
        }
        #endregion

        #region Key simulation
        if (enableKeySimulation && !isOnTouch && _activated && _visible)
        {
            thumb.localPosition = Vector2.zero;
            isOnDrag            = false;

            if (Input.GetKey(axisX.positivekey))
            {
                isOnDrag            = true;
                thumb.localPosition = new Vector2(GetRadius(), thumb.localPosition.y);
            }
            else if (Input.GetKey(axisX.negativeKey))
            {
                isOnDrag            = true;
                thumb.localPosition = new Vector2(-GetRadius(), thumb.localPosition.y);
            }

            if (Input.GetKey(axisY.positivekey))
            {
                isOnDrag            = true;
                thumb.localPosition = new Vector2(thumb.localPosition.x, GetRadius());
            }
            else if (Input.GetKey(axisY.negativeKey))
            {
                isOnDrag            = true;
                thumb.localPosition = new Vector2(thumb.localPosition.x, -GetRadius());
            }

            thumbPosition = thumb.localPosition;
        }
        #endregion

        // Computejoystick value
        OldTmpAxis.x = axisX.axisValue;
        OldTmpAxis.y = axisY.axisValue;

        tmpAxis = thumbPosition / GetRadius();

        axisX.UpdateAxis(tmpAxis.x, isOnDrag, ETCBase.ControlType.Joystick, true);
        axisY.UpdateAxis(tmpAxis.y, isOnDrag, ETCBase.ControlType.Joystick, true);

        axisX.DoGravity();
        axisY.DoGravity();

        #region Move event
        if ((axisX.axisValue != 0 || axisY.axisValue != 0) && OldTmpAxis == Vector2.zero)
        {
            onMoveStart.Invoke();
        }
        if (axisX.axisValue != 0 || axisY.axisValue != 0)
        {
            // X axis
            if (axisX.actionOn == ETCAxis.ActionOn.Down && (axisX.axisState == ETCAxis.AxisState.DownLeft || axisX.axisState == ETCAxis.AxisState.DownRight))
            {
                axisX.DoDirectAction();
            }
            else if (axisX.actionOn == ETCAxis.ActionOn.Press)
            {
                axisX.DoDirectAction();
            }

            // Y axis
            if (axisY.actionOn == ETCAxis.ActionOn.Down && (axisY.axisState == ETCAxis.AxisState.DownUp || axisY.axisState == ETCAxis.AxisState.DownDown))
            {
                axisY.DoDirectAction();
            }
            else if (axisY.actionOn == ETCAxis.ActionOn.Press)
            {
                axisY.DoDirectAction();
            }
            onMove.Invoke(new Vector2(axisX.axisValue, axisY.axisValue));
            onMoveSpeed.Invoke(new Vector2(axisX.axisSpeedValue, axisY.axisSpeedValue));
        }
        else if (axisX.axisValue == 0 && axisY.axisValue == 0 && OldTmpAxis != Vector2.zero)
        {
            onMoveEnd.Invoke(Vector2.zero);
        }
        #endregion

        #region Down & press event
        float coef = 1;
        if (axisX.invertedAxis)
        {
            coef = -1;
        }
        if (Mathf.Abs(OldTmpAxis.x) < axisX.axisThreshold && Mathf.Abs(axisX.axisValue) >= axisX.axisThreshold)
        {
            if (axisX.axisValue * coef > 0)
            {
                axisX.axisState = ETCAxis.AxisState.DownRight;
                OnDownRight.Invoke();
            }
            else if (axisX.axisValue * coef < 0)
            {
                axisX.axisState = ETCAxis.AxisState.DownLeft;
                OnDownLeft.Invoke();
            }
            else
            {
                axisX.axisState = ETCAxis.AxisState.None;
            }
        }
        else if (axisX.axisState != ETCAxis.AxisState.None)
        {
            if (axisX.axisValue * coef > 0)
            {
                axisX.axisState = ETCAxis.AxisState.PressRight;
                OnPressRight.Invoke();
            }
            else if (axisX.axisValue * coef < 0)
            {
                axisX.axisState = ETCAxis.AxisState.PressLeft;
                OnPressLeft.Invoke();
            }
            else
            {
                axisX.axisState = ETCAxis.AxisState.None;
            }
        }

        coef = 1;
        if (axisY.invertedAxis)
        {
            coef = -1;
        }
        if (Mathf.Abs(OldTmpAxis.y) < axisY.axisThreshold && Mathf.Abs(axisY.axisValue) >= axisY.axisThreshold)
        {
            if (axisY.axisValue * coef > 0)
            {
                axisY.axisState = ETCAxis.AxisState.DownUp;
                OnDownUp.Invoke();
            }
            else if (axisY.axisValue * coef < 0)
            {
                axisY.axisState = ETCAxis.AxisState.DownDown;
                OnDownDown.Invoke();
            }
            else
            {
                axisY.axisState = ETCAxis.AxisState.None;
            }
        }
        else if (axisY.axisState != ETCAxis.AxisState.None)
        {
            if (axisY.axisValue * coef > 0)
            {
                axisY.axisState = ETCAxis.AxisState.PressUp;
                OnPressUp.Invoke();
            }
            else if (axisY.axisValue * coef < 0)
            {
                axisY.axisState = ETCAxis.AxisState.PressDown;
                OnPressDown.Invoke();
            }
            else
            {
                axisY.axisState = ETCAxis.AxisState.None;
            }
        }
        #endregion
    }
Example #2
0
    private void UpdateJoystick()
    {
        #region Unity axes
        if (enableKeySimulation && !isOnTouch && _activated && _visible)
        {
            float x = Input.GetAxis(axisX.unityAxis);
            float y = Input.GetAxis(axisY.unityAxis);

            if (!isNoReturnThumb)
            {
                thumb.localPosition = Vector2.zero;
            }

            isOnDrag = false;

            if (x != 0)
            {
                isOnDrag            = true;
                thumb.localPosition = new Vector2(GetRadius() * x, thumb.localPosition.y);
            }

            if (y != 0)
            {
                isOnDrag            = true;
                thumb.localPosition = new Vector2(thumb.localPosition.x, GetRadius() * y);
            }

            thumbPosition = thumb.localPosition;
        }
        #endregion

        // Computejoystick value
        OldTmpAxis.x = axisX.axisValue;
        OldTmpAxis.y = axisY.axisValue;

        tmpAxis = thumbPosition / GetRadius();

        axisX.UpdateAxis(tmpAxis.x, isOnDrag, ETCBase.ControlType.Joystick, true);
        axisY.UpdateAxis(tmpAxis.y, isOnDrag, ETCBase.ControlType.Joystick, true);

        #region Move event
        if ((axisX.axisValue != 0 || axisY.axisValue != 0) && OldTmpAxis == Vector2.zero)
        {
            onMoveStart.Invoke();
        }
        if (axisX.axisValue != 0 || axisY.axisValue != 0)
        {
            if (!isTurnAndMove)
            {
                // X axis
                if (axisX.actionOn == ETCAxis.ActionOn.Down && (axisX.axisState == ETCAxis.AxisState.DownLeft || axisX.axisState == ETCAxis.AxisState.DownRight))
                {
                    axisX.DoDirectAction();
                }
                else if (axisX.actionOn == ETCAxis.ActionOn.Press)
                {
                    axisX.DoDirectAction();
                }

                // Y axis
                if (axisY.actionOn == ETCAxis.ActionOn.Down && (axisY.axisState == ETCAxis.AxisState.DownUp || axisY.axisState == ETCAxis.AxisState.DownDown))
                {
                    axisY.DoDirectAction();
                }
                else if (axisY.actionOn == ETCAxis.ActionOn.Press)
                {
                    axisY.DoDirectAction();
                }
            }
            else
            {
                DoTurnAndMove();
            }
            onMove.Invoke(new Vector2(axisX.axisValue, axisY.axisValue));
            onMoveSpeed.Invoke(new Vector2(axisX.axisSpeedValue, axisY.axisSpeedValue));
        }
        else if (axisX.axisValue == 0 && axisY.axisValue == 0 && OldTmpAxis != Vector2.zero)
        {
            onMoveEnd.Invoke();
        }

        if (!isTurnAndMove)
        {
            if (axisX.axisValue == 0 && axisX.directCharacterController)
            {
                if (!axisX.directCharacterController.isGrounded && axisX.isLockinJump)
                {
                    axisX.DoDirectAction();
                }
            }

            if (axisY.axisValue == 0 && axisY.directCharacterController)
            {
                if (!axisY.directCharacterController.isGrounded && axisY.isLockinJump)
                {
                    axisY.DoDirectAction();
                }
            }
        }
        else
        {
            if ((axisX.axisValue == 0 && axisY.axisValue == 0) && axisX.directCharacterController)
            {
                if (!axisX.directCharacterController.isGrounded && tmLockInJump)
                {
                    DoTurnAndMove();
                }
            }
        }

        #endregion


        #region Down & press event
        float coef = 1;
        if (axisX.invertedAxis)
        {
            coef = -1;
        }
        if (Mathf.Abs(OldTmpAxis.x) < axisX.axisThreshold && Mathf.Abs(axisX.axisValue) >= axisX.axisThreshold)
        {
            if (axisX.axisValue * coef > 0)
            {
                axisX.axisState = ETCAxis.AxisState.DownRight;
                OnDownRight.Invoke();
            }
            else if (axisX.axisValue * coef < 0)
            {
                axisX.axisState = ETCAxis.AxisState.DownLeft;
                OnDownLeft.Invoke();
            }
            else
            {
                axisX.axisState = ETCAxis.AxisState.None;
            }
        }
        else if (axisX.axisState != ETCAxis.AxisState.None)
        {
            if (axisX.axisValue * coef > 0)
            {
                axisX.axisState = ETCAxis.AxisState.PressRight;
                OnPressRight.Invoke();
            }
            else if (axisX.axisValue * coef < 0)
            {
                axisX.axisState = ETCAxis.AxisState.PressLeft;
                OnPressLeft.Invoke();
            }
            else
            {
                axisX.axisState = ETCAxis.AxisState.None;
            }
        }

        coef = 1;
        if (axisY.invertedAxis)
        {
            coef = -1;
        }
        if (Mathf.Abs(OldTmpAxis.y) < axisY.axisThreshold && Mathf.Abs(axisY.axisValue) >= axisY.axisThreshold)
        {
            if (axisY.axisValue * coef > 0)
            {
                axisY.axisState = ETCAxis.AxisState.DownUp;
                OnDownUp.Invoke();
            }
            else if (axisY.axisValue * coef < 0)
            {
                axisY.axisState = ETCAxis.AxisState.DownDown;
                OnDownDown.Invoke();
            }
            else
            {
                axisY.axisState = ETCAxis.AxisState.None;
            }
        }
        else if (axisY.axisState != ETCAxis.AxisState.None)
        {
            if (axisY.axisValue * coef > 0)
            {
                axisY.axisState = ETCAxis.AxisState.PressUp;
                OnPressUp.Invoke();
            }
            else if (axisY.axisValue * coef < 0)
            {
                axisY.axisState = ETCAxis.AxisState.PressDown;
                OnPressDown.Invoke();
            }
            else
            {
                axisY.axisState = ETCAxis.AxisState.None;
            }
        }
        #endregion
    }
Example #3
0
    private void UpdateTouchPad()
    {
        #region Key simulation

        if (enableKeySimulation && !isOnTouch && _activated && _visible)
        {
            isOnDrag = false;
            tmpAxis  = Vector2.zero;

            float x = Input.GetAxis(axisX.unityAxis);
            float y = Input.GetAxis(axisY.unityAxis);

            if (x != 0)
            {
                isOnDrag = true;
                tmpAxis  = new Vector2(1 * Mathf.Sign(x), tmpAxis.y);
            }

            if (y != 0)
            {
                isOnDrag = true;
                tmpAxis  = new Vector2(tmpAxis.x, 1 * Mathf.Sign(y));
            }
        }
        #endregion

        OldTmpAxis.x = axisX.axisValue;
        OldTmpAxis.y = axisY.axisValue;

        axisX.UpdateAxis(tmpAxis.x, isOnDrag, ETCBase.ControlType.DPad);
        axisY.UpdateAxis(tmpAxis.y, isOnDrag, ETCBase.ControlType.DPad);

        #region Move event
        if (axisX.axisValue != 0 || axisY.axisValue != 0)
        {
            // X axis
            if (axisX.actionOn == ETCAxis.ActionOn.Down && (axisX.axisState == ETCAxis.AxisState.DownLeft || axisX.axisState == ETCAxis.AxisState.DownRight))
            {
                axisX.DoDirectAction();
            }
            else if (axisX.actionOn == ETCAxis.ActionOn.Press)
            {
                axisX.DoDirectAction();
            }

            // Y axis
            if (axisY.actionOn == ETCAxis.ActionOn.Down && (axisY.axisState == ETCAxis.AxisState.DownUp || axisY.axisState == ETCAxis.AxisState.DownDown))
            {
                axisY.DoDirectAction();
            }
            else if (axisY.actionOn == ETCAxis.ActionOn.Press)
            {
                axisY.DoDirectAction();
            }
            onMove.Invoke(new Vector2(axisX.axisValue, axisY.axisValue));
            onMoveSpeed.Invoke(new Vector2(axisX.axisSpeedValue, axisY.axisSpeedValue));
        }
        else if (axisX.axisValue == 0 && axisY.axisValue == 0 && OldTmpAxis != Vector2.zero)
        {
            onMoveEnd.Invoke();
        }
        #endregion

        #region Down & press event
        float coef = 1;
        if (axisX.invertedAxis)
        {
            coef = -1;
        }
        if (OldTmpAxis.x == 0 && Mathf.Abs(axisX.axisValue) > 0)
        {
            if (axisX.axisValue * coef > 0)
            {
                axisX.axisState = ETCAxis.AxisState.DownRight;
                OnDownRight.Invoke();
            }
            else if (axisX.axisValue * coef < 0)
            {
                axisX.axisState = ETCAxis.AxisState.DownLeft;
                OnDownLeft.Invoke();
            }
            else
            {
                axisX.axisState = ETCAxis.AxisState.None;
            }
        }
        else if (axisX.axisState != ETCAxis.AxisState.None)
        {
            if (axisX.axisValue * coef > 0)
            {
                axisX.axisState = ETCAxis.AxisState.PressRight;
                OnPressRight.Invoke();
            }
            else if (axisX.axisValue * coef < 0)
            {
                axisX.axisState = ETCAxis.AxisState.PressLeft;
                OnPressLeft.Invoke();
            }
            else
            {
                axisX.axisState = ETCAxis.AxisState.None;
            }
        }


        coef = 1;
        if (axisY.invertedAxis)
        {
            coef = -1;
        }
        if (OldTmpAxis.y == 0 && Mathf.Abs(axisY.axisValue) > 0)
        {
            if (axisY.axisValue * coef > 0)
            {
                axisY.axisState = ETCAxis.AxisState.DownUp;
                OnDownUp.Invoke();
            }
            else if (axisY.axisValue * coef < 0)
            {
                axisY.axisState = ETCAxis.AxisState.DownDown;
                OnDownDown.Invoke();
            }
            else
            {
                axisY.axisState = ETCAxis.AxisState.None;
            }
        }
        else if (axisY.axisState != ETCAxis.AxisState.None)
        {
            if (axisY.axisValue * coef > 0)
            {
                axisY.axisState = ETCAxis.AxisState.PressUp;
                OnPressUp.Invoke();
            }
            else if (axisY.axisValue * coef < 0)
            {
                axisY.axisState = ETCAxis.AxisState.PressDown;
                OnPressDown.Invoke();
            }
            else
            {
                axisY.axisState = ETCAxis.AxisState.None;
            }
        }
        #endregion
        tmpAxis = Vector2.zero;
    }