Создание 2D платформера. Рука с оружием, стреляющая по направлению мыши.
Запускаем юнити, если у вас уже есть линейная стрельба, то всё будет просто. Если нет - прошу обратить внимание на предыдущий гайд https://teletype.in/@gamedevdiary/ByC54-OaV
Помните у нас был объект, который спавнит пули? теперь его нужно чуть чуть подвинуть.
Вы видите спрайт из моего другого проекта, очень секретного =D У него как-раз удобно вращается орудие, поэтому я его выбрал в пример!
Создаем отдельный объект, называем его gun, точка рождения у меня называется dulo (дуло =D )
После чего крепим точку спавна уже к новому объекту, который представляет нашу руку или турель, как у меня. Получаем gun внутри которого есть dulo. Зачем? чтобы точка спавна следовала за стволом орудия, Иначе смысла делать эту руку не было.
Добавляем объекту с оружием sprite renderer и выбираем спрайт, например, той же руки. (у меня турель.)
После чего открываем наш спрайт в проекте через sprite editor
Видите синий кружок? Это ось поворота вашего объекта. Перетяните её в нужное место, вокруг которого будет вращаться рука. У меня это, например, центр диска. После чего совмещаем руку с телом в ножном месте.
Вот так! Открываем скрипт стрельбы, закрепленный за персонажем и добавляем эти строки:
//в переменные
public Transform zRotate; // объект для вращения по оси Z
// ограничение вращения
public float minAngle = 0;
public float maxAngle = 360;
//после них новый войд
void SetRotation()
{
Vector3 mousePosMain = Input.mousePosition; // считываем позицию мыши
mousePosMain.z = Camera.main.transform.position.z; // совмещаем слой камеры со слоем мыши, чтобы вращение отображалось корректно
Vector3 lookPos = Camera.main.ScreenToWorldPoint(mousePosMain); // задаем позицию мыши переменной
lookPos = lookPos - transform.position; // здесь и далее путем геометрических вычислений находим угол поворота для орудия
float angle = Mathf.Atan2(lookPos.y, lookPos.x) * Mathf.Rad2Deg;
angle = Mathf.Clamp(angle, minAngle, maxAngle);
zRotate.rotation = Quaternion.AngleAxis(angle, Vector3.forward); // задаем поворот
}
//в fixedupdate после всех логическиз выражений добавляем
if(zRotate) SetRotation();
Прямо как на скрине.
После чего создаем еще скрипт guncontroll. Он нужен, чтобы орудие не отвалилось от вашего тела.
Вставляем эти строки
public Transform playertransform;
private Transform guntransform;
void Start()
{
guntransform = GetComponent <Transform> (); // подгружаем трансформ орудия
}
void Update()
{
guntransform.position = playertransform.position; // уравниваем позицию игрока и орудия
}
Выбираем орудие и в поле playertransform перетягиваем объект игрока.
Выбираем игрока и в поле z rotate перетягиваем наше орудие.
Как вы можете видеть, орудие отлично вращается. Чтобы ограничить углы вращения, поиграйтесь со значениями min angle и max angle.
По всем вопросам жду вас в ЛС.