Фазы касания экрана в Unity

72
06 октября 2021, 18:50

Rigidbody2D rb;
public float speed = 1f;
Vector2 curPos;
void Update () {
    curPos = transform.position;
}
void Awake () {
    rb = GetComponent<Rigidbody2D>();
}
void FixedUpdate () {
    if (Input.touchCount > 0) {
        Touch touch = Input.GetTouch(0);
        Vector2 touchedPos = Camera.main.ScreenToWorldPoint(new Vector2(touch.position.x, touch.position.y));
        switch (touch.phase) {
            case TouchPhase.Began:
            transform.position = Vector3.Lerp(transform.position, touchedPos, Time.fixedDeltaTime);
            break;
            case TouchPhase.Moved:
            transform.position = Vector3.Lerp(transform.position, touchedPos, Time.fixedDeltaTime);
            break;
            case TouchPhase.Ended:
            if (curPos != touchedPos) {
                transform.position = Vector3.Lerp(transform.position, touchedPos, Time.fixedDeltaTime);
            } break;
        }
    }
}

Не могу понять в чем ошибка кода. Если я правильно понимаю логику работы TouchPhase то в момент окончания нажатия на экран проверяется условие равно ли текуще положение объекта точки касания. Если нет, то объект продолжает двигаться (ну по крайней мере должен). В итоге после того как я отпускаю палец, обьект перестает двигаться. Что я делаю не так?

Answer 1

Объект у вас двигается только при двух условиях. 1 момент касания. 2 палец двигается. И всё. Так-же сравнивать положение объекта и положение касания это безумие, они никогда не будут идеально соответствовать до целых и уж тем более до стотысячных долей. Зачем вам Rigidbody2D, если вы забив на физику перемещаете координаты объекта сами?

Да и вообще если объект следует за местом, где был тач, нет смысла проверять коснулся ли ты объекта, поскольку тем самым ты задаёшь ему новую позицию следования.

public float speed = 100f;
Vector2 targetPos;
void Update () {
    if (Input.touchCount > 0) {
        Touch touch = Input.GetTouch(0);
        Vector2 touchedPos = Camera.main.ScreenToWorldPoint(new Vector2(touch.position.x, touch.position.y));
        targetPos = touchedPos;
    }
    if (targetPos != Vector2.zero) {
        Vector2 MoveVector = targetPos-(Vector2)transform.position;
        if (MoveVector.magnitude < speed*Time.deltaTime) {
            transform.position = targetPos;
            GetComponent<Rigidbody2D>().velocity = Vector3.zero;
        } else {
            GetComponent<Rigidbody2D>().velocity = MoveVector.normalized*speed;
        }
    }
}
READ ALSO
Для чего здесь обрезается строка?

Для чего здесь обрезается строка?

Только не ругайтесь, пожалуйстаЯ изучаю чужой код и некоторые моменты не понимаю

102
MVC, проблема с выводом html

MVC, проблема с выводом html

Создал простое приложение mvc, в представлении (вьюхе) есть главный шаблон примерно такой:

103
Разветвление для чат-бота (ключевое слово-ответ)

Разветвление для чат-бота (ключевое слово-ответ)

Я хочу сделать чат-бота по типа: ключевое слово-ответЯ понимаю, как его реализовать, но структуризация вводит меня в ступор

220
Почему если указать data_seek один раз, то в следующий раз данные выведутся из другой строки?

Почему если указать data_seek один раз, то в следующий раз данные выведутся из другой строки?

У меня есть таблица, которая имеет столбцы number и balanceЯ хочу вывести данные, хранящиеся в них на страницу

170