Comrade _Alexey 92 Опубликовано 20 Сентября 2017 Поделиться Опубликовано 20 Сентября 2017 В этой теме можно будет найти уроки от @Mr_God и прочих людей по данному движку. Уроки будут разной степени сложности. 1 где бы код изменить Работает - не трогай.©Любой программист Ссылка на комментарий
Comrade _Alexey 92 Опубликовано 20 Сентября 2017 Автор Поделиться Опубликовано 20 Сентября 2017 (изменено) Интерфейс Unity : Часть 1. Сложность: #ОченьЛегко Версия движка:5.6.2f1 В данном уроке я расскажу в целом что за что отвечает в интерфейсе движка. p.s. Если вылезло следующее окошко при запуске то в конце данного поста есть инструкция и по этому окну Скрытый текст При запуске движка Вы видите следующее окно Скрытый текст В этом окне есть две вкладки, первая проекты, в них собственно говоря можно увидеть свои проекты, и те проекты которые есть на облаке. Скрытый текст Как можно было заметить под данной вкладкой есть две кнопки, первая On Disk это список тех проектов которые хранятся на локальном диске и In The Cloud список тех проектов которые хранятся на облаке, при этом один и тот-же проект может храниться и там и там. Скрытый текст Цифра около "In The Cloud" означает сколько проектов в облаке не хранятся на локальном диске, именно скачанных напрямую из движка(насколько я понял). Так как у меня уже есть проекты то список проектов можно увидеть тут Скрытый текст Переходим теперь к самим проектам в данном окне. Красный цвет означает название проекта. Зелёный путь к папке с проектом. Синий версия Unity используемая при последнем запуске данного проекта, есть одно замечание, Unity более свежих версий может открывать проекты старых версий, но Unity старых версий не может открывать проекты Unity более новых версий, к примеру Unity 2017 откроет проект созданный в Unity 5.6.2f1, но Unity 5.6.2f1 не может открыть проект созданный на Unity 2017, насчёт патчей не знаю, по логике должно быть так-же. Скрытый текст Теперь перейдём к вкладке "Learn" Как ясно из названия там раздел обучения данному движку. На английском. Скрытый текст Во вкладке "Get Started" находиться видеоролик от юнитехов, в нём есть информация обо всём Во вкладке "Tutorials" находятся проекты туториалов от юнитехов, простые но верные способы что-то изучить. Во вкладке "Resources" находятся различные ассеты. Во вкладке "Links" ссылки на другие туториалы от юнитехов. С этой вкладкой Вы разобрались и теперь пора переходить к созданию нового проекта. В зелёном кружке кнопка "создать новый проект", в синем загрузить проект(открывается обычное окно в котором нужно выбрать папку с проектом). Скрытый текст При этом если щёлкнуть на проект из списка то он начнёт загружаться.(данное окно закроется и начнётся загрузка редактора с проектом) При щелчке на "New"(новый проект) появиться следующее окно Скрытый текст Теперь разберёмся что это всё означает. В поле ввода подчеркнутое красным нужно вводить название проекта. В поле ввода подчеркнутое зелёным нужно вводить путь к папке в котором будут проекты(по умолчанию указанна папка в Windows по названием "документы", Вы же можете указать любую другую папку. В поле ввода подчеркнутое синим вводите название Вашей организации. Два выколотых кружка подчеркнутых жёлтой линией означают какое измерение будет использовать Ваш проект по умолчанию, сменить данную настройку можно очень быстро в самом редакторе. Скрытый текст Теперь переходим к следующим кнопкам. Красным подчеркнута кнопка выбора ассетов которые будут сразу использованы при создании проекта. Синим подчеркнут переключатель on\off включения аналитики проекта самим движком. Жёлтым подчёркнута кнопка отмены создания проекта Зелёным подчёркнута кнопка создания проекта. Скрытый текст Переходим к аккаунту в Unity. Насколько я помню при первом запуске лаунчера должно появиться следующее окно Скрытый текст Сейчас разберёмся что к чему тут. Зелёным подчёркнуто то что без входа в аккаунт Вы не сможете скачивать ассеты с ассет-стора, и использовать функции облака(и прочие плюшки) от Unity. Синим подчёркнуто окно ввода почты на которую зарегистрирован аккаунт. Красным подчёркнуто окно ввода пароля от того-же аккаунта. Скрытый текст Синим подчёркнута кнопка работы в офлайн режиме. Красным подчёркнута кнопка входа в данный профиль. Скрытый текст В синей рамке ссылка на восстановление пароля от аккаунта. В зелёной рамке ссылка на страницу с повтором отправления письма на почту с подтверждением аккаунта В красной рамке можно выбрать запомнить данные для входа или нет Скрытый текст На этом первая часть данного урока закончена. Следующая будет про интерфейс самого редактора. Изменено 20 Сентября 2017 пользователем Mr_God 2 где бы код изменить Работает - не трогай.©Любой программист Ссылка на комментарий
Comrade _Alexey 92 Опубликовано 20 Сентября 2017 Автор Поделиться Опубликовано 20 Сентября 2017 (изменено) Образец для уроков: Название. Сложность(очень лёгкая, лёгкая, средняя, сложно, очень сложно) Текст урока(либо видео, либо и то и то, картинки тоже можно использовать) Вопросы по урокам лучше задавать либо в ЛС автору, либо в теме отведённую для этого. Обращаю внимание что это только образец, если Вы хотите сделать по своему то пожалуйста, но только что-бы было логично всё и понятно сразу что за урок и про что он. Флуд буду удалять. Изменено 20 Сентября 2017 пользователем Mr_God 1 где бы код изменить Работает - не трогай.©Любой программист Ссылка на комментарий
Comrade _Alexey 92 Опубликовано 21 Сентября 2017 Автор Поделиться Опубликовано 21 Сентября 2017 (изменено) Интерфейс Unity : Часть 2. Сложность: #ОченьЛегко Версия движка:5.6.2f1 В этом уроке я продолжу рассказывать о интерфейсе в Unity. Так как в предыдущем я полностью объяснил Вам что и где отвечает в лаунчере, то в этом уроке я расскажу Вам о том что и где находиться в редакторе. При открытии редактора Вы увидите следующее окно, это и есть главное окно редактора Скрытый текст Как видите тут довольно много окон и вкладок. Сейчас я расскажу что означает каждое окно и для чего оно нужно. 1)Окно редактора сцены, в нём находятся те объекты которые будут в игре 2)Иерархия объектов расположенных на сцене. 3)Иерархия папок расположенных в папке проекта 4)Собственно файлы расположенные в выбранной папке из окна 3 5)Инспектор свойств выбранного объекта на сцене Скрытый текст 1)Окно в котором отображается сама игра(т.е. вид из камеры) 2)Окно консоли, полезная вещь для дебага игры Скрытый текст В жёлтой рамке находится меню редактора. В зелёной рамке находиться панель инструментов. В синей рамке находиться окно для анимирования игровых объектов внутри редактора Всё что ниже красной линии используется для вывода последнего сообщения из консоли. Скрытый текст В красной рамке находиться окно аниматора, в данном окне можно настраивать логику анимаций в контроллере(расскажу об этом в уроке посвящённом анимациям в Unity) Скрытый текст Переходим к меню, сейчас рассмотрим вкладку File. 1)Создать новую сцену. 2)Открыть ранее созданную сцену. 3)Сохранить сцену. 4)Сохранить сцену как... 5)Новый проект(при этом закроется этот). 6)Открыть проект. 7)Сохранить проект. 8) Настройки сборки. 9)Сборка и запуск сборки. 10) Выход из редактора. Скрытый текст Далее у нас вкладка Edit, она отвечает за различные манипуляции с объектом в редакторе(и не только) 1)отменить действие(у меня уже были сделаны некоторые действия, надпись в оргинале выглядит немного по другому). 2)вернуть отменённое действие. 3)Вырезать. 4)Копировать. 5)Вставить. 6)Дублировать. 7)Удалить. 8)Подсветка в иерархии выбранного объекта. 9)Центрировать камеру на выбранном объекте. 10)Активирует курсор в окне поиска 11)Выбрать все объекты в иерархии. 12)Персональные настройки в Unity(Скины, выбор IDE для работы с кодом и прочее) 13)Модули(установка, проверка состояния и прочее) 14)Запуск игры. 15)Пауза в игре. 16)Остановка игры(выход). 17)Войти в аккаунт Unity. 18)Выйти из аккаунта Unity. 19)Загрузка/Сохранение списка выбранных объектов. 20)Различные настройки проекта, поговорим о них позже. 21)Эмуляция графики. 22)Эмуляция сети. 23)Настройки использования "жёсткого" режима перемещения,вращения,увеличения размера объекта. Скрытый текст Переходим ко следующему пункту, assets. 1)Создать какой-то объект. 2)Открыть в проводнике. 3)Открыть файл. 4)Удалить файл. 5)Открыть сцену(В иерархии она появиться ниже открытой). 6)Импортировать новый ассет. 7)Импортировать ассет(из стандартного набора). 8)Экспортировать ассет. 9)Нахождение ссылок на файл из папки с ассетами в данной сцене. 10)Выбор зависимостей. 11)Обновить. 12)Повтор импорта ассета. 13)Повтор импорта всех ассетов. 14)Запуск обновления API. 15)Открыть C# проект в IDE которую вы используете. Скрытый текст В окне component можно добавить компонент к выбранному объекту на сцене. Скрытый текст Следующее окно с возможностью добавления окон редактора. 1)Сцены. 2)Игры. 3)Инспектора. 4)Иерархия. 5)Проект 6)Анимации 7)Ассет стор. 8)Аниматор. 9)Навигация. 10)Консоль. 11)Макеты(Стандартные возможности кастомизации окон редактора) Скрытый текст Следующее окно Help содержит в себе различную информацию о движке и т.д., стандартное окно во многих программах. На этом данная часть урока завершена. Дальнейшее изучение интерфейса будет по мере продвижения в уроках по данному движку. P.S. В этом уроке я показывал окно редактора движка, я забыл что уже немного кастомизировал его, извиняюсь перед теми кто открыл редактор и увидел не то что у меня есть на скриншотах. Изменено 21 Сентября 2017 пользователем Mr_God 1 2 где бы код изменить Работает - не трогай.©Любой программист Ссылка на комментарий
Comrade _Alexey 92 Опубликовано 25 Сентября 2017 Автор Поделиться Опубликовано 25 Сентября 2017 Создание первой игры на Unity: Часть 1. Сложность: Легко. Версия движка:5.6.2f1. После того как Вы зайдёте в редактор движка Вам однозначно станет интересно что можно сделать в нём, я по секрету скажу многое, но делать BF4 мы не будем, зато сделаем свой маленький шутер,Вы спросите почему именно шутер, а не какой нибудь там платформер, я скажу что это было-бы слишком легко для начала, а вот сделать проект после которого можно будет браться за любые другие проекты можно, и это не будет трудно. А теперь о целях данного урока, в этом уроке я расскажу как можно сделать самое примитивное управление персонажем а именно вертеть "головой". Для начала создадим основу игрока, в данном случае это можно сделать несколькими путями, но результат будет один и тот-же. За основу я выберу капсулу, почему капсулу? Потому-что она больше подходит для имитации формы человека. Что-бы создать капсулу кликните в иерархии ПКМ(Не пулемётом, а правой кнопкой мыши) по пустому месту и у Вас появиться следующее окно. Скрытый текст Далее жмём на пункт "3D Object' и выбираем пункт "Capsule", вот скриншот того где лежит эта самая капсула(для самых маленьких). Скрытый текст После того как нажали на капсулу она должна появиться на сцене и в иерархии. Если не видно на сцене то щёлкаем в иерархии на объект с названием "Capsule" и жмём сочетание клавиш shift+f, тогда Ваша капсула должна быть видна в сцене. Примерно так должна выглядеть сцена после того как Вы добавите капсулу. Скрытый текст Теперь нужно эту капсулу переместить в нулевые координаты на карте, для этого щёлкнем в иерархии на объект капсулы и посмотрим в окно инспектора. Окно инспектора выделено красной рамкой. Скрытый текст В нём есть несколько раскрывающихся окон, нам нужно окно "Transform". В данном окне указаны координаты объекта, его градусы поворота и размер. Следует заметить что в данном случае у объекта глобальные координаты. Вы спросите какие бывают ещё координаты, я отвечу локальные, Вы спросите в чём разница, я отвечу что глобальные координаты являются координатами самого первого "родителя" в группе объектов, как в Unity такие объекты называются по научному я не знаю, но я знаю что в других программах(движках, 3Д редакторах и прочих программах) они называются Рут нодами или Root node, т.е. главная нода(не узел, а нода) в цепочке нод. Локальные же координаты это координаты "ребёнка" в "родителе", т.е. отсчёт идёт от координат "родителя". Вы спросите кто эти все "Родители" и "Ребёнки", "Родителем" является объект в котором есть вложенный в него объект("Ребёнок"), при этом Родитель может являться и "Ребёнком". Увидеть расположение объекта по координатам можно тут. Ещё обращу внимание что у Rotation есть четвёртый параметр, это ось w, о ней поговорим потом. С размером ничего особенного не происходит. Скрытый текст У любого объекта координаты располагаются в трёх осях, это X,Y,Z, X - перемещение объекта в право/влево, Y - перемещение объекта вверх/вниз, Z - перемещение объекта вперёд/назад. Теперь после того как Вы узнали что за что отвечает в Transform'e сделайте координаты капсулы нулевыми по всем осям. Просто щёлкните на поле со значениями и введите везде нули в "Position". Сделали? Отлично. Теперь создайте сферу и обнулите её координаты. После того как обнулили координаты переместите сферу в капсулу, сделать это можно просто щёлкнув ЛКМ по сфере и зажав кнопку перетащить сферу в иерархии на капсулу. Всё , Вы сделали сферу "Ребёнком" капсулы и у Вас должно получиться примерно следующее. Скрытый текст Теперь нужно сделать главную камеру(это объект под названием "Main Camera") дочерней для сферы, но перед этим обнулите её координаты. Готово? Отлично. Так должна выглядеть сцена с иерархией после всех преобразований. Скрытый текст Как Вы заметили "голова" смотрит из центра тела, это не дело, переместите сферу на один юниметр(юниметр равен одному метру) вверх и "голова" будет на месте, теперь стоит отключить отображение меша. Сделать это можно отключив компонент "Mesh Renderer" в инспекторе. Сделать это можно нажав на чек-бокс(кубик с галочкой) около названия компонента в инспекторе объекта. Проделав все манипуляции всё должно выглядеть так. Скрытый текст Теперь осталось добавить пол. Нужно добавить примитив "Plane" и переместить его на нулевые координаты. После того как поместили "Plane" в нулевые координаты нужно поднять капсулу на 1 метр Должно получиться примерно так. Скрытый текст Всё, подготовка закончена, можно приступать к скриптингу. Скрипты будем писать на C#. Первый скрипт который мы будем писать это скрипт на осмотр окружающего пространства. Что-бы создать новый скрипт нужно нажать в окне с ассетами ПКМ и выбрать пункт "Create" из выпадающего списка выбрать пункт "C# script" и создаться новый файл скрипта, при создании нового файла ему можно сразу-же прописать "имя", в данном случае мы удалим стандартное "NewBehaviourScript" и напишем "MouselLook". После этого щёлкаем дважды на файл скрипта и у Вас должна открыться MonoDevelop(Далее MD), это стандартная IDE поставляемая с Unity, но я буду работать с Visual Studio 2015(Далее VS), для кодинга вообще можно использовать и блокнот, но так как Вы новичок( наверное, я предполагаю что Вы ничего не знаете что и как настраивать) то желательно работать в IDE, я выбрал VS так как она намного удобнее для программирования под Unity на C#, ну да ладно, от лирики к делу, если хотите кодить на VS то её нужно скачать и установить, и установить дополнительные пакеты для работы под Unity, после того как всё сделали переходим в Unity и жмём в меню на пункт "Edit" а далее в выпадающем списке выбираем пункт "Preferences", открывается следующее окно. Скрытый текст Переходим в пункт "External Tools" и жмём на кнопку в чёрной рамке и выбираем из списка VS. Скрытый текст Всё, закрываем данное окно, настойка завершена. Открываем скрипт в VS и видим примерно следующее. Скрытый текст Объяснять синтаксис я не буду, если надо вести уроки по шарпу то могу устроить и их, но сейчас не буду. Приступаем к делу. Объявляем две переменных(тип float) отвечающих за чувствительность мыши. Я назову их senHorX и senHorY. Теперь нужно создать две переменные(тип float) для ограничения вращения "головы" по координате X(X в rotation это вертикаль, Y горизонталь) их я назову minVertX и maxVertX, теперь добавим две переменные типа GameObject, это переменная хранит в себе информацию о любом игровом объекте, в данном случае мы будем использовать данные переменные для того что-бы вращать родитель по оси Y, а ребёнка по оси X. я их назову child и parent соответственно. После всего этого нужно создать две переменные для значения получаемые от мыши, я их назову x,y. Вот что должно быть после всех телодвижений. Скрытый текст Теперь нужно присвоить значения получаемые от мыши значениям переменных x,y. Выглядеть всё это дело будет так. Скрытый текст Что-же такое я написал? разберём строчку x = Input.GetAxis("Mouse Y"); Тут присваивается переменной x значение функции GetAxis(название оси) из интерфейса Input, интерфейс Input ответственен за приём сигналов от устройств ввода, метод GetAxis принимает в качестве параметра название ось мыши и возвращает её значение переменной которой он присваивается. Что-бы было какое-то ускорение(замедление) поворота головы при движении мыши мы умножим значение GetAxis(название оси) на переменную созданную ранее, а именно senHor(название оси). Что-бы значение изменялось одинаково при любом FPS мы используем Time.deltaTime, переменная deltaTime интерфейса Time возвращает значение времени прошедшее за последний кадр, а интерфейс Time отвечает за действия со временем в данном движке. После всего что мы сделали должно получиться следующее. Скрытый текст Но перед тем как приступить к дальнейшей писанине нужно подправить код, а именно дописать - перед = в 18 строчке, что-бы получилось что мы не присваиваем, а вычитаем из данной переменной значение что-бы потом не мучить себя в будущем. Вот скрин. Скрытый текст Переходим к ограничиванию переменной x. Присваиваем x результат работы следующей строчки Mathf.Clamp(x, minVertX, maxVertX); Что-же тут происходит? Мы используем функцию Clamp из структуры Mathf которая принимает в качестве первого параметра текущее значение и ограничивает его минимальным/максимальным значением, если изначальное значение больше максимального или меньше минимального то значение принимает тот или иной предел. Всё должно выглядеть так. Скрытый текст теперь переходим к самому главному, повороту объекта, сделать это можно следующим образом. для родителя :parent.transform.localEulerAngles = new Vector3(0, parent.transform.localEulerAngles.y + y, 0); и для ребёнка:child.transform.localEulerAngles = new Vector3(x, 0, 0); разберём код для родителя и для ребёнка в общих чертах, мы берём переменную класса GameObject и вызываем свойство transform(это свойство содержит различные данные о Transform компоненте объекта которые можно использовать) дальше вызываем свойство localEulerAngles(это свойство как раз содержит данные rotate из компонента transform в объекте) что-бы изменить эти данные(они типа Vector3, Vector3 это тип данных который содержит три числа x,y,z) нужно присвоить данной переменной переменную данного типа, что и происходит после знака = . отличия лишь в том что у родителя идёт присвоение переменной которая равна сумме значений старого значения и переменной y, а у ребёнка сразу готовое финальное значение. Вот скрин. Скрытый текст Теперь после того как мы дописали данный скрипт можно его сохранить и переходить в редактор, после некоторого количества времени ожидания скрипт скомпилируется и можно будет запускать игру и повертеть мышкой что-бы увидеть что скрипт работает, но не забудь добавить скрипт к объекту, сделав это можно просто перетащив скрипт на любой игровой объект, желательно на сферу, после того как перетащили скрипт, нужно заполнить пустые значения в инспекторе. Всё выглядеть должно так. Скрытый текст Всё, можно запускать игру. Вот скрин. Скрытый текст Всё, я завершаю данную часть этого урока. 1 1 где бы код изменить Работает - не трогай.©Любой программист Ссылка на комментарий
Comrade _Alexey 92 Опубликовано 8 Октября 2017 Автор Поделиться Опубликовано 8 Октября 2017 Создание первой игры на Unity: Часть 2. Сложность: Легко. Версия движка:5.6.2f1. В этом уроке мы продолжим создавать управление для FPS. А именно стандартное управление персонажем в стиле WASD, для перемещения игрока в мире. Т.к. у нас уже есть своя сцена то продолжим с неё. Первым делом нужно добавить компонент CharacterController к капсуле, что-бы можно было передвигать персонажа с помощью кода. Зайдите в меню добавления компонента и в пункте Physics выберете компонент CharacterController. Добавили? Молодцы. Если не смогли найти данный пункт то вот он. Скрытый текст 1) Скрытый текст 2)нажимаем на кнопку Add Component и выбираем пункт Physics Скрытый текст 3)нажимаем на пункт CharacterController и всё, компонент добавлен. Скрытый текст Дальше создаём скрипт с названием FPSInput. После создания объявляем сразу две переменные, x,y типа float. Примерно вот так. К прочтению!!! Скрытый текст (Я буду в спойлерах показывать ВЕСЬ!!! скрипт после изменений), почему я написал таким образом? Были индивиды которые пихали скрипт в скрипт, а потом жаловались мол я такой кривой и неправильно им даю информацию. Скрытый текст using System.Collections; using System.Collections.Generic; using UnityEngine; public class FPSInput : MonoBehaviour { float x; float z; } Дальше создаём публичную переменную для нашего компонента CharacterController. Скрытый текст using System.Collections; using System.Collections.Generic; using UnityEngine; public class FPSInput : MonoBehaviour { float x; float z; public CharacterController chCtrl; } Дальше создаём трёхмерный вектор. Скрытый текст using System.Collections; using System.Collections.Generic; using UnityEngine; public class FPSInput : MonoBehaviour { float x; float z; public CharacterController chCtrl; Vector3 vector3; } Дальше создаём блок Update.(В нём код выполняется каждый кадр) Скрытый текст using System.Collections; using System.Collections.Generic; using UnityEngine; public class FPSInput : MonoBehaviour { float x; float z; public CharacterController chCtrl; Vector3 vector3; void Update () { } } Дальше присваиваем переменным x,y значения от нажатия клавиши, в данном случае метод GetAxis() из известного нами интерфейса Input возвращает какое-либо значение от тех кнопок которые указаны в настройках проекта, а в скобках указывается именно название элемента управления, Вам может показаться это очень странным но сейчас на этом не будем заострять внимание. Нужно присвоить X значение от клавиш по горизонтали, а Z по вертикали, следующий код делает именно это. Скрытый текст using System.Collections; using System.Collections.Generic; using UnityEngine; public class FPSInput : MonoBehaviour { float x; float z; public CharacterController chCtrl; Vector3 vector3; void Update () { x = Input.GetAxis("Horizontal"); z = Input.GetAxis("Vertical"); } } Дальше присваиваем вектору получившиеся значения. Скрытый текст using System.Collections; using System.Collections.Generic; using UnityEngine; public class FPSInput : MonoBehaviour { float x; float z; public CharacterController chCtrl; Vector3 vector3; void Update () { x = Input.GetAxis("Horizontal"); z = Input.GetAxis("Vertical"); vector3 = new Vector3(x, 0, z); } } Перед тем как передвинуть наш объект, нужно направить вектор в ту сторону, в которую смотрит наш объект.Сделать это можно следующей командой. Скрытый текст using System.Collections; using System.Collections.Generic; using UnityEngine; public class FPSInput : MonoBehaviour { float x; float z; public CharacterController chCtrl; Vector3 vector3; void Update () { x = Input.GetAxis("Horizontal"); z = Input.GetAxis("Vertical"); vector3 = new Vector3(x, 0, z); vector3 = transform.TransformDirection(vector3); } } Дальше уже с помощью ранее созданной переменной типа CharacterController мы передвигаем наш объект на те значения которые в векторе. Скрытый текст using System.Collections; using System.Collections.Generic; using UnityEngine; public class FPSInput : MonoBehaviour { float x; float z; public CharacterController chCtrl; Vector3 vector3; void Update () { x = Input.GetAxis("Horizontal"); z = Input.GetAxis("Vertical"); vector3 = new Vector3(x, 0, z); vector3 = transform.TransformDirection(vector3); chCtrl.Move(vector3); } } Сохраняем скрипт, в переменную в инспекторе перетаскиваем компонент CharacterController и запускаем, радуемся тому что можем бегать. Всё, данная часть урока закончена, до новых встреч. 1 где бы код изменить Работает - не трогай.©Любой программист Ссылка на комментарий
Comrade _Alexey 92 Опубликовано 2 Ноября 2017 Автор Поделиться Опубликовано 2 Ноября 2017 Создание первой игры на Unity: Часть 3. Сложность: #Средне. Версия движка:5.6.2f1. В этом уроке мы начнём наконец-то создавать HUD персонажа. А именно в начале разберёмся с анимациями оружия ГГ. Заранее скажу что я использовал худы оружия из NLC 7, за что выражаю авторам этого шедевра огромную благодарность. К счастью я облегчу Вам работу и скину файлы моделей с встроенными анимациями, все ссылки будут в конце статьи.Начнём с того что создадим новый скрипт под названием Ak74Gunslinger, почему так? Потому что худ буду использовать АК-74 Стрелка. После того как создали скрипт, прописываем нужные переменные, а именно: Скрытый текст using System.Collections; using System.Collections.Generic; using UnityEngine; public class Ak74Gunslinger : MonoBehaviour { public Animator _anm; } Тут я добавил переменную типа Animator, она нужна для управления компонентом Animator(Логично, не правда-ли?), теперь добавляем переменные для определения состояния оружия: Скрытый текст using System.Collections; using System.Collections.Generic; using UnityEngine; public class Ak74Gunslinger : MonoBehaviour { public Animator _anm; public bool hideWeapon; public bool reloadingWeapon; public bool hidingWeapon; public bool drawingWeapon; public bool _shoot; } Переменная hideWeapon будет определять в руках ли оружие у персонажа или оно скрыто, переменная reloadingWeapon будет определять происходит ли перезарядка оружия, переменная hidingWeapon определяет процесс убирания оружия, переменная drawingWeapon Скрытый текст (Насчёт названия без понятия, сама анимация доставания оружия называется Draw, что означает рисовать, не буду нарушать традиции и так-же назову переменную) определяет происходит ли доставание оружия из-за спины, переменная _shoot определяет происходит ли выстрел в данный момент, с состояниями оружия разобрались, теперь переходим к следующим переменным: Скрытый текст using System.Collections; using System.Collections.Generic; using UnityEngine; public class Ak74Gunslinger : MonoBehaviour { public Animator _anm; public bool hideWeapon; public bool reloadingWeapon; public bool hidingWeapon; public bool drawingWeapon; public bool _shoot; public AudioSource _as; } тут я добавил переменную типа AudioSource, это компонент AudioSource который ответственен за воспроизведение звука. Теперь нужны переменные которые будут содержать в себе различные звуки по типу выстрела и т.д. Скрытый текст using System.Collections; using System.Collections.Generic; using UnityEngine; public class Ak74Gunslinger : MonoBehaviour { public Animator _anm; public bool hideWeapon; public bool reloadingWeapon; public bool hidingWeapon; public bool drawingWeapon; public bool _shoot; public AudioSource _as; public AudioClip reloadClip; public AudioClip shootClip; public AudioClip holsterClip; public AudioClip drawClip; } reloadClip - звук перезарядки, shootClip - звук выстрела, holsterClip - звук убирания оружия, drawClip - звук доставания оружия. Всё, с переменными для данного этапа мы закончили, переходим к созданию логики. Первым делом добавим Update, и в него обработчики событий, всего их в Update будет четыре, этого хватит на данном этапе. Скрытый текст using System.Collections; using System.Collections.Generic; using UnityEngine; public class Ak74Gunslinger : MonoBehaviour { public Animator _anm; public bool hideWeapon; public bool reloadingWeapon; public bool hidingWeapon; public bool drawingWeapon; public bool _shoot; public AudioSource _as; public AudioClip reloadClip; public AudioClip shootClip; public AudioClip holsterClip; public AudioClip drawClip; void Update () { if() { } if() { } if() { } if() { } } } Тут я добавил четыре пустышки if, т.к. основных действий будет 4, стрельба, доставание оружия, убирание оружия, перезарядка. Анимации бега, шага и простоя пока что добавлять не будем, в следующем уроке как раз всё будет добавлено. Теперь начинаем эти пустышки наполнять, первая пустышка будет отвечать за доставание оружия. Скрытый текст if(Input.GetKeyDown(KeyCode.Alpha3) & hideWeapon & !reloadingWeapon & !_shoot & !hidingWeapon & !drawingWeapon) { _anm.Play("Draw"); _as.PlayOneShot(drawClip); } Условие я думаю понятно, я прекрасно всё расписал что за что отвечает в самом начале. Теперь переходим к тому что написано внутри конструкции, а именно к первой строчке, мы в ней запускаем произведение анимации, во второй строчке мы запускаем единократное произведение аудиоклипа, в первом случае в качестве параметра я указываю название анимации, во втором случае напрямую указываю переменную в которой содержится клип. Теперь я покажу в следующем листинге все заполненные пустышки, ибо они однотипные по своему составу. Скрытый текст using System.Collections; using System.Collections.Generic; using UnityEngine; public class Ak74Gunslinger : MonoBehaviour { public Animator _anm; public bool hideWeapon; public bool reloadingWeapon; public bool hidingWeapon; public bool drawingWeapon; public bool _shoot; public AudioSource _as; public AudioClip reloadClip; public AudioClip shootClip; public AudioClip holsterClip; public AudioClip drawClip; void Update () { if(Input.GetKeyDown(KeyCode.R) & !reloadingWeapon & !_shoot & !hideWeapon & !hidingWeapon & !drawingWeapon) { _anm.Play("Reload"); _as.PlayOneShot(reloadClip); } if(Input.GetKeyDown(KeyCode.Alpha3) & hideWeapon & !reloadingWeapon & !_shoot & !hidingWeapon & !drawingWeapon) { _anm.Play("Draw"); _as.PlayOneShot(drawClip); } if(Input.GetKeyDown(KeyCode.Alpha3) & !hideWeapon & !reloadingWeapon & !_shoot & !hidingWeapon & !drawingWeapon) { _anm.Play("Holster"); _as.PlayOneShot(holsterClip); } if(Input.GetMouseButtonDown(0) & !reloadingWeapon & !_shoot & !hideWeapon & !hidingWeapon & !drawingWeapon) { _anm.Play("Shoot"); _as.PlayOneShot(shootClip); } } } Теперь напишем функции для событий в анимациях, они нужны для того что-бы не мучать себя лишним кодом в Update. Снизу будет абсолютно весь скрипт, ибо смысла разделять его больше нету. Скрытый текст using System.Collections; using System.Collections.Generic; using UnityEngine; public class Ak74Gunslinger : MonoBehaviour { public Animator _anm; public bool hideWeapon; public bool reloadingWeapon; public bool hidingWeapon; public bool drawingWeapon; public bool _shoot; public AudioSource _as; public AudioClip reloadClip; public AudioClip shootClip; public AudioClip holsterClip; public AudioClip drawClip; void Update () { if(Input.GetKeyDown(KeyCode.R) & !reloadingWeapon & !_shoot & !hideWeapon & !hidingWeapon & !drawingWeapon) { _anm.Play("Reload"); _as.PlayOneShot(reloadClip); } if(Input.GetKeyDown(KeyCode.Alpha3) & hideWeapon & !reloadingWeapon & !_shoot & !hidingWeapon & !drawingWeapon) { _anm.Play("Draw"); _as.PlayOneShot(drawClip); } if(Input.GetKeyDown(KeyCode.Alpha3) & !hideWeapon & !reloadingWeapon & !_shoot & !hidingWeapon & !drawingWeapon) { _anm.Play("Holster"); _as.PlayOneShot(holsterClip); } if(Input.GetMouseButtonDown(0) & !reloadingWeapon & !_shoot & !hideWeapon & !hidingWeapon & !drawingWeapon) { _anm.Play("Shoot"); _as.PlayOneShot(shootClip); } } void reload(int i) { Debug.Log(i); if(i == 1) { reloadingWeapon = true; } if(i == 0) { reloadingWeapon = false; } } void shoot(int i) { Debug.Log(i); if(i == 1) { _shoot = true; } if(i == 0) { _shoot = false; } } void holsterWeapon(int i) { Debug.Log(i); if(i == 1) { hidingWeapon = true; } if(i == 0) { hidingWeapon = false; hideWeapon = true; } } void drawWeapon(int i) { Debug.Log(i); if(i == 1) { drawingWeapon = true; } if(i == 0) { drawingWeapon = false; hideWeapon = false; } } } Тут всё просто, мы создаём однотипные функции в которых мы при вызове проверяем входное значение и уже дальше изменяем значения логических переменных. Разберём первую функцию, функция называется reload и имеет входящий параметр типа int, в самом теле функции есть две проверки, одна проверяет i на 1, другая на 0. Скрытый текст Тут идёт аналог с языком СИ, в нём логическое значение true было любое число больше 0, а false соответственно равно 0, и тут так-же, так как события анимаций почему-то не поддерживают тип bool, то приходиться так костылить В теле if происходит соответствующие этапу выполнения события различные действия, к примеру у нас в анимации перезарядки в начале воспроизведения анимации функция выполняется с входным числом 1, т.е. выполняется первая проверка, когда наступает конец анимации соответственно выполняется выполняется вторая проверка, т.к. я у себя установил в событии 0. Ну-с, всё, с кодом разобрались, теперь в редактор пора идти ! Запускаем нашу любимую сцену с капсулой. Перед тем как начать что-то делать нужно экспортировать мой ассет ссылка на который будет в самом низу. После того как всё сделали с экспортом открываем папку Ak74Gunslinger и в ней видим папку с названием Animations, в ней лежит файл под названием Draw, это цельная модель, в ней уже есть встроенные анимации, перетаскиваем данный объект в иерархию и присваиваем сфере, сделав тем самым её родителем модельки. Всё выглядеть должно примерно так. Скрытый текст Теперь нужно повернуть саму модель на 180 градусов по оси Y, в положительном направлении. что-бы получилось так. Скрытый текст Цитата Зачем поворачивать? По неизвестной мне причине худы из сталкера при старте игры сами поворачиваются на 180 градусов Так-же нужно изменить координаты объекта на те которые на скриншоте сверху. Теперь создаём контроллер анимаций, создать его можно нажав ПКМ в папке с ассетами в окне Project. Переименовываем мы его к примеру в Ak74Controller. Теперь нужно создать события на анимациях. Для этого в окне Project находим нужную нам анимацию, так как у меня уже всё сделано то я покажу только как настроить одну, щёлкаем на найденную анимацию, и смотрим в окно Inspector, там должно быть три вкладки и щёлкаем на вкладку Animations. Скрытый текст Дальше листаем вниз в инспекторе до строчки Events и нажимаем на неё и видим примерно такую вот картину. Скрытый текст Дальше нужно добавить событие в анимацию, для этого нужно нажать на следующую кнопку. Скрытый текст Теперь в таймлайне появилась вот такая метка. Скрытый текст Нажимаем на неё, и теперь можем редактировать поля данного события. В поле Function находиться название функции, в которую мы будем передавать значение. В поле float мы вводим дробное десятичное число. В поле int мы вводим целое число. В поле String мы вводим строку. В поле Object мы указываем скрипт, самое интересное то что тут выбирается скрипт не из иерархии, а из папки проекта , теперь просто в каждом событии указываем соответствующие параметры. Пример Скрытый текст После того как что-то либо сделаете и Вам нравиться данное изменение то можете применить все настройки. Сделать это можно нажав на кнопку Apply. Когда расставите все нужные события во всех анимациях Скрытый текст Под всеми анимациями я имею ввиду те, в которых нужно это делать, а именно, Draw, Holster, Reload,Shoot. В каждой анимации нужно сделать как минимум два события, в начале и в конце анимации. то переходите к настройке Animator'a. Открываем объект Draw и перетаскиваем ранее созданный контроллер анимаций в поле Controller компонента Animator. Теперь выбрав этот объект ещё раз переходим в окно Animator, когда Вы перешли то увидели почти пустое окно. Скрытый текст Подробно разбирать что и как тут я не буду, лишь скажу что в отделе Parameters находятся различные переменные которые можно так-же использовать для управления логикой анимаций, в отделе Layers находятся различные слои, что это такое я тоже в будущем постараюсь объяснить. Нас на данный момент интересует только один момент, это добавление нод в главное окно аниматора, что-бы добавить новую ноду содержащую анимацию достаточно просто перетянуть из папки проекта анимацию в окно аниматора, При этом название ноды по умолчанию будет такое, какое находиться в данном окне. Скрытый текст Самой первой нужно добавить ноду анимации Draw, что-бы она стала стандартной, потом нужно добавить анимации Holster, Idle, Shoot,Reload. У меня всё это дело выглядит так. Скрытый текст Так-же нужно добавить некоторым анимациям переходы. Для этого нажимаем на ноду ПКМ и щёлкаем в выпавшем списке на строчку Make Transition и щёлкаем на нужной ноде уже ЛКМ. Нужно сделать так-же как и у меня на верхнем скрине. Всё, готово, теперь переходим к настройке скрипта самого оружия, для этого переносим скрипт на объект, в моём случае это Draw и перетаскиваем аудиоклипы и сопутствующее в нужные переменные . Всё должно выглядеть так. Скрытый текст Всё, можем, запускать игру. Сами модели,анимации и прочее : https://yadi.sk/d/A4Ktwt5q3PLRCR Следующий урок выйдет как только у меня будет время для написания оного. До новых встреч. 1 где бы код изменить Работает - не трогай.©Любой программист Ссылка на комментарий
Рекомендуемые сообщения