| |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Игровой движок Unity 3D. Курс обучения2. Интерфейс программы: Главное меню, Обзор проекта, Иерархия, Сцена, Игровой вид, Инспектор. 3. Простейшая игра: Создаем проект, Создаём игровую сцену, Создаём скрипт. 4. Простейшая игра (2): Возможность стрелять, Как добавить врагов, Контроллер врагов. 5. Простейшая игра (3): Система частиц, Добавление звуков, Создание текста на экране, Публикация. 6. Трехмерный платформер. (в процессе создания) 3. Простейшая игра3.4. Как добавить возможность стрелятьПока главный персонаж может только двигаться. Сейчас добавим ему возможность стрелять. Пули сделаем объектом типа префаб. Каждая отдельная пуля появляется в верхней части космического корабля, летит в том же направлении, куда в данный момент повёрнут корабль, а затем через несколько секунд исчезает, когда выйдет за пределы экрана. 1. Открываем скрипт «PlayerScript». В верхнем разделе, где прописываются переменные, добавляем строчки: // Переменная для лазера 2. Чуть ниже в функции «Update()» кроме строчек «Rotation()» и «Movement()» добавляем код обработки только что добавленных переменных: foreach (KeyCode element in shootButton) В этом кусочке кода мы вначале проверяем нажатую клавишу. Если нажата клавиша, являющаяся клавишей выстрела, то проверяем следующее условие. Если задержка между выстрелами уже прошла (кулдаун истёк), то можем создавать новую пулю. Обновляем кулдаун, выполеняем функцию создания новой пули, выходим из функции, не выполняя последнюю строчку. Если условия не выполняются, то просто уменьшается время кулдауна до следующего выстрела. Всё это происходит постоянно, так как находится внутри функции «Update()». 3. В самом низу скрипта, после всех функций, но до последних закрывающих скобок, расписываем функцию создания пули: // Создание лазера 4. Сохраняем файл скрипта, возвращаемся в окно Юнити. В инспекторе видим новые переменные, которым нам нужно назначить значения по умолчанию. В строчке «Shoot Button» выбираем «Size» = «2». В появившихся строчках выбираем клавиши «Mouse0» (левая кнопка мыши) и «Space» (пробел). 5. Дальше нам нужно создать и добавить изображение для нашей пули. Нарисуем просто ярко-зеленую полоску, изображающую луч лазера. Перетаскиваем созданный файл «laser.png» в зону «Project» в папку «Sprites».
6. Перетаскиваем файл «laser.png» из «Project» на игровую сцену. 7. Создаём новый скрипт специально для объекта «Лазер». Нажимаем правой кнопкой на папке «Scripts», выбираем команду «Create» — «С# Script». Называем новый файл скрипта как «LaserScript». 8. Делаем двойной клик на файле скрипта, переходим в «МоноДевелоп». Изменяем текст скрипта: using UnityEngine; 9. Присоединяем «LaserScript» к объекту «Лазер»: выбираем объект «laser», перетаскиваем скрипт в окно инспектора этого объекта. Создадим для этого объекта физическое тело — свойство «Box Collider», для этого в главном меню выбираем «Component | Physics 2D | Box Collider 2D». По умолчанию «Box Collider» имеет размеры как у изображения объекта, но мы можем это изменить. В разделе «Box Collider» изменяем атрибуты «X = 0.06», «Y = 0.3». Так тело лазера будет чуть толще, чем его изображение, чтобы игроку было легче попадать во врагов. 10. В окне «Project» открываем папку «Assets | Prefabs». Перетаскиваем объект лазера из списка иерархии в папку «Prefabs». Объект выделится синим цветом, в знак того, что он стал префабом. Префаб – это не объект, а некий чертёж объекта, сам он не существует на игровой сцене, но мы можем создавать на сцене множество копий такого объекта-префаба. Очень удобный инструмент для создания множества однотипных объектов, типа выстрелов, врагов, спецэффектов. Любое изменение свойств в префабе будет действовать и на все созданные копий этого префаба, расставленные на игровой сцене. 11. Удаляем объект «Лазер» с игровой сцены. Выделяем объект «playerShip», перетаскиваем префаб лазера в строчку свойства «Laser» в разделе «PlayerScript». (Сайт GamesIsArt.ru) 12. Создаём круговой объект-коллайдер вокруг нашего корабля, выбрав в главном меню «Component | Physics 2D | Circle Collider 2D». Меняем радиус на «0.4». Сделали мы это для того, чтобы игра просчитывала столкновения нашего корабля с другими объектами. Делаем радиус физического тела чуть меньше изображения корабля. 13. Запускаем игру, проверяем, работает ли наш скрипт для стрельбы. По нажатию клавиши «пробел» или «левая кнопка мыши», корабль должен выпускать лазеры в ту сторону, кода указывает курсор мыши. Выходим из режима тестового запуска игры. 3.5. Как добавить враговТеперь нам нужно создать вражеских персонажей, чтобы было с кем сражаться и в кого стрелять.
1. В окне проекта в папку «Sprites» добавляем спрайт «enemy.png». 2. Перетаскиваем этот спрайт на игровую сцену, чтобы создать объект. 3. В папке «Scripts» создаём новый скрипт (кликаем на кнопку «Create», выбираем «C# Script»), называем его «MoveTowardsPlayer». Переходим в «MonoDevelop», чтобы прописать текст скрипта: using UnityEngine; В этом скрипте мы вначале игры находим объект «Корабль» и записываем его в переменную «player». Затем, в каждый момент игры скрипт: считывает новое положение корабля, вычисляет разницу между вражеским объектом и кораблём, сохраняет её в переменной «delta»; выставляет скорость врага так, чтобы он двигался в направлении корабля. 4. Перетаскиваем созданный скрипт в свойства вражеского объекта. 5. Создаём в свойствах вражеского объекта новый компонент: в главном меню выбираем «Component | Physics 2D | Circle Collider 2D». В его свойствах в строчке «Radius» ставим «0.350». 6. Запускаем игру для проверки. Вражеский объект постоянно двигается в нашу сторону. Скорость у него немного меньше, чем у нас, но если он нас догонит, то попадёт под наш спрайт и будет двигаться вместе с нами. Нужно дорабатывать это. Теперь создадим скрипт, чтобы во врага можно было стрелять и уничтожать его. 7. В папке «Scripts» кликаем на кнопку «Create», выбираем «C# Script», называем новый скрипт «EnemyScript». Переходим в «MonoDevelop», пишем: using UnityEngine; 8. Сохраняем скрипт, возвращаемся в окно Юнити. Присоединяем скрипт «EnemyScript» к вражескому объекту. 9. Для того чтобы происходило событие «коллизия» (столкновение объектов), нам нужно создать для врага физическое тело. В компонентах добавляем «Component | Physics 2D | Rigidbody 2D». В этом компоненте изменяем свойство «Gravity Scale» на значение «0» (это чтобы на врага не действовала гравитация, иначе он постоянно будет падать вниз). 10. Включаем игру для тестирования. Уничтожаем врага с двух точных выстрелов. К тому же, если не убивать врага, видим, что теперь он не может зайти под нас, враг сталкивается с нашим кораблём, как настоящее физическое тело. 3.6. Контроллер для создания волн враговМы создали всю базовую механику для игры. Теперь создадим систему событий, которая будет определять, что будет происходить в игре. Такой игровой скрипт-контроллер будет запускать игру, создавать волны врагов, отображать игровые очки, и завершать игру, когда закончатся жизни. 1. Создаём пустой игровой объект: в главном меню выбираем «GameObject | Create Empty». Называем объект «GameController». В его свойствах ставим «Position» = (0, 0, 0). Под именем находим строчку «Tag», по умолчанию там стоит значение «Untagged», заменяем его на «GameController» («Tag» — это способ объединить несколько объектов в группу). 2. В свойствах объекта создаём новый скрипт «Add Component | New Script», выбираем язык «CSharp», называем скрипт «GameController». Нажимаем кнопки «Create» и «Add». (Это ещё один из способов создания файлов скриптов, но при этом нас скрипт появился в корневой папке «Assets», перетаскиваем его в папку «Scripts»). 3. Выбираем только что созданный скрипт «GameController» в папке «Assets\Scripts». Переходим в «MonoDevelop» для редактирования текста скрипта. В разделе описания переменных добавляем следующие строчки: // Создание переменной «враг» 4. Теперь нам нужно поместить в созданную переменную объект «enemy». Но сначала единичный экземпляр объекта превратим в префаб: перетаскиваем объект «enemy» из иерархии в раздел «Проект» в папку «Prefabs». Удаляем объект «enemy» с игровой сцены. Перетаскиваем созданный префаб в переменную «enemy» в свойствах скрипта. 5. Возвращаемся к редактированию скрипта «GameController». Создаём переменные, которые нам понадобятся: // Временные промежутки между событиями, кол-во врагов 6. Теперь создадим функцию для создания новых врагов, назовём её SpawnEnemies. Нам нужно сделать так, чтобы враги появлялись не все сразу, а волнами по 10 штук. Внутри функции «Start» пишем строчку: StartCoroutine (SpawnEnemies()); Функция Coroutine приостанавливает или продолжает выполнение действий, срабатывающих через какой-то промежуток времени. В данном случае мы запускаем счетчик для выполнения функции «SpawnEnemies». 7. Ниже (после функции Update, но до последней закрывающей скобки) прописываем саму функцию создания врага: // Появление волн врагов 8. Теперь пропишем, что будет происходить, когда мы будем уничтожать врага. Для этого нам понадобится изменять переменную «currentNumberOfEnemies», но это внутренняя переменная, и она может быть изменена только внутри класса «GameController». Создадим новую функцию в классе «GameController»: // Процедура уменьшения количества врагов в переменной 9. Редактируем скрипт «EnemyScript». Внутри функции «onCollisionEnter2D» после функции уничтожения врага «Destroy (this.gameObject)» добавляем пару строчек: GameController controller = GameObject.FindGameObjectWithTag ("GameController").GetComponent("GameController") as GameController; Здесь мы в скрипте «EnemyScript» находим, а затем обращаемся к другому скрипту — «GameController», в нём мы запускаем процедуру, которая уменьшит переменную «количество живых врагов». Это наглядный пример, как скрипты могут обращаться к друг другу, и даже изменять внутренние переменные в других объектах. 10. Сохраняем оба скрипта, сохраняем игровую сцену, запускаем игру. Теперь на нас постепенно будут нападать 10 врагов, а когда мы уничтожим их, появится следующая группа врагов. Вот это уже более похоже на настоящую игру.
|
Прохождение игрПартнерские ссылкиКупить казуальные игры Футболки с надписями из игр Как сделать уникальный подарок | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|