Контроллер на C#, Unity3d. Что я делаю не правильно?

Добрый день!

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

Что я имею:

void OnMouseDown()
    {
        startPoint = Input.mousePosition;
        clicked = true;
        
    }
    void OnMouseUp()
    {
        clicked = false;
    }


При нажатии считываю координату курсора и меняю булевскую переменную
После этого в Update:

if (clicked) {

            endPoint = Input.mousePosition;
            aimPoint = (endPoint - startPoint);

            TheRocket.transform.position = Camera.main.ScreenToWorldPoint(TheRocket.transform.position + aimPoint)/2;
}


В результате этого кода все работает, ракета повторяет движения курсора, но каждый раз, когда я нажимаю на экран, ракета встает в левый нижний угол в одни и те же координаты. Всегда.
Буду очень благодарен за помощь, друзья!
  • Вопрос задан
  • 957 просмотров
Решения вопроса 1
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
TheRocket.transform.position это мировые координаты ракеты. Input.mousePosition это двадэшные координаты в плоскости экрана. Используя Camera.main.ScreenToWorldPoint вы проецируете двадэшные координаты на плоскость перед камерой, расстояние до которой определяется координатой z в передаваемом параметре.
Таким образом, если вы не хотите телепортировать ракету в место нажатия, то высчитывать вам нужно дельту перемещения курсора по сравнению с предыдущим кадром в мировых координатах. Сначала получаете расстояние плоскости ракеты до камеры с помощью Camera.WorldToScreenPoint, потом в каждом кадре переводите курсор в мировые координаты через ScreenToWorldPoint и считаете вектор от предыдущего положения в текущее. Полученный вектор просто плюсуете к положению ракеты.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@GreatRash
Есть мнение. что позиция мыши отдаётся вам в экранных координатах, их для начала нужно преобразовать в мировые координаты, а потом уже с ними работать.

endPoint = Input.mousePosition;
endPoint = Camera.main.ScreenToWorldPoint(endPoint);

А вот позиция ракеты уже в мировых координатах. так что её не нужно запихивать внутрь ScreenToWorldPoint.
Ответ написан
Ваш ответ на вопрос

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

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