• Объявления

    • Garik66

      Пользователям форума   05.11.2017

      Прошу обратить внимание на эту тему (чтобы увидеть ссылку, войдите в объявление - нажмите на заголовок):   
MasterGH

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

2 сообщения в этой теме

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

не плохо бы продолжить эту статейку

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас