Учим наш куб стрелять

Всем доброго времени суток, сегодня я продолжаю изучать разработку компьютерных игр, и буду делать игру где будет ездить нечто вроде танка, точнее это будет просто куб с дулом. Его я сделал в 3D редакторе Blender и импортировал в Unity3d. Как импортировать из Blender в Unity так чтобы не было проблем с направлениями из-за разницы в системах координат, я писал ранее. Можно было бы конечно как и описано в видеоуроке по которому я учусь обойтись без посторонних моделей, а сделать просто соединив два куба, но мне так больше понравилось.

 

Итак берем наш импортированный из Blender3d наш «Танк» и стараемся заставить его стрелять. Что нам для этого необходимо? Практически тоже что я делал в уроках которые выполнял ранее, разве что несколько к этому придется добавить.

 

Для начала перетягиваем наш танк на сцену и в него перетягиваем камеру.

 

Теперь нам необходимо добавить на сцену GameObject, то бишь просто пустой игровой объект. GameObject так же как и камеру перетаскиваем на наш «танк».

Добавление танка на сцену
Dante

 

Для этого жмем GameObject>Create Empty и на сцену добавляется GameObject. Его нам необходимо расположить прямо перед стволом, при добавлении не забываем что мы находимся в трехмерном пространстве, и GameObject должен находится именно перед стволом нашего танка, а не ниже либо выше его, это место где будут появляться наши пули.

Вид сверху расположения GameObject
Dante

 

GameObject расположение сбоку
Dante

 

Затем нам необходимо сделать Префаб пули. Как сделать префаб я писал ранее. Для самой пули я использовал просто сферу, которой задал размеры Scale X=0.2 Y=0.2 Z=0.2, позиция здесь не важная. Она будет задаваться скриптом.

 

Так же нам будет необходим прицел. Его можно просто сделать в любом графическом редакторе, графический редактор я использую обычно Gimp, для меня его пока хватало для всего что бы я не делал. Вы можете пользоваться тем который вам удобней. Размеры прицела я сделал 32*32. Куда этот прицел я прикрепил я скажу несколько ниже.

 

Теперь нам необходимо два скрипта, это скрипт выстрела и скрипт пули. Для начала давайте создадим скрипт выстрела я его назвал Shooting. Как создать скрипт в Unity3d я писал ранее. В этом скрипте пишем вот такой код:

Пример скрипта выстрела
Dante

 

Давайте разберем что мы в нем написали. В начале вы объявили префаб нашей пули public GameObject bulletPref, этот префаб необходимо будет объявить после того как скрипт будет прицеплен к нашему GameObject. Как дойду опишу. Затем public GUIStyle targetStyle это стиль нашего прицела. Это именно то изображение прицела которое мы создали в Gimp. Его так же необходимо будет прикрепить к скрипту, но о этом так же когда дойду. Следующая строка это private byte curTime=0 это текущее время, оно нам необходимо для перезарядки нашего орудия, то есть это время от которого производится отчет до следующего выстрела. Далее private byte rechargeTime=10 это время через которое происходит перезарядка и следующий выстрел. Чем оно больше тем реже будут выстрелы. Затем идет функция Update, это я объяснял в прошлых уроках и в ней мы каждый кадр будем проверять если наше текущее время больше нуля if(curTime>0) то мы вычитаем из нашего текущего времени единицу curTime—, иначе else мы проверяем нажата ли кнопка на мышке if (Input.GetMouseButton(0)) и если она нажата наш «Танк» стреляет CreateBullet(), то есть вызывается функция CreateBullet которую мы видим ниже и текущее время приравнивается времени перезарядки curTime=rechargeTime. Ниже по скрипту мы создаем функцию void OnGUI эта функция отвечает за двухмерные объекты на сцене, я о ней писал ранее, и в ней мы создаем сам прицел. В ней GUI.Box означает картинку к ней мы обращаемся дальше, new Rect означает квадратик который мы задаем Screen.width/2-10 этим делим экран на пополам и вычитаем десять то есть смещаем наполовину от полной длинны 20ть, а Screen.height*197/400 это надо самому подгонять, это делается чтобы патрон попадал четко в центр прицела. В полезных советах по Unity3d я писал об отображении 2D элементов и как это наладить. Короче лучше посмотрите по ссылке выше. Затем двойные кавычки в них ничего не пишем, а targetStyle позволит нам затем загрузить наше изображение прицела. Ниже мы создаем функцию private void CreateBullet() она у нас вызывается выше по скрипту когда создается пуля, что же она делает. В ней мы создаем новую переменную Vector3 pos и ей мы передаем позицию нашего GameObject, который находится у нас на стволе. Затем мы создаем объект GameObject bullet и приравниваем его Instantiate в котором указываем название нашего префаб bulletPref, позицию pos, и Quaternion.identity то есть не будет вращения ну и дальше создаем это как as GameObject. Далее мы создаем класс Bullet, о классах я писал раньше, и создаем bulletCS и приравниваем его bullet.GetComponent<Bullet>, то есть мы берем наш объект который мы создали bullet и получаем компонент Bullet GetComponent<Bullet>. Этот компонент будет одним из компонентов нашего префаба пули. И в полученном компоненте находим переменную dir это задано при помощи bulletCS.dir и приравниваем ей движение вперед transform.forward. Причем здесь transform.forward это глобальное направление нашего GameObject. Надеюсь относительно понятно, хоть как по мне понять можно только выполнив что написано. По крайней мере я понял только как до конца доделал. Дальше нам необходимо сделать скрипт который будет вешаться непосредственно на саму пулю то лишь на наш префаб пули. Создаем скрипт Bullet:

Пример скрипта пули
Dante

 

В нем сначала задаем переменную public Vector3 dir и приравниваем её просто новому пустому вектору new Vector3(0,0,0). Потом задаем время существования пули private byte timeOfLive=100, то есть через это время пуля исчезнет. Если его не задать то она будет лететь пока у вас все не повиснет от количества пуль одновременно существующих. Задаем текущее время private byte curTime. Затем в функции Update вызываем функцию MovingBullet которая написана ниже в скрипте. Теперь мы проверяем сколько нашей пуле осталось существовать, берем текущее время и оно должно быть меньше времени существования if(curTime<timeOfLive) и если оно меньше прибавляем единицу curTime++, иначе мы её уничтожаем else Destroy (this.gameObject), где this обозначает что обращение идет непосредственно к этому скрипту, а именно к gameObject этого скрипта. Теперь у нас идет сама функция private void MovingBullet() которая просто изменяет позицию по направлению нашего дула. Куда направлено дуло туда и летит пуля. Так мы создали скрипт пули и выстрела, осталось все повесить по своим местам.

 

Теперь на «танк» цепляем скрипт нашего движения танка напомню это скрипт Moving, о нем я говорил в прошлом уроке который делал. Затем на GameObject который мы перетащили на «Танк» перетаскиваем скрипт Shooting, и в нем объявляем наш префаб пули,

Объявление для префаба пули
Dante

 

Теперь нам необходимо добавить прицел, прикрепим его к скрипту Shooting>Target Style>Normal>Background. Прицел создан в формате PNG, так как мне необходимо чтобы видно было только линии прицела, а фон необходим прозрачным.

Цепляем прицел
Dante

 

И крайнее что необходимо сделать это перетянуть скрипт Bullet на префаб нашей пули, то бишь на bulletPref.

 

Запускаем нашу игру и смотрим что наш новоявленный «Танк» способен двигаться и стрелять.

 

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *