MasterGH Опубликовано 23 декабря, 2012 Поделиться Опубликовано 23 декабря, 2012 Общую информацию по движку в качестве введения можно получить из Википедии. Предлагаю найти и почитать. Знакомство будет начато с теории - архитектурой игрового движка и немного практики. Все будет компактно и более менее понятно на мой взгляд.Архитектура игрового движка Unity3d и базовые функцииКратко по пунктам о самом основном, что поможет сделать читы на высоком уровне, не влезая в дебри кода и оладчик. Только тут C#, а у него свои особенности1. Игра состоит из сцен. Представляют собой файлы со значком Unity (мелкий или большой), которые можно найти в окне Проекта.2. Сцены состоят из GameObject-ов, которых можно увидеть загрузив сцену в окне иерархии объектовДалее разбирать мы будем три ветви наследования классов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 и подгрузить его в игру создавая пустой игровой объект и специальный скрипт в нем, который делает все что нужно. Вызывает игровые функции, изменяет поля и свойства игровых объектов и так далее... Но подробнее об этом возможно потом. Могу только подтвердить скриншотом, что все что описано выше практически полностью работаетТут можно видеть и иерархию, включать и выключать объекты, включать и выключать скрипты.Практический пример. Подбрасывание кубика на местностиСегодня будем создавать поведения игровым 3d-объектам и пройдём по всем шагам от идеи до сборки проекта.Время идёт и игровые движки становятся всё более доступными, более функциональными, а самое важное, как я представляю, становятся более понятными и удобными для людей не имеющих профессиональных знаний по работе с 3d-графикой.Многие функции автоматизируются, упрощаются, дополняются. Появляются и новые примеры незавершённых 3d-игр на официальном и других сайтах. Большинство из этих примеров можно скомпилировать под разные операционные системы. Огромное количество ресурсов от отдельных элементов до целых проектов можно найти в сети Интернет. Документация хотя на инглише, но довольно подробная. Так что если есть желание и интерес ознакомиться с Unity3d более подробно, то обратитесь к иностранной документации.1. Идея проектаЭто очень примитвный пример "на пальцах". Нажимая на пробел по вектору силы подбрасываем куб. Камера следит за центром куба.Для кубаДля камеры2. Создание проектаСоздаём новый проект "3dCube"Здесь можно сразу выделить галочки Scripts и Terrain. Я это сделал позжеВидим пустой проект на котором будет только камера. Руки начинают "чесаться" что-нибудь этакое сделать.Сначала нужно всё-таки сохранить новую сцену, т.к. она создаётся автоматически, если мы раньше её не создавали. После любых важных изменений в проекте особенно перед стартом сцены или компиляцией обязательно нужно сохранить проект по "CTRL+S" чтобы наверняка не потерять нашу работу в случаях сбоя. Сейчас нужно сохранить сцену и включить её в список активных сцен. Нажимаем "CTRL+S". Нам предлагают сохранить сцену. Назовём её Scene0 и сохраняем. Это сцену мы теперь увидим в проекте.Нажимаем н CTRL+Shift+B чтобы увидеть менеджер сцен и перетащим в него Scene0 мышкойМожно полазить по всем настройками и выбрать платформу. За подробностями по настройками можно обратиться на официальный сайт или в локальную документацию в комплекте с Unity3d.Выделим в окне Иерархии, камеру и посмотрим в Инспектор на её свойстваВ иерархии мы видим игровые объекты на сцене.В Инспекторе видим Компоненты выделенного игрового объекта Camera.Мы можем присоединять и удалить все компоненты, кроме Transform. Удалить компонент Transform нельзя. Transform позволяет управлять объектами в 3d мире в локальных, глобальных координатах позицией и вращением, и масштабированием. Transform также позволяет в скриптах перемещать объект по иерархии объектов...Создадим перед камерой куб "Cube" и источник света "Directional light". Функции их создания поищите в меню GameObject.Пододвинем куб поближе к камере. Камеру и куб поверните как на картинке используя инструменты - кнопки в левом верхнем углу.Выделим источник света и куб. Посмотрим их настройки, может быть даже поймете что-то интуитивно. Если не понятно, то можно нажать на значок книжки с вопросом правее от названия компонента.У куба наиболее интересные параметры это Transform, о котором уже была речь. Box-коллайдер или зелёная сетка, которая играет роль при соударениях или касания или вхождениях в коллайдр другими коллайдерами, если коллайдер уже был помечен как триггер. MeshRenderer содержит материалы объекта. Матерал там по умолчанию и содержит шейдер по умолчанию - диффузный. Группа матералов с шейдерами отображают внешний вид куба. Шейдер это такая программа для графического устройства под его архитектуру.Ещё стоит отметить, что GameObject-ы могут быть вложены друг в друга. Т.е. могут иметь родителей и дочерние объекты. Получается такая интересная иерархия объектов, содержащих компоненты разных мастей: сетки, коллайдеры, меш рендереры, свет, а также многие другие, например, C#-скрипты. Вот к скриптам мы сейчас и приступим.3. Добавление поведения камереБудем подбрасывать куб, а камера будет за ним смотреть. Куб как минимум должен уметь падать. Сейчас же он как статическое тело, которому никакая инерция не сообщается.Присоединим к кубу физический компонент Rigidbody, чтобы куб мог падать и его можно было бы бросать. Если запустить сцену нажав на Play, то увидим как куб падает вниз.Давайте не будем создавать и именно сейчас очень подробно рассматривать скрипт слежения. Лучше поучимся использовать готовое для начала. В окне Проекта используя правую и левую кнопки мышки найдите и импортируйте пакадж Scripts и скрипт слежения выделенный на рисунке. Заодно Вы познакомитесь с одним из главных механизмов обмена ресурсами между проектами - импорт пакаджев.Перетащите SmoothLookAt на камеруА в мишень прицепите куб как на рисунке нижеТеперь если запустить сцену, то камера будет следить за кубом пока он падает.Дважды кликните на скрипт чтобы ознакомится с ним.Это язык похожий на JavaScript. Я им не пользуюсь, т.к. я мне больше удобен C#. Если есть желание можно и переписать на C# или другой язык.По скрипту можно понять, что Transform класс позволил вращать камеру. Quaternion.Slerp позволяет интерполировать вращение по времени в функции LateUpdate(), которая вызывается через интервал времени Time.deltaTime. А Quaternion.LookRotation() позволяет вычислить угол вращения в текущий момент времени без интерполяции. Интерполяция позволяет избежать резких рывков.У поворотов есть два вида характеристик Эйлеровы углы и Кватернион. Последний отличается от первых дополнительной координатой W помимо X,Y,Z. Строка transform.LookAt(target) смотрит без интерполяции, если перед этим в Инспекторе вы сняли галочку с smooth. Это публичное свойство и видимо в Инспекторе.Итак. Скрипт можно расценивать как поведение объекта. Если скрипт написан правильно, то во время работы игры его можно цеплять к любому объекту и отцеплять без ошибок . В результате игровой объект приобретает новое поведение, новые свойства, новые данные, новую реакцию на что-то или сам является инициатором реакции других объектов.4. Пишем и добавляем поведение для кубаНаша задача, написать на C# скрипт подбрасывающий куб по направлению вектора силы.Добавляем этот скрипт к кубу.Идём в инспектор и ставимНажимаем пробел и куб падает. Однако смотрится не эффектно на синем фоне. Мы же не видим куда он падает.Добавим Террайен - это что-то типа местности для путешествия (импортируйте соответствующий пакадж об этом я уже писал вверху статьи). Добавьте местности некоторую текстуру (надеюсь у вас получится сделать это интуитивно полазив по компоненту)Ну, а теперь куб будет стремится вверх пока нажимаем на Пробел. При чем можно менять направления вектора силы и тип силы в Инспекторе. Попробуйте по другим горячим клавишам менять вектор силы...Скомпилируйте приложение как 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Executor Опубликовано 7 августа, 2017 Поделиться Опубликовано 7 августа, 2017 не плохо бы продолжить эту статейку Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения