Задать вопрос
@nano_e_t_4

Как определить что игрок двигается в сторону объекта?

Всем привет
Подскажите пожалуйста, кто знает, как мне определить, двигается ли игрок в сторону курсора или двигается в противоположную от него сторону (положение курсора постоянно меняется, игроку задается вектор движения с клавиатуры)
Нужно для того, чтобы при движении в сторону курсора отрабатывала одна анимация, в противоположную - другая
  • Вопрос задан
  • 223 просмотра
Подписаться 1 Простой 8 комментариев
Пригласить эксперта
Ответы на вопрос 2
Zoominger
@Zoominger
System Integrator
1. Определить положение курсора и положение игрока в момент времени X и найти длину вектора по этим точкам;
2. Определить положение курсора и игрока в момент X+n и тоже найти длину вектора;
3. Сравнить длины векторов. Если второе меньше - движется к курсору, если больше - уходит;
4. Плюнуть в лицо тем, кто говорит, что программисту не нужна математика.
Ответ написан
kreo_OL
@kreo_OL
Медузко -_-
Рональд Макдональд Все верно расписал, ну а раз это тема по юнити, то куда же без готового кода xD
private GameObject player;
        private float oldSqrMagnitude;
        private Camera camera => Camera.main;

        private void Update()
        {
            var newSqrMagnitude = (player.transform.position - camera.ScreenToWorldPoint(Input.mousePosition)).sqrMagnitude;
            if (newSqrMagnitude > oldSqrMagnitude)
            {
                Debug.Log("дальше");
            }
            else if (newSqrMagnitude < oldSqrMagnitude)
            {
                Debug.Log("ближе");
            }
            else
            {
                Debug.Log("стоит");
            }

            oldSqrMagnitude = newSqrMagnitude;
        }


Однако учтите что тут будет реагировать даже если персонаж стоит на месте, а двигается только мышь.
Добавить проверки чтобы учитывалось только при движение персонажа думаю не сложно)

Если для ваших целей этот код будет не так точен, то заменить .sqrMagnitude на .magnitude

Так же я бы рекомендовал это считать реже чем каждый кадр) Для этого можно использовать FIxedUpdate, либо корутину. В идеале бы это считать только при изменение положения мыши\персонажа ;)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы