Exemple #1
0
    void Awake()
    {
        if (viewportCamera == null)
        {
            Debug.LogError("ViewportCamera is not set!");
            return;
        }

        if (viewportCamera == null)
        {
            Debug.LogError("Rotary GameObject is not set!");
            return;
        }

        instance = this;

        rotaryCollider = rotaryObject.GetComponent <Collider>();
        rotaryTrans    = rotaryObject.GetComponent <Transform>();

        originalOrientation = rotaryTrans.rotation;

        state = RotaryState.rollback;
    }
Exemple #2
0
    void Update()
    {
        inputCenterPoint = viewportCamera.WorldToScreenPoint(rotaryTrans.position);
        Vector2 inputPos          = Input.mousePosition;
        float   currentInputAngle = CalculateRotationAtPoint(inputPos);

        if (Input.GetMouseButtonDown(0) && state == RotaryState.rest)
        {
            // Start new rotation if hits

            Ray        clickRay = viewportCamera.ScreenPointToRay(inputPos);
            RaycastHit rayHit;
            if (rotaryCollider.Raycast(clickRay, out rayHit, 10000f))
            {
                // Start selecting
                rotateStart = currentInputAngle;
                state       = RotaryState.selecting;

                if (event_rotaryStart != null)
                {
                    event_rotaryStart();
                }
            }
        }

        if (state == RotaryState.selecting)
        {
            float newDelta = currentInputAngle - rotateStart;

            if (newDelta > rotaryDelta && newDelta - rotaryDelta < 0.25f)
            {
                rotaryDelta = currentInputAngle - rotateStart;

                // Prevent going over end
                if (rotaryDelta + rotateStart > rotaryRangeEnd)
                {
                    rotaryDelta = rotaryRangeEnd - rotateStart;
                }
            }
        }

        if (Input.GetMouseButtonUp(0) && state == RotaryState.selecting)
        {
            // Stop selecting

            // Check if the rotation is inside the number selection range

            rotaryReleaseDelta = rotaryDelta;
            rotateReleaseTime  = Time.time;
            state = RotaryState.rollback;

            int   rotaryOutputValue     = -1;
            float numberRangeNormalized = (rotaryDelta - rotaryRangeNumbersBegin) / (rotaryRangeNumbersEnd - rotaryRangeNumbersBegin);
            rotaryOutputValue = (int)(numberRangeNormalized * rotaryDivision) + 1;

            if (rotaryOutputValue < 0 || rotaryOutputValue > rotaryDivision || rotaryReleaseDelta < rotaryRangeNumbersBegin || rotaryReleaseDelta > rotaryRangeNumbersEnd)
            {
                rotaryOutputValue = -1;
            }
            else if (rotaryOutputValue == rotaryDivision)
            {
                rotaryOutputValue = 0;
            }

            //Debug.Log("Rotaty released. releaseDelta: " + rotaryReleaseDelta + " norm: " + numberRangeNormalized + " Output value: " + rotaryOutputValue);
            // Debug.Log("Phone dial released! Output: " + rotaryOutputValue);

            if (event_rotaryRelease != null)
            {
                event_rotaryRelease(rotaryOutputValue);
            }
        }

        if (state == RotaryState.rollback)
        {
            if (rotaryDelta > 0f)
            {
                rotaryDelta = (Time.time - rotateReleaseTime) * (-rollbackSpeed) + rotaryReleaseDelta;
            }
            else
            {
                rotaryDelta = 0f;

                state = RotaryState.rest;

                if (event_rotaryEnd != null)
                {
                    event_rotaryEnd();
                }
            }
        }

        // Update visualization
        if (state == RotaryState.selecting || state == RotaryState.rollback)
        {
            rotaryTrans.rotation = Quaternion.AngleAxis((rotaryDelta + rotaryRangeBegin) * 360f, originalOrientation * Vector3.up) * originalOrientation;
        }
    }
    void Awake()
    {
        if (viewportCamera == null) {
            Debug.LogError("ViewportCamera is not set!");
            return;
        }

        if (viewportCamera == null) {
            Debug.LogError("Rotary GameObject is not set!");
            return;
        }

        instance = this;

        rotaryCollider = rotaryObject.GetComponent<Collider>();
        rotaryTrans = rotaryObject.GetComponent<Transform>();

        originalOrientation = rotaryTrans.rotation;

        state = RotaryState.rollback;
    }
    void Update()
    {
        inputCenterPoint = viewportCamera.WorldToScreenPoint(rotaryTrans.position);
        Vector2 inputPos = Input.mousePosition;
        float currentInputAngle = CalculateRotationAtPoint(inputPos);

        if (Input.GetMouseButtonDown(0) && state == RotaryState.rest) {
            // Start new rotation if hits

            Ray clickRay = viewportCamera.ScreenPointToRay(inputPos);
            RaycastHit rayHit;
            if (rotaryCollider.Raycast(clickRay, out rayHit, 10000f)) {
                // Start selecting
                rotateStart = currentInputAngle;
                state = RotaryState.selecting;

                if (event_rotaryStart != null) {
                    event_rotaryStart();
                }
            }
        }

        if (state == RotaryState.selecting) {
            float newDelta = currentInputAngle - rotateStart;

            if (newDelta > rotaryDelta && newDelta - rotaryDelta < 0.25f) {
                rotaryDelta = currentInputAngle - rotateStart;

                // Prevent going over end
                if (rotaryDelta + rotateStart > rotaryRangeEnd) {
                    rotaryDelta = rotaryRangeEnd - rotateStart;
                }
            }
        }

        if (Input.GetMouseButtonUp(0) && state == RotaryState.selecting) {
            // Stop selecting

            // Check if the rotation is inside the number selection range

            rotaryReleaseDelta = rotaryDelta;
            rotateReleaseTime = Time.time;
            state = RotaryState.rollback;

            int rotaryOutputValue = -1;
            float numberRangeNormalized = (rotaryDelta - rotaryRangeNumbersBegin) / (rotaryRangeNumbersEnd - rotaryRangeNumbersBegin);
            rotaryOutputValue = (int)(numberRangeNormalized * rotaryDivision) + 1;

            if (rotaryOutputValue < 0 || rotaryOutputValue > rotaryDivision || rotaryReleaseDelta < rotaryRangeNumbersBegin || rotaryReleaseDelta > rotaryRangeNumbersEnd) {
                rotaryOutputValue = -1;
            } else if (rotaryOutputValue == rotaryDivision) {
                rotaryOutputValue = 0;
            }

            //Debug.Log("Rotaty released. releaseDelta: " + rotaryReleaseDelta + " norm: " + numberRangeNormalized + " Output value: " + rotaryOutputValue);
            // Debug.Log("Phone dial released! Output: " + rotaryOutputValue);

            if (event_rotaryRelease != null) {
                event_rotaryRelease(rotaryOutputValue);
            }
        }

        if (state == RotaryState.rollback) {
            if (rotaryDelta > 0f) {
                rotaryDelta = (Time.time - rotateReleaseTime) * (-rollbackSpeed) + rotaryReleaseDelta;

            } else {
                rotaryDelta = 0f;

                state = RotaryState.rest;

                if (event_rotaryEnd != null) {
                    event_rotaryEnd();
                }
            }
        }

        // Update visualization
        if (state == RotaryState.selecting || state == RotaryState.rollback) {
            rotaryTrans.rotation = Quaternion.AngleAxis((rotaryDelta + rotaryRangeBegin) * 360f, originalOrientation * Vector3.up) * originalOrientation;
        }
    }