трехмерная графика юнити3д. Трехмерная_графика_. Рисунок 1 окно редактора Unity 3d
Скачать 2.82 Mb.
|
Введение Unity3d представляет собой кросс-платформенный движок нового поколения для создания игр и приложений, разработанный Unity Technologies. Благодаря данному движку можно разрабатывать не только прикладные приложения для пк ,но и мобильные , адаптированные и приложения для приставок . Во-первых, стоит отметить то, что в среду разработки Unity интегрирован игровой движок, иными словами, вы можете протестировать свою игру не выходя из редактора. Во-вторых, Unity поддерживает импорт огромного количества различных форматов, что позволяет разработчику игры конструировать сами модели в более удобном приложении, а Unity использовать по прямому назначению — разработки продукта. В-третьих, написание сценариев (скриптов) осуществляется на наиболее популярных языках программирования — C# и JavaScript . Таким образом, Unity3d является актуальной платформой, с помощью которой вы можете создавать свои собственные приложения и экспортировать их на различные устройства, будь то мобильный телефон или приставка Nintendo Wii. Рисунок 1- Окно редактора Unity 3d Объект исследования: изучение трехмерной графики и знакомство с основами работы. Предмет исследования: создания . Цель работы: изучение специфики организации взаимодействия виртуальной рабочей среды Unity3d и пользователя и применение этих знаний на практике. Задачи работы: Выявить специфику организации виртуальных сред работы с трехмерной графикой. Изучить особенности Unity3d. Изучить возможности и организовать взаимодействие пользователя с виртуальной рабочей средой Unity3d 2. Начало работы. Основные функции рабочей среды. Unity — это мультиплатформенный инструмент для разработки двух- и трёхмерных приложений и игр, работающий под операционными системами Windows и OS X. Созданные с помощью Unity приложения работают под операционными системами Windows, OS X, Android, Apple iOS, Linux, а также на игровых приставках Wii, PlayStation 3 и Xbox 360. Есть возможность создавать интернет-приложения с помощью специального подключаемого модуля к браузеру Unity, Unity характеризуется следующими возможностями: Сценарии на C#, JavaScript (модификация) и Boo; Игровой движок полностью увязан со средой разработки. Это позволяет прямо в редакторе испытывать игру; Работа с ресурсами возможна через простой Drag&Drop. Интерфейс редактора настраиваемый; Осуществлена система наследования объектов; Поддержка импорта из очень большого количества форматов; Встроенная поддержка сети; Есть решение для совместной разработки — Asset Server; Также можно использовать подходящий пользователю способ контроля версий. К примеру, Tortoise SVN или Source Gear. К особенностям данной среды разработки можно отнести: широкие возможности импорта, полностью настраиваемый и доступный большинству людей интерфейс, кроссплатформенность, гибкость и расширяемость, гибкая ценовая политика, доступно для VITV и epichnoetv, поддержка физики ткани (PhysX Cloth), Assets Store, так называемый магазин компонентов, наличие бесплатной версии с некоторыми ограничениями, скиннинг на CPU. Основной концепцией Unity3d является использование в сцене легко управляемых объектов, которые, в свою очередь, состоят из множества компонентов. Создание отдельных игровых объектов и последующее расширение их функциональности с помощью добавления различных компонентов позволяет бесконечно совершенствовать и усложнять проект. Коллайдеры. Коллайдер — это область пространства, при взаимодействии с которой выполняются те или иные скрипты, действия. Чтобы лучше понять что это такое, представьте, что вы подходите к автоматически открывающимся дверям универмага. За пару метров от дверей, срабатывает датчик и двери распахиваются перед вами, но если вы пройдете за три метра, то ничего не произойдет. Как раз та зона, в которой действует датчик движения, отвечающий за открывание дверей, и есть коллайдер. Вы входите в зону — двери открываются, выходите из зоны — и датчик уже никак не будет реагировать на ваше присутствие. Точно так же и в.игре. Так вот, о коллайдерах. В созданный проект я импортировал автомобиль и сгенерировал для него коллайдер. Можно сгенерировать автоматически коллайдер для всего автомобиля, но тогда для каждой детали автомобиля — фары, уплотнителя, зеркала, покрышки — будет сгенерирован свой коллайдер. Рисунок 2-модель автомобиля. Это абсолютно не оптимально. Безусловно, нам не нужно генерировать столь большое количество коллайдеров, достаточно ограничиться одним. Рисунок 3-модель автомобиля Обратите внимание, что это не тонкость. Стараться сэкономить память нужно везде. У вас есть какое-то место в игре, куда игрок не сможет попасть? Не генерируйте никакие коллайдеры для этого места вообще. У вас есть дверь, которую вы импортировали в проект из 3Ds max'а? Небось, она очень хорошо прорисована (сам сталкивался с тем, что у двери даже шурупы были прорисованы отдельным объектом), значит, создайте один box-коллайдер для всей двери — вы сэкономите много памяти! Поверьте, что вам эта сэкономленная память еще очень и очень пригодится. Оптимальная работа со сценами Поговорим об оптимизации сцен, о самих же сценах будет речь вестись далее. Представьте следующую ситуацию: у нас есть сцена «home» — когда игрок находится в здании и сцена «street» — когда игрок выходит из здания на улицу. Естественно, из второй сцены мы можем видеть дом, т.е. часть первой сцены, и наоборот (если, конечно, у здания есть окна). В таком случае оптимально следующее построение сцен. В первой сцене все, что касается улицы (т.е. того места, куда мы не можем попасть без перехода на другую сцену) надо максимально упростить. Иными словами, нам нужно оставить только внешний вид вида из окна, а всю начинку — распотрошить. Т.е. все коллайдеры удалить, разрешение и т.п. свести к минимуму. Действительно, зачем процессору напрягаться с обработкой той местности, которую мы не можем посетить? Аналогичным образом поступаем со второй сценой («street»). В данном случае мы можем вообще все удалить из дома и оставить только его «коробку». Вы хотите создать minimap? Пожалуйста, только избавьтесь от всех коллайдеров и снизьте разрешение, в таком случае ваша игра будет оптимальна. Сцены Сцена – это самый крупный блок, описывающий организацию объектов в памяти. В сценах содержатся объекты, из которых состоит ваша игра. В базовом случае сцена представляет отдельно взятый уровень вашей игры, где в любой конкретный момент времени загружена одна сцена. В более продвинутых сценариях у вас одновременно могут быть активны две или более сцен. В таком случае сцены можно дополнительно загружать в память или выгружать. Особенно удобно загружать во время геймплея несколько сцен, когда строишь крупномасштабный мир; когда держишь отдаленные области игрового мира на диске, а не в памяти, проще выдерживать стоящие перед вами требования по производительности. Готовая игра — это набор сцен, соединенных между собой (точно так же, как и жизнь — это набор дней). Об оптимальном проектировании игры мы сейчас и поговорим. Рисунок 4-Сцена езды автомобиля Unity3d Прежде чем создать свой проект — подумайте, что он должен в себя включать (какие сцены). Составьте список сцен (на листочке), обдумайте, что каждая сцена будет в себе содержать. Теперь постарайтесь каждую сцену разбить на подсцены, чем больше их будет, тем легче будет вашему ЦП. Конечно, не стоит перебарщивать с количеством сцен. Предположим, что ваш игрок находится в здании и из него никогда не выходит, в здании есть, например, пару этажей, крыша, а на каждом этаже имеется три комнаты. В данном случае, по моему мнению, было бы оптимально «разбить» здание на две сцены — два этажа и крыша. Дробление же каждого этажа на сцены с комнатами — не оптимально. Это просто не нужно, если каждая из комнат слабо загружена. Иными словами, надо грамотно расходовать память процессора, но и забывать о получении удовольствия от игры тоже не стоит. СтруктурированиеПри конструировании игры важно помнить о структурировании данных — немаловажном аспекте. Имеется ввиду, что все должно быть на своем месте. Создаете скрипты? — создайте папку для скриптов, там и храните их, с большой вероятностью, у вас будет не один скрипт, разбрасывать их по всему проекту не есть хорошо, сами потом будете мучиться. По своему опыту могу сказать, что вам точно понадобится создать папки со скриптами, звуковыми файлами, с GUI текстурами, материалами, анимациями, быть может, префабами и собственными моделями (импортированные из 3Ds max'а объекты лучше хранить именно в последней папке, дабы не разбрасывать все модели по проекту в хаотичном порядке). Когда вы создаете тот или иной скрипт, помните о том, что название переменных, классов и т.п. должны говорить все сами за себя. Если вы хотите создать скрипт для инвентаря (поднять предмет, использовать предмет), то лучше все скрипты однообразных действий (например, поднятия) начинать с ключевого слова, например: Catch<имя предмета>; Use<имя предмета>, в таком случае вам будет легче ориентироваться в проекте. Рисунок 5-список объектов проекта Описание механизмов .Большое значение при организации взаимодействия 3d-объектов в пространстве имеет обнаружение столкновений (Сollision detection). Сollision detection – это способ, с помощью которого анализируется 3D-пространство сцены на предмет столкновений между объектами. Присваивая объекту компонент Collider, мы фактически размещаем вокруг него невидимую сетку – так называемый коллайдер, который имитирует форму объекта и информирует о наличии столкновения с другим объектом. Например, в игре-симуляторе боулинга шары будут иметь простую сферическую форму коллайдера (Sphere collider), в то время как у объектов-кеглей коллайдер будет иметь форму цилиндра/капсулы или, для большей реалистичности столкновений, будет использовать меш (mesh), который является не чем иным, как описанием геометрии 3d-модели. Информация о столкновении коллайдеров поступает в физический движок, который сообщает столкнувшимся объектам их дальнейшую реакцию на это столкновение, основанную на направлении и силе удара, скорости и других факторах. using UnityEngine; using System.Collections; public class Dialog : MonoBehaviour { // Метод-функция, вызываемая при столкновении объектов void OnCollisionEnter() { Debug.Log("Hit Something"); // Передаем сообщение в консоль Unity }} Первые две строки подключают к скрипту используемые пространства имен. Далее необходимо запомнить, что главным классом в Unity3d является MonoBehaviour. Любой пользовательский скрипт (в описанном случае это Dialog) должен быть его наследником, и неспроста – ведь именно этот класс реализует интеграцию всех объектов в основной цикл программы. Именно это наследование позволяет пользовательскому скрипту (классу) исполнять роль компонента и быть привязанным к игровому объекту. Здесь метод «OnCollisionEnter» определяет столкновение объекта с другими объектами. А статический метод «Log» класса «Debug» пишет сообщение "Hit Something" в консоль Unity. После сохранения скрипта добавляем его в качестве компонента для падающего куба. Для этого необходимо сначала выбрать соответствующий объект в окне иерархии и перетащить на него вновь созданный скрипт «Dialog». При этом необходимо обратить внимание на то, что добавленный скрипт также отображается внизу в окне «Inspector» в качестве компонента объекта, к которому он привязан. Теперь, перейдя в режим Play, можно наблюдать, что в тот момент, когда созданный объект куб коснется плоской поверхности, в консоли среды Unity3d (Window > Console) появляется соответствующее сообщение. Заметьте, что такое сообщение будет выдаваться при каждом столкновении объектов. Причем последнее консольное сообщение отображается в статус (внизу окна). Для выяснения того, с какими именно объектами столкнулся исходный объект, необходимо использовать значение параметра класса «Collision», которое будет принимать метод «OnCollisionEnter». Открываем редактор скрипта и вставляем в него следующий код: // Теперь метод принимает объект класса Collision, с которым происходит столкновение void OnCollisionEnter(Collision myCollision) { // определение столкновения с двумя разноименными объектами if (myCollision.gameObject.name == "Ground") { // Обращаемся к имени объекта, с которым столкнулись Debug.Log("Stolknulsya s Zemlei"); } else if (myCollision.gameObject.name == "Wall") { Debug.Log("Stolknulsya sо Stenoi "); }} После открытия консоли (Window > Console) мы увидим, с какими именно объектами в сцене столкнулся куб. Таким образом, Unity3d позволяет нам оценить возможности взаимодействия объектов внутри среды. Необходимо добавить префаб в проект (Project > Create > Prefab). В результате на панели Project в окне проекта появится префаб с именем «New Prefab». Переименуем его в «UprugostCube». Префаб (Prefabs) – это конструкция подготовленных объектов и компонентов, предназначенная для их многократного использования в проекте. Экземпляр префаба может быть добавлен в любое количество сцен, а также многократно в одну сцену. Все экземпляры являются ссылками на оригинальный префаб и, фактически, его «клонами»; имеют те же свойства и компоненты, что и оригинальный объект. Свойства созданного префаба «UprugostCube» описываются на панели инспектора, а его предварительный вид доступен в окне «Preview». Для создания пары экземпляров префаба на плоскости необходимо просто его перетащить. В результате на плоскости появятся два куба, а в окне «иерархии» добавится объект с именем соответствующего префаба «UprugostCube». Переключившись в режим просмотра «Game» и запустив сцену, можно увидеть, что добавленный куб ведет себя точно так же, как и оригинальный, обладая одинаковыми физическими свойствами. Рассмотрим, каким образом можно удалять объекты в Unity3d в скриптах на языке C#. Для этого в окне «Project» создадим новый скрипт с именем «Destroy» и откроем его в редакторе скриптов MonoDevelop. Как уже говорилось, при создании C# скрипта Unity создает некий каркас, состоящий из подключенных библиотек и основного класса (используемого скриптом) с методами Start() и Update(). В предыдущих случаях нами рассматривался метод Update, который вызывается каждый раз в новом кадре для каждого компонента всех объектов на сцене. В данном случае мы воспользуемся методом Start(), который выполняется единожды для каждого компонента сразу после нажатия на кнопку «Play» и, соответственно, должен использоваться для инициализации переменных и придания им каких-либо начальных значений. Добавим в тело метода Start() функцию Destroy() и передадим в нее gameObject, указав таким образом, что скрипт должен уничтожить объект, компонентом которого он является: // метод Start() выполняется единожды, сразу после окончания загрузки сцены Start() { // уничтожить объект, к которому прикреплен данный скрипт Destroy(gameObject); } Добавим этот скрипт к кубическому объекту, который должен удаляться, с помощью меню компонентов. Теперь после запуска сцены можно убедиться, что добавленный куб при запуске программы сразу пропадает. Теперь попробуем уничтожить другой объект с помощью его поиска в среде. Для этого воспользуемся статическим методом Find() основного класса GameObject: // ищем объект с именем Stena и если таковой есть - уничтожаем его Destroy(GameObject.Find(“Wall”)); В случае необходимости уничтожения объекта не сразу, а спустя какое-то время, можно задать значение во второй параметр функции Destroy: // Теперь уничтожаем стену, спустя две секунды после загрузки сцены Destroy(GameObject.Find(“Wall”), 2); Этот скрипт привязывается к объекту «камера» и вращает его в сторону, которую смещается мышь, в соответствии с чувствительностью. Если значение угла, принимаемое камерой, выходит за рамки, указанные в максимуме и минимуме, то оно будет возвращено до допустимого значения. Вращение осуществляется стандартной функцией transform.rotate, примененной к объекту «камера». public class MouseLook : MonoBehaviour { public enum RotationAxes { MouseXAndY = 0, MouseX = 1, MouseY = 2 } public RotationAxes axes = RotationAxes.MouseXAndY; public float sensitivityX = 15F; public float sensitivityY = 15F; public float minimumX = -360F; public float maximumX = 360F; public float minimumY = -60F; public float maximumY = 60F; float rotationY = 0F; void Update () { if (axes == RotationAxes.MouseXAndY) { float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX; rotationY += Input.GetAxis("Mouse Y") * sensitivityY; rotationY = Mathf.Clamp (rotationY, minimumY, maximumY); transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0); } else if (axes == RotationAxes.MouseX) { transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityX, 0); } else { rotationY += Input.GetAxis("Mouse Y") * sensitivityY; rotationY = Mathf.Clamp (rotationY, minimumY, maximumY); transform.localEulerAngles = new Vector3(-rotationY, transform.localEulerAngles.y, 0); } } void Start () { // Make the rigid body not change rotation if (rigidbody &&(PlayerPrefs.GetString("objName") == gameObject.name)) rigidbody.freezeRotation = true; } } Устранение ошибокUnity3d — такой движок, что если у вас имеются ошибки в написании скриптов, то игра ваша не запустится. Если же нет явных ошибок, то игра запускается, если что-то идет не так, то консоль вам об этом обязательно сообщит. Это предупреждения, они просто говорят вам о возможных недочетах, недоработках: Это ошибки, если такие имеются, то игра не запустится: Рисунок 6-сообщение об ошибке. Заключение.В ходе нашего исследования все поставленные задачи были решены. Мы определили сущность виртуальной рабочей среды – это совокупность информационных ресурсов, обеспечивающая комплексную методическую и технологическую поддержку процесса работы. Также, мы определили специфику виртуальной рабочей среды в Unity3d . Мы изучили особенности виртуальной среды, как рабочего и учебного места. Такая среда предоставляет практически неограниченные возможности для моделирования и экспериментов. Пределом сложности устанавливаемых задач может служить сложность внутренней организации среды, а также, производительность аппаратной части проекта. Мы изучили устройство виртуальной среды с помощью среды разработки Unity. Это довольно сложный пакет программ, позволяющий разрабатывать виртуальные игровые миры. Он находится среди лидеров по производительности среди 3D рендереров. Также, Unity обладает целым рядом преимуществ по сравнению со своими ближайшими аналогами. Среди достоинств этой среды разработки следует, также, упомянуть мультиплатформенность. Список Литературы. 1. Unity в действии. Мультиплатформенная разработка на C#. - М.: Питер, 2018. - 988 c. 2. Unity и C#. Геймдев от идеи до реализации - Джереми Гибсон Бонд, 2020 г.. 3. Геймдизайн - Альпина Паблишер, 2019 г. 4. Разработка игр на Unity 2018 за 24 часа- Майк Гейг,2020г. 5.http://unity3d.com/ - официальный сайт компании Unity 6.http://docs.unity3d.com/Documentation/ScriptReference/ - библиотека функций Unity 7.http://www.unity3dstudent.com/ - уроки Unity3D 8.http://blogs.unity3d.ru – русскоязычный блог Unity3D. 9.http://unity3d.ru – русскоязычное сообщество Unity3D. 10.http://learnunity3d.com/ - новости игровой индустрии, связанный с Unity3D. 11.http://www.digitaltutors.com/training/unity-tutorials - уроки Unity3D 12.http://habrahabr.ru/post/128711/ - статья про скрипты Unity3D 13.http://habrahabr.ru/post/147315/ - статья про события Unity3D |