Как перевести вращающийся скрипт на основе перетаскивания мышью, чтобы использовать сенсорный ввод? - PullRequest
0 голосов
/ 25 июня 2019

У меня есть скрипт, который я использую внутри редактора для вращения спрайта, и я хочу перевести этот скрипт, чтобы использовать сенсорный ввод вместо мыши.

У меня есть следующий скрипт, который я использую длявращать спрайт в моей игре на основе перетаскивания мышью.У меня нет опыта работы с сенсорным вводом, поэтому я попробовал кое-что, что я видел в другом коде с использованием сенсорных входов.По сути, я изменил оператор if: с

if (Input.GetMouseButtonDown(0))
        {
            deltaRotation = 0f;
            previousRotation = angleBetweenPoints(transform.position, Camera.main.ScreenToWorldPoint(Input.mousePosition));
        }

на:

if (Input.touchCount > 0)
        {
            Touch touch = Input.GetTouch(0);

            if (touch.phase == TouchPhase.Moved)
            {
                deltaRotation = 0f;
                previousRotation = angleBetweenPoints(transform.position, Camera.main.ScreenToWorldPoint(Input.mousePosition));
            }
        }

Сейчас это мой код, который я использую для вращения моего спрайта с помощью мыши:

void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            deltaRotation = 0f;
            previousRotation = angleBetweenPoints(transform.position, Camera.main.ScreenToWorldPoint(Input.mousePosition));
        }
        else if (Input.GetMouseButton(0))
        {
            currentRotation = angleBetweenPoints(transform.position, Camera.main.ScreenToWorldPoint(Input.mousePosition));
            deltaRotation = Mathf.DeltaAngle(currentRotation, previousRotation);
            if (Mathf.Abs(deltaRotation) > deltaLimit)
            {
                deltaRotation = deltaLimit * Mathf.Sign(deltaRotation);
            }
            previousRotation = currentRotation;
            transform.Rotate(Vector3.back * Time.deltaTime, deltaRotation);
        }
        else
        {
            transform.Rotate(Vector3.back * Time.deltaTime, deltaRotation);
            deltaRotation = Mathf.Lerp(deltaRotation, 0, deltaReduce * Time.deltaTime);
        }

    }

1 Ответ

0 голосов
/ 25 июня 2019

Ваш оператор if/else использует больше эквивалентных условий, чем просто TouchPhase.Moved.

Похоже, эквивалентные TouchPhases являются следующими.

TouchPhase.Began вместо Input.GetMouseButtonDown(0)

TouchPhase.Moved вместо Input.GetMouseButton(0)

TouchPhase.Ended вместо финального else

PS: дал такой же ответ на UnityAnswers

Итак, это может выглядеть так:

void Update()
{
    if (Input.touchCount > 0)
    {
        Touch touch = Input.GetTouch(0);

        if (touch.phase == TouchPhase.Began)
        {
            deltaRotation = 0f;
            previousRotation = angleBetweenPoints(transform.position, Camera.main.ScreenToWorldPoint(Input.mousePosition));
        }
        else if (touch.phase == TouchPhase.Moved)
        {
            currentRotation = angleBetweenPoints(transform.position, Camera.main.ScreenToWorldPoint(Input.mousePosition));
            deltaRotation = Mathf.DeltaAngle(currentRotation, previousRotation);
            if (Mathf.Abs(deltaRotation) > deltaLimit)
            {
                deltaRotation = deltaLimit * Mathf.Sign(deltaRotation);
            }
            previousRotation = currentRotation;
            transform.Rotate(Vector3.back * Time.deltaTime, deltaRotation);
        }
        else if (touch.phase == TouchPhase.Ended)
        {
            transform.Rotate(Vector3.back * Time.deltaTime, deltaRotation);
            deltaRotation = Mathf.Lerp(deltaRotation, 0, deltaReduce * Time.deltaTime);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...