#c# #unity3d
Вопрос:
Я работаю над 2D-игрой сверху вниз. Игрок должен уметь стрелять стрелами, поэтому внутри сборного плеера у меня есть пустой объект для прицела и перекрестия (рисунок 3). У меня есть сценарий для перекрестия, который следует за положением мыши. У меня есть пустой объект, который является дочерним компонентом проигрывателя под названием FirePoint. Все, для чего это нужно, — это расположение экземпляра сборного модуля со стрелкой.
ПРОБЛЕМА: Этот объект с огневой точкой, похоже, вращается в зависимости от положения в мире. Обратите внимание на рисунок 1. символ находится в нижней левой области, красная ось должна быть направлена вверх и вправо от курсора, но вместо этого указывает вниз и влево. Затем на рисунке 2 его нижний правый угол. Та же проблема для верхней правой/левой части карты. Мне нужно, чтобы эта огневая точка не вращалась в зависимости от положения в мире.
Если символ равен 0,0, он работает просто отлично. Но как только я перемещу позиции, огневая точка будет вращаться в зависимости от положения в мире, а затем испортит мою стрельбу.
Как мне предотвратить все вращения, так как у меня есть скрипт для отслеживания курсора? Почему он вращается в зависимости от мирового положения? Почему пустой объект вращается в зависимости от положения в мире?
void Update()
{
Vector2 mouseCursorPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
transform.position = mouseCursorPos;
angle = Mathf.Atan2(mouseCursorPos.y, mouseCursorPos.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle));
}
Комментарии:
1. Чтобы просто определить направление, не можете ли вы просто взять точку нажатия и позицию игрока, вычесть их и нормализовать? Это даст вам вектор направления, указывающий на местоположение, которое было нажато, независимо от любых других углов/положений.
2. Как справедливо сказано в приведенном выше комментарии @TEEBQNE, так и должно быть, поскольку дочерние преобразования обязательно будут вращаться вместе с родительским преобразованием. Более того, было бы разумно зафиксировать ссылку
Camera.main
на некоторую локальную переменную вместо того, чтобы вызывать ее вUpdate
методе.