Перейти к содержанию

Архитектура Unity3D


Рекомендуемые сообщения

post-3-0-03889000-1410516172_thumb.png

Общую информацию по движку в качестве введения можно получить из Википедии. Предлагаю найти и почитать. Знакомство будет начато с теории - архитектурой игрового движка и немного практики. Все будет компактно и более менее понятно на мой взгляд.


Архитектура игрового движка Unity3d и базовые функции

Кратко по пунктам о самом основном, что поможет сделать читы на высоком уровне, не влезая в дебри кода и оладчик. Только тут C#, а у него свои особенности


1. Игра состоит из сцен. Представляют собой файлы со значком Unity (мелкий или большой), которые можно найти в окне Проекта.

2. Сцены состоят из GameObject-ов, которых можно увидеть загрузив сцену в окне иерархии объектов
post-3-0-35807000-1410511128_thumb.png

Далее разбирать мы будем три ветви наследования классов

GameObject->Object (контейнер)
MonoBehaviour -> Behaviour -> Component-> Object (пользовательский скриптец)
Transfrom -> Component-> Object

Если выделить GameObject в окне иерархии объектов, то в Инспекторе появятся компонент или компоненты связанные с этим объектом.


3. GameObject это контейнеры для Component. Компоненты могут цепляться как на игровые объекты вручную мышкой так и программно. Все что наследуется от Component, то можно таскать мышкой на объекты в окне Инспектора

GameObject и Component это не такие уж сложные классы.

4. Скрипты, которые можно писать для игровых объектов могут наследоваться от MonoBehaviour

Пример скрипта создающего 1 стандартный объект Куб и его 10 клонов:

Класс MonoBehaviour это наследник от Behaviour, а Behaviour наследник от Component

Скрипты можно как и в случае с компонентами перетаскивать на объект мышкой или программным способом. Именно скрипты задают поведение игрового объекта или объектов.


5. Объекты и скрипты могут быть включены и выключены вручную в Инспекторе, так и программно.


6. Объекты могут содержать вложенные объекты. Родителя или дочерний объект можно найти через класс Transfrom (наследуется от Component)


7. Только активные(включенные) объекты можно найти через класс GameObject по имени объекта, типу и тегу. Тег это строковая переменная, пользовательская.


8. Объекты и компоненты можно создавать и разрушать.

Создание объектов происходит через оператор new, функции Instantiate, CreatePrimitive. Объект создаётся без родителя. Чтобы указать родителя можно воспользоваться классом Transform.parent.

Компонент создается через new, а связывается с объектом через GameObject.AddComponent

Удаляются объекты и компоненты через унаследованную функцию Object.Destroy().



Что можно сделать по информации выше?

1. Можем найти все включенные объекты. Отобразить их как TreeView иерархию (кто родитель, а кто ребенок) Включать и выключать объекты, а также их компоненты. Программно получить список функций MonoBehavior, а также полей и свойств. На C# это довольно просто делается, если знать C#.

2. После разведки конкретных имен объектов, компонентов, свойств, функций можно спланировать создание читов через поиск объектов, редактирование параметров или вызов функций.

3. Приступая к реализации, тут уже чуть посложнее. Мы должны написать свой модуль dll и подгрузить его в игру создавая пустой игровой объект и специальный скрипт в нем, который делает все что нужно. Вызывает игровые функции, изменяет поля и свойства игровых объектов и так далее... Но подробнее об этом возможно потом. Могу только подтвердить скриншотом, что все что описано выше практически полностью работает

post-3-0-92881200-1430865637_thumb.jpg

Тут можно видеть и иерархию, включать и выключать объекты, включать и выключать скрипты.

Практический пример. Подбрасывание кубика на местности

Сегодня будем создавать поведения игровым 3d-объектам и пройдём по всем шагам от идеи до сборки проекта.

Время идёт и игровые движки становятся всё более доступными, более функциональными, а самое важное, как я представляю, становятся более понятными и удобными для людей не имеющих профессиональных знаний по работе с 3d-графикой.

Многие функции автоматизируются, упрощаются, дополняются. Появляются и новые примеры незавершённых 3d-игр на официальном и других сайтах. Большинство из этих примеров можно скомпилировать под разные операционные системы. Огромное количество ресурсов от отдельных элементов до целых проектов можно найти в сети Интернет. Документация хотя на инглише, но довольно подробная. Так что если есть желание и интерес ознакомиться с Unity3d более подробно, то обратитесь к иностранной документации.

1. Идея проекта

Это очень примитвный пример "на пальцах". Нажимая на пробел по вектору силы подбрасываем куб. Камера следит за центром куба.
post-3-0-80094700-1356272647_thumb.jpg

Для куба
post-3-0-06281400-1427320208_thumb.jpg

Для камеры
post-3-0-01589200-1427320217_thumb.jpg



2. Создание проекта

Создаём новый проект "3dCube"
post-3-0-84090100-1356272663_thumb.jpg

Здесь можно сразу выделить галочки Scripts и Terrain. Я это сделал позже

Видим пустой проект на котором будет только камера. Руки начинают "чесаться" что-нибудь этакое сделать.
post-3-0-32574000-1356272783_thumb.jpg

Сначала нужно всё-таки сохранить новую сцену, т.к. она создаётся автоматически, если мы раньше её не создавали. После любых важных изменений в проекте особенно перед стартом сцены или компиляцией обязательно нужно сохранить проект по "CTRL+S" чтобы наверняка не потерять нашу работу в случаях сбоя. Сейчас нужно сохранить сцену и включить её в список активных сцен. Нажимаем "CTRL+S". Нам предлагают сохранить сцену. Назовём её Scene0 и сохраняем. Это сцену мы теперь увидим в проекте.

Нажимаем н CTRL+Shift+B чтобы увидеть менеджер сцен и перетащим в него Scene0 мышкой

post-3-0-28057800-1356272823_thumb.jpg


Можно полазить по всем настройками и выбрать платформу. За подробностями по настройками можно обратиться на официальный сайт или в локальную документацию в комплекте с Unity3d.


Выделим в окне Иерархии, камеру и посмотрим в Инспектор на её свойства
post-3-0-28377500-1356272642_thumb.jpg


В иерархии мы видим игровые объекты на сцене.
В Инспекторе видим Компоненты выделенного игрового объекта Camera.

Мы можем присоединять и удалить все компоненты, кроме Transform. Удалить компонент Transform нельзя. Transform позволяет управлять объектами в 3d мире в локальных, глобальных координатах позицией и вращением, и масштабированием. Transform также позволяет в скриптах перемещать объект по иерархии объектов...

Создадим перед камерой куб "Cube" и источник света "Directional light". Функции их создания поищите в меню GameObject.
post-3-0-64430300-1356272818_thumb.jpg


Пододвинем куб поближе к камере. Камеру и куб поверните как на картинке используя инструменты - кнопки в левом верхнем углу.

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

У куба наиболее интересные параметры это Transform, о котором уже была речь. Box-коллайдер или зелёная сетка, которая играет роль при соударениях или касания или вхождениях в коллайдр другими коллайдерами, если коллайдер уже был помечен как триггер. MeshRenderer содержит материалы объекта. Матерал там по умолчанию и содержит шейдер по умолчанию - диффузный. Группа матералов с шейдерами отображают внешний вид куба. Шейдер это такая программа для графического устройства под его архитектуру.

Ещё стоит отметить, что GameObject-ы могут быть вложены друг в друга. Т.е. могут иметь родителей и дочерние объекты. Получается такая интересная иерархия объектов, содержащих компоненты разных мастей: сетки, коллайдеры, меш рендереры, свет, а также многие другие, например, C#-скрипты. Вот к скриптам мы сейчас и приступим.



3. Добавление поведения камере

Будем подбрасывать куб, а камера будет за ним смотреть. Куб как минимум должен уметь падать. Сейчас же он как статическое тело, которому никакая инерция не сообщается.

Присоединим к кубу физический компонент Rigidbody, чтобы куб мог падать и его можно было бы бросать. Если запустить сцену нажав на Play, то увидим как куб падает вниз.

Давайте не будем создавать и именно сейчас очень подробно рассматривать скрипт слежения. Лучше поучимся использовать готовое для начала. В окне Проекта используя правую и левую кнопки мышки найдите и импортируйте пакадж Scripts и скрипт слежения выделенный на рисунке. Заодно Вы познакомитесь с одним из главных механизмов обмена ресурсами между проектами - импорт пакаджев.

post-3-0-14569600-1356272813_thumb.jpg

Перетащите SmoothLookAt на камеру
А в мишень прицепите куб как на рисунке ниже
post-3-0-41578000-1356272807_thumb.jpg

Теперь если запустить сцену, то камера будет следить за кубом пока он падает.

Дважды кликните на скрипт чтобы ознакомится с ним.
post-3-0-26023000-1356272652_thumb.jpg


Это язык похожий на JavaScript. Я им не пользуюсь, т.к. я мне больше удобен C#. Если есть желание можно и переписать на C# или другой язык.

По скрипту можно понять, что Transform класс позволил вращать камеру. Quaternion.Slerp позволяет интерполировать вращение по времени в функции LateUpdate(), которая вызывается через интервал времени Time.deltaTime. А Quaternion.LookRotation() позволяет вычислить угол вращения в текущий момент времени без интерполяции. Интерполяция позволяет избежать резких рывков.

У поворотов есть два вида характеристик Эйлеровы углы и Кватернион. Последний отличается от первых дополнительной координатой W помимо X,Y,Z. Строка transform.LookAt(target) смотрит без интерполяции, если перед этим в Инспекторе вы сняли галочку с smooth. Это публичное свойство и видимо в Инспекторе.

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



4. Пишем и добавляем поведение для куба

Наша задача, написать на C# скрипт подбрасывающий куб по направлению вектора силы.
post-3-0-67563500-1356272658_thumb.jpg

Добавляем этот скрипт к кубу.
Идём в инспектор и ставим

post-3-0-13290300-1356272801_thumb.jpg


Нажимаем пробел и куб падает. Однако смотрится не эффектно на синем фоне. Мы же не видим куда он падает.
Добавим Террайен - это что-то типа местности для путешествия (импортируйте соответствующий пакадж об этом я уже писал вверху статьи). Добавьте местности некоторую текстуру (надеюсь у вас получится сделать это интуитивно полазив по компоненту)
post-3-0-83783400-1356272789_thumb.jpg


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

Скомпилируйте приложение как exe файл и увидите своё творение.

using UnityEngine;using System.Collections;public class ExampleClass : MonoBehaviour{	public GameObject prefab;		void Start()	{		prefab = GameObject.CreatePrimitive(PrimitiveType.Cube);		int i = 0;		while (i < 10)		{			Instantiate(prefab, new Vector3(i * 2.0F, 0, 0), Quaternion.identity);			i++;		}	}}
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

  • 4 года спустя...
×
×
  • Создать...

Важная информация

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