May 30, 2019

Создание 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.

По всем вопросам жду вас в ЛС.