Overview
Первое знакомство с системой пользовательских модификаций для ATOM RPG
Предисловие
Данная инструкция будет постоянно пополняться.
ModKit – это прежде всего инструмент для загрузки информации из мода в игру. Уровень возможностей напрямую зависит от способностей работающего с ним пользователя.
Стоит выделить три основных уровня использования инструментария модемейкером (разработчиком мода):
– Начальный. На этом уровне модемейкер изменяет и добавляет игровые объекты на основе базовых игровых моделей, пользуясь только игровым функционалом.
– Любительский. На этом уровне модемейкер вкупе с базовым функционалом добавляет в игру уже готовый для внедрения сторонний функционал. Для этого уровня необходимы базовые знания основ 3d-моделирования и внедрения в игру своих FX-эффектов.
– Профессиональный. Для полноценного использования данного инструмента модемейкер должен обладать углубленными знаниями гейм-дизайна Unity и уметь писать скрипты на языке C#. Без специальных знаний изменение игровых механик для обычного игрока не представляется возможным.
Установка и знакомство с Unity + Modkit
1. Для того чтобы создавать моды к игре Atom RPG, вам понадобится среда для разработки игр Unity 2019.4.28 [link]
и проект ModKit, [link]
После установки и запуска Unity откройте проект ModKit.
2. Редактор Unity
Редактор Unity обладает стандартным оконным интерфейсом, наиболее важными для создания модов особенностями которого являются следующие:
1. Hierarchy/Иерархия – в ней изображены все элементы, присутствующие в сцене.
2. Scene/Сцена – экран со сценой, которую вы в данный момент открыли.
3. Inspector/Инспектор – демонстрирует все свойства, которыми наделён выбранный в сцене объект.
4. Project/Проект – дерево папок проекта.
5. Файлы проекта, включённые в открытую папку.
6. Список функций Modkit (далее модкит).
Термины, необходимые для работы в редакторе:
1. AssetАссет – игровой объект Unity, в котором прописываются структурные данные о любом игровом объекте. Является ключевым объектом.
2. GameObject – физический объект Unity, содержащий внутри себя модели, эффекты, анимацию и т. д. Жестко привязан к ассету и должен иметь такое же имя.
3. PrefabПрефаб – объект Unity для компоновки 3D-объектов (мешей) в единое целое с последующим выводом на игровую сцену. Может включать в себя вложенные префабы (сколько угодно), но не может включать в себя другой GameObject.
4. MeshМеш – структурная часть 3D-модели, т. е. сама её основа, состоящая из полигональных сеток.
5. 3D-model3D-модель – совокупность частей, в которую входят меши, rigскелет, анимация модели, материалы и текстуры.
6. Textureтекстура – растровое изображение, накладываемое на поверхность меша для придания ему цвета, окраски или иллюзии рельефа.
7. Materialматериал – карта текстур, накладываемая на 3D- модель.
8. SpriteСпрайт – растровое изображение, используемое для вывода на элементы сцены, не являющиеся 3D-объектами.
9. Levelуровень – игровая зона, на которой размещаются статичные и динамические объекты. Включает в себя террейн и логические слои, на которых производится обсчет игровых событий.
10. Terrainтеррейн – 3D-модель игровой поверхности. Графическая основа игрового уровня.
Внимание! Важно!
Поскольку Atom RPG является коммерческим проектом, модкит не открывает доступ ко всем исходникам игры. Через него вы не сможете извлечь модели, анимацию, звуки и прочие игровые ресурсы.
Но вы можете заменять их своими, подменяя их под схожими названиями, или добавлять новые.
3. Обзор игровых ресурсов (Asset Viewer)
Для внесения изменений в уже готовые базовые ассеты необходимо воспользоваться инструментом Asset Viewer.
Окно для просмотра добавленных в игру объектов Asset Viewer открывается по клику на указанную выше строку в меню.
Самые важные аспекты этого окна:
1. Чтобы редактировать ассет, необходимо сперва скачать его в проект правым кликом мышки с последующим кликом на кнопку DownloadСкачать.
2. Поисковое окно для нахождения нужных ассетов по названию.
3. Поиск по категориям ассетов.
Кнопка Reload используется для перезагрузки пакета ассетов.
Кроме того, AssetViewer можно использовать для просмотра ассетов через левый клик по ним. Настройки ассета после этого отобразятся в окне InspectorИнспектор.
4. Настройка карт проходимости (Path Editor)
1. Очистить карту проходимости. Это действие требуется выполнять при создании новой карты и после любых изменений размеров карты.
2. Выполнить генерацию расчета лучей для определения проходимости.
3. Построить карту проходимости на основе данных расчета лучей.
5. Сборка модификации (Build Mod)
1. Чтобы собрать модификацию, выберите в главном меню “Game” -> “Build Mod”
2. Введите имя мода. Необходимо полное совпадение названия с тем, что было ранее указано в файле Scripts/MyMod в поле “Name”.
3. Нажмите BUILD
После того как модификация будет собрана, откроется папка Mods. Убедитесь, что в ней появились 3 файла, названия которых содержат название вашего мода с расширениями dll, pdb и _resourses. Если хоть одного из этих файлов нет – значит сборка прошла с ошибками, и вам необходимо устранить их, а потом заново собрать мод.
Для публикации модификации в Steam Workshop вам нужно будет подключиться к аккаунту Steam. Сам Steam должен быть запущен на вашем PC не в автономном режиме (осуществлен вход в систему).
Для тестирования мода публикация в Steam Workshop не обязательна.
6. Запустите игру чтобы убедиться, что модификация работает.
Активируйте своё творение, перейдя в раздел “Модификации”.
Изучите содержимое файла %AppData%/Username/LocalLow/AtomTeam/Atom/output_log.txt (где Username – имя вашей учетной записи Windows).
При успешной загрузке в строке “Mod Init” вы должны увидеть название своего мода. Далее изучите последующие строки с именем вашего мода на предмет возможных ошибок.
Выходить из игры для изучения лога не обязательно. Наблюдение за правильной работой мода можно осуществлять в реальном времени.
Игровые прототипы
В игре используются ассеты-прототипы, в которых содержится игровая информация. Рассмотрим каждый прототип на примерах.
Чтобы изменить базовый игровой прототип, перейдите в Asset Viewer, выберите категорию, файл, через контекстное меню (ПКМ) > Download).
ItemProto(Предметы):
Icon – игровая картинка предмета.
Localization – специальный ID для локализации.
Cost – базовая стоимость в рублях.
Weight – вес в граммах (250 = 250 грамм).
Collectable – возможность сбора предметов в группу.
Modifiers – модификаторы предмета, которые активируется, если предмет находится в слоте.
AmmoProto(Патроны):
Armor Mod – в данный момент параметр отключен, не используется.
Resistance Mod – параметр пробития брони от -100 до 100, чем ниже, тем больше урона проходит.
Damage Mod – множитель урона.
Bullet – количество поражающих элементов в патроне (пуля или кол-во дробинок).
Dispersion – параметр разлета поражающих элементов (разброс).
WeaponProto(Оружие):
Weapon Type – тип оружия.
Ammo – тип используемых патронов.
Ammo Capacity – количество патронов в обойме.
Both Hands – двуручное оружие.
Damage Min – минимальный базовый урон.
Damage Max – максимальный базовый урон.
Damage Radius – радиус урона (для гранат).
Fatality – шанс мгновенно убить врага с одного выстрела.
Perks – особенности оружия.
Damage Type – тип урона.
Single, Aimed, Burst, Reload – режимы стрельбы оружия
AP – стоимость действия в ОД.
Range – дальность выстрела.
Shots – количество выстрелов за одно действие.
Dispersion – разброс пуль при выстреле. Указан при максимальной дальности.
Mode Type – особый тип режима (используется для определения названия и анимации).
Sounds – звуки.
Effects – специальные эффекты оружия.
Requirements – рекомендуемые требования к оружию.
No Ammo Sounds – звуки отсутствия патронов.
Pre Attack Sounds – предварительный звук атаки данного оружия.
UniformProto(Одежда)
Uniform Type – тип одежды.
Hide Mask – скрытие бороды, прически.
Armor Durability – шанс противодействия критическим попаданиям для брони, шанс покрытия защиты от урона у щита (от 0 до 100).
Rules – особенности применения одежды.
RulesEx – дополнительные особенности применения одежды.
Perks – особенности одежды.
MemoProto(Записки/Книги)
Note – скрипт записки/книги.
ExplosiveProto(Взрывчатка)
Damage Min – минимальный базовый урон.
Damage Max – максимальный базовый урон.
Damage Radius – радиус взрыва.
Boom Sounds – звук взрыва.
ChestProto(Ящик)
Boom – визуализация взрыва.
Damage Treshold – порог урона.
Hit Points – очки прочности (жизни).
Remove On Destroy – удалить объект при разрушении.
Locker Key – особый ключ.
Sound Open – звук открытие/закрытия.
Sound Locked – звук открытия замка.
DoorProto(Дверь).
Boom – визуализация взрыва.
Damage Treshold – порог урона.
Hit Points – очки прочности (жизни).
Remove On Destroy – удалить объект при разрушении.
Locker Key – особый ключ.
Sound Open – звук открытие/закрытия.
Sound Locked – звук открытия замка.
Sound Close – звук закрытой двери.
ConsumableProto(Расходные предметы)
Effects – эффекты при употреблении.
Can Use In Battle – возможность использования в бою.
Use Sound – звук использования.
Use AP – стоимость применения.
Use Distance – дистанция применения.
CreatureProto(Существо)
Sounds – звуки.
Anim Sound – анимационные звуки.
Sound Settings – настройки звука.
Move Speed Walk – скорость ходьбы.
Move Speed Run – скорость бега.
Shape Chance – форма препятствия при расчете шанса попадания.
Creature Type – типа существа.
Gender Type – пол существа.
Blood Blob – пятно крови.
Blood Slash – брызги крови.
Bloob Sclae – масштаб пятна крови.
Ragdoll – скрипт настройки поведения физической модели при смерти.
Unarmed1/Unarmed2 – базовые оружие как рука/нога
Animator Controller – специальные заменяющие анимации при определенном поведении существа. Так называемое дерево анимаций.
Abilities – специальные умения существа.
CharacterProto(Персонаж)
AI Behavoir – базовая логика поведения персонажа в бою.
Dialog – скрипт диалога с персонажем.
On Pocket – скрипт осмотра карманов(у трупа). При его отсутствии будет отображаться только содержимое инвентаря трупа. В скрипте же можно прописать снятие шкуры, вырезание мяса, а так же ограничить подбор инвентаря жертвы.
Talk Add Dist – дополнительная дистанция для активации диалога по клику.
Back To Position – специальная возможность для возврата персонажей(например охранников) в точку после боя.
Store Stats – сохранить характеристики персонажа в игровое сохранение.
Summon – возможность призывать союзников при нападении.
Summon Add Dist – дополнительная дистанция для призыва союзников.
Summon Visibility – проверка прямой видимости при призыве союзников.
Battle Add Dist – дополнительный радиус видимости во время боя.
Shiftable – возможность сдвинуть персонажа через контекстное меню.
Spec Tree View – дерево способностей персонажа.
Accepting Restriction – ограничения для приема предметов от других персонажей.
Specialty Mask – особые ограничения для персонажа.
Stats – параметры персонажа.
InteractiveProto(Интерактивный объект)
Boom – визуализация взрыва.
Damage Treshold – порог урона.
Hit Points – очки прочности (жизни).
Remove On Destroy – удалить объект при разрушении.
Interact – скрипт взаимодействия с предметом.
Show Use Anim – анимация взаимодействия персонажа с объектом.
Can Use In Battle – возможность взаимодействовать в бою.
Interact Type – вариации использования.
EffectProto(Эффект)
Icon – иконка.
Chance – шанс применения эффекта.
Gender Restriction – ограничения по признаку пола.
Addiction – привыкание.
Modifiers – модификаторы.
Applyers – применение.
EncounterProto(Случайные встречи)
Chance – шанс встречи.
Period – фаза времени.
Trigger – глобальное условие для активации(если не пусто).
Trigger Invert – обратное условие.
Trigger Reset – сброс условия после нахождения встречи.
Can Skip – возможность пропустить встречу.
Can Attack – возможность атаковать первому.
Once – уникальная встреча(только один раз).
Icon – иконка.
Desc – описание(ID локализации).
Enter – описание опции входа(ID локализации).
Show Intro – показать ролик.
Levels – игровые уровни для генерации данной встречи.
Chances – специальные опции.
Requirements – требования для нахождения встречи.
Requirements – дополнительные требования.
MiniMapProto(Мини-карта)
Id – уникальный идентификатор
Place Type – тип локации.
X, Y – позиция локации на глобальной мини-карте.
W, H – размер локации на глобальной мини-карте.
Localization – название локации(ID локализации).
AvaProto(Аватар)
Hair Color – цвет волос.
Hair – прическа.
Beard – борода.
Gender – пол.
CraftProto(Крафт)
Result – Получаемый предмет.
Result Count – количество получаемых предметов при крафте.
Difficult – сложность.
Ingredients – ингредиенты.
Создание уровня
Создание нового игрового уровня необходимо начинать с создания сцены в Unity.
Перейдите в директорию Scene и вызовите контекстное меню Create > Scene. Зададим для примера название Test
Открываем ранее созданную сцену и создаем объект (Create Empty) с именем Level
Обнуляем координаты Position и добавляем компонент Environment Level
Добавляем местность, например 3D Object > Terrain
(Важно! Все статические объекты (дома, деревья, прочий антураж), которые не являются интерактивными, должны содержаться внутри объекта Level. В противном случае они не будут отображаться в игре.
Настраиваем размер местности в 50 клеток (тайлов), 1 клетка = 2 единицы в Unity. Для примера используем параметры Terrain Width 100 и Terrain Length 100.
Выставляем теги PathGround и слой Level.
Добавляем объект в Level, называем Path. Далее добавляем компонент Pathfinder(карту проходимости). Настраиваем карту для поиска путей в 50 клеток.
Теперь переходим в Path Editor и выполняем последовательно:
1. Clean Map – очистить карту.
2. Calculate raycast highest – вычисление лучей для препятствий на карте.
3. Calcuate passability – выполнить расчет проходимости карты.
Теперь добавляем точку входа на локацию в Level и называем её EnterPoint (обязательно)
Первая тестовая локация готова. Теперь выполняем команду Save Level, и можно приступать к сборке мода (Game > Build Mod). Протестировать в игре уровень можно через консольную команду “ChangeLocation ИмяСцены ИмяТочкиВхода”, например, “ChangeLocation Test EnterPoint”.
Новый персонаж
Для создания нового персонажа выберите Game > Entities > Create Character Prototype, сохраните в директорию Assets/Resources/Entities/Character. Назовем нового персонажа именем Test.
Чтобы упростить создание нового диалога, можно взять готовый из игры и переименовать его для своих целей.
Возьмем для примера диалог Александра, сделаем Download (загрузим) и переименуем в Test.
Теперь подключим тестовый диалог к новому персонажу.
Теперь можно добавить нового персонажа на сцену. Создаем пустой объект и добавляем компонент Character Component, выставляем в поле Character созданный персонаж Test, а в Creature переносим из Asset Viewer (через drag&drop) любой тип существа.
Теперь можно сохранить Save Level и выполнить тестирование уровня в игре.
Внимание! Внедрение в мод полного прототипа существ “со стороны” требует расширенных знаний 3d-моделирования и анимации персонажей. Непосвященному в таинства гейм-дизайна человеку мы рекомендуем изучить руководства Unity по данному вопросу.
В игре используются скелеты моделей от Mixamo. Модель, скелет которой создан в Mixamo, будет автоматически подстраиваться под игровой анимационный контроллер.
Для анимации других скелетов контроллер придется настраивать вручную (пример контроллера есть в модките на основе прототипа волка).
Node Editor и первый диалог
Давайте рассмотрим пример тестового диалога. Для этого нужно перейти в следующую директорию: Assets/Resources/Entities/Dialog
Далее выбрать файл MyNPC и в инспекторе открыть специальное меню под названием (Node Editor).
Node Editor – это гибкий инструмент для создания визуальных скриптов: от диалогов до генерации уровней и поведения персонажей.
На примере MyNPC рассмотрим операции в диалоге.
1. Точка начала скрипта (START).
2. Старт нового диалога с персонажем (DialogBegin).
3. Фраза персонажа, с которым говорит Главный Герой (Phrase).
4. Ответ Главного Героя (Answer).
5. Пустышка, он же соединительный блок, позволяющий строить сложные логические схемы и ветвления.
6. Условие проверки на наличие предмета (в данном случае EPistol) в инвентаре Главного Героя.
Чтобы изменить данные, выделите блок.
Для создания нового блока ПКМ в пустой области и выберите тип.
Чтобы создать связь между блоками, зажмите свободный нижний порт первого блока и соедините с нужным блоком.
Важно! Порядок выполнения выходов из блока очень важен: алгоритмы выполняются слева направо. Если из блока-пустышки выходят четыре линии с визуально тупиковыми условиями, то они выполнятся все, начиная с левой и заканчивая последней правой.
Добавление оружия, предметов, интерактивных объектов
Игровые объекты состоят из прототипа (Prototype) и визуальной составляющей (Prefab), и должны находиться в паре.
Чтобы изменить существующие, достаточно загрузить их из AssetViewer и выполнить нужные модификации. Но чтобы создать новый тип, понадобится еще визуальная составляющая.
Тестовый мод содержит примеры, как добавить новые объекты в игру.
Главные особенности, которые всегда нужно учитывать:
– Связь от префаба к прототипу. Например, перфаб EPistol содержит WeaponComponent в котором указан прототип EPistol.
– Физическая модель для взаимодействия с выбором объекта. Обычно это Box Collider.
– Дополнительные скрипты для игровой визуализации объектов. Например, Weapon Link для оружия. Этот компонент содержит специальные настройки эффектов.
Пример префаба нового оружия.
Пример префаба новой униформы.
Пример префаба нового объекта “ящик”.
Добавление персонажей в существующие локации
Что бы добавить нового персонажа в существующих локацию:
Находим скрипт локации, для примера, добавим персонажа в КРЗ центр(City_2), в Asset View ищем Level_City_2 и скачиваем найденный скрипт(Download).
Добавляем создания персонажа:
1. Добавим проверку на создание HasKeyword, Key: MY_MOD_CITY_INIT и соединим START с новым логическим блоком.
2. Если реестр объекта еще не был создан – создадим. Key: MY_MOD_CITY_INIT
3. Добавим Spawn point, Position: 154.17, -2.171893, 132.62 – это позиция лавочки, возле памятника Ленина.
4. Теперь создадим персонажа. Что бы применить поведение персонажа – сидит, нужно найти : Asim.sitting_1 в Asset View и перетянуть на требуемое поле, “Bahavior”.
Теперь соберем мод и проверим.
Описание предметов, персонажей и квестов.
Что бы внести описание новых объектов, нужно сгенерировать уникальные ID локализации, делает через Game > Localization > Generate String Localization
Будут созданы файлы в папке Localization: strings_ru, strings_en. Открыв которые Вы сможете добавить уникальное описание для новых объектов.
После добавления описания, файлы нужно переименовать для правильной загрузки из мода.
Например: strings_ru в mymod_strings_ru, strings_en в mymod_strings_en
ВАЖНО: Все новые квесты и локации будут автоматически добавлены при генерации, а что бы обновить уже существующий файл mymod_strings_ru, нужно его переименовать в strings_ru и выполнить (Game > Localization > Generate String Localization)
—Базовый курс—
Базовое знакомство с модкитом и некоторыми особенностями движка Unity.
Создание и редактирование диалогов
Редактирование оригинального диалога
Для редактирования оригинальных игровых диалогов, вам требуется запустить Asset Viewer
Выбрать категорию dialog
выбрать нужный из списка и правой кнопкой мышки загрузить его себе в проект и начать редактирование, также можно посмотреть диалог без загрузки себе в проект, через Node Editor (В таком режиме сохранять изменения будет нельзя, но можно копировать ноды себе в скрипты)
Создание диалога
Для создания своего диалога вам потребуется скачать любой оригинальный диалог и переименовать его, либо сделать копию тестового диалога через проводник Windows.
Для примера, скачаем диалог zvezda_pronin и переименуем его в primer1
Выделяем диалог и открываем в Node Editor
Этот простой диалог показывает основные элементы создания диалога, а именно DialogBegin (Начало диалога), Phrase (Фраза НПЦ), Answer (Ответ Главного героя), Dialog continue (Далее), DialogEnd (закрыть диалог). DialogShowName – показывает имя персонажа под его портретом. IsFemale логическая проверка, является ли наш ГГ женщиной, если да, то вариант фразы нпц содержит текст для Ж персонажей, если нет, то для М.
Теперь выделяем весь код, кроме DialogBegin и удаляем клавишей Del
Создадим стартовую фразу. “ Привет! Это тестовый урок!”
Добавим несколько вариантов ответов.
Добавляем события который произойдут после нашего ответа, в нашем случае – в первую ветку добавление опыта. Во второй проверка ГГ на пол. В зависимости от пола будет разный диалог. В третьей просто закрыть диалог.
Теперь потребуется создать вариант ответа нпц и вариант ответа ГГ чтобы завершить диалог.
Назначьте ваш диалог тестовому нпц, скомпилируйте мод и посмотрите результат в игре.
Создание нового рецепта и записки
Создание рецепта
Создаём Create Craft Prototype (Крафт прототип) – в данном прототипе мы задаем индигриенты для крафта, шанс и предмет, который мы получим при успешном крафте.
Назовём его CraftTest
Result – Получаемый предмет.
Result Count – количество получаемых предметов при крафте.
Difficult – сложность крафта.
Ingredients – ингредиенты.
Dependencies – Позволяет при крафте изучить дополнительные рецепты. Например, при изучении оружия открывает рецепт на порох и боеприпасы.
Sound Create – Звук успешного крафта.
Sound Fail – Звук провального крафта.
Для нашего урока, сделаем крафт тестовой модели шлема из прошлых уроков, а вот ресурсы будем использовать из игры. Для этого используем Asset Viewer и используем категорию item.
Листаем ниже и находим Wood и Wires и загружаем их себе в проект. (Если не прогрузились картинки нажмите кнопку Reload)
Используем их в нашем рецепте. Добавим в результат наш шлем и создадим требовоания в 2 индигриента.
Добавляем для каждого Element 0 и Element 1
Cout – количество требуемого материала
Variants – материал
Consumable – выставим да, данный чек бокс отвечает будет ли израсходован данный материал при крафте или нет.
Наш новый рецепт готов. Данный рецепт можно уже выучить экспериментом в игре.
Создание записки
Создаем прототип Мемо Create Memo Prototype – в данном файле мы сделаем возможность изучение нашего рецепта через записку.
Назовём его MemoTest и сохраним его в папке Мемо.
Дальше нам потребуется уже готовый файл Json любой записки.
Для этого воспользуемся Asset Viewer
Выбираем категорию Memo
Находим Craft_book2 и загружаем её в свой проект.
Переименуем её в аналогичное имя которые мы создали для ассета в memotest.
Теперь откроем наш скрипт
И заменим в PlayerAddRecipe на наш новый созданный рецепт.
Удаляем всё лишнее и создаем новое описание. Изменим имя ключа GOT_CRAFTBOOK_2, на CRAFT_TEST_1 который выполняет роль триггера – означающий что рецепт был прочитан и изучен.
Выходим из редактора нод и выделяем наш ассет MemoTest
Icon – игровая картинка предмета.
Localization – специальный ID для локализации. В нашем случае пишем memo.memotest.
Takeable– возможность использовать предмет в инвентаре.
Cost – базовая стоимость в рублях.
Weight – вес в граммах (250 = 250 грамм).
Collectable – возможность сбора предметов в группу.
Modifiers – модификаторы предмета, которые активируется, если предмет находится в слоте.
Note – вот тут мы и укажем наш созданный скрипт.
Рецепт готов.
Создание торговца
Для создания торговца нам потребуется.
- Создать персонажа (Character).
- Прописать характеристики персонажу.
- Подобрать торговцу модель из оригинальной игры.
- Создать диалог.
- Создать скрипт поведения для торговли.
Для удобства, за основу нашего торговца, мы возьмем торговца из Отрадного. Для этого воспользуемся Asset Viewer
Выберем категорию поиска Character (Можно искать по иконке нужного нам персонажа, если иконки не отображаются, то требуется нажать кнопку Reload)
Воспользуемся поиском
И загружаем данный ассет себе в проект.
Переименуем его в test_trade
Так же можно изменить иконку персонажа или оставить оригинальную из игры. Имя так же задается в файле локализации, мы можем изменить имя ссылки на локализацию, что мы и сделаем.
Навыки торговли у персонажа напрямую влияют на ценообразование у данного торговца поэтому изменим их в сторону увеличения. Для наглядности.
Alertness влияет на возможность обворовать данного персонажа.
Вот мы и создали персонажа Character.
Теперь будем использовать оригинальные модели персонажей для нашего торговца.
Воспользуемся Asset Viewer выбираем категорию Creature
Все это модели можно использовать для неигровых персонажей. Воспользуемся базовой моделью персонажа из игры. Загрузим BaseMale7. (Позже он нам понадобиться.)
Теперь загрузим любой базовый диалог через Asset Viewer. Например, zvezda_pronin и переименуем его в test_trade.
Открываем наш диалог и удаляем все лишнее
Теперь установим в данном диалоге в DialogBegin чекбокс CanBarter
Теперь благодаря этому у нашего НПЦ появилась кнопка торговли в диалоге.
Создадим простой диалог с возможностью начать торговлю.
Итого мы сможем начать торговлю с нпц через кнопку торговли в диалоге, а также через вариант ответа.
Теперь нам потребуется создать скрипт с генерацией товаров. Воспользуемся уже готовым вариантом.
Открываем Asset Viewer выбираем категорию Behavior и в поисковой строке вводим trader
Загружаем Village.Trader и переименуем его в trade_behavior
открываем его
Удаляем не используемые нами ноды, а именно
Данное состояние и анимацию, торговец использует для воспроизведения анимации облокачивая на стойку в Отрадном.
CharacterInBattle оставим – это проверка на состояние находится ли персонаж в бою.
Делаем всё как на картинке ниже
Данный скрипт выполняет следующие. Каждые 6 часов наш торговец будет продавать часть товаров из инвентаря и за них получать деньги, после этого произойдёт генерация инвентаря на выбор из 4-х. В каждом из них прописаны товары.
GoodAndMoney – переводит скопившийся товар в деньги
InventorySet– генерация инвентаря
Чекбокс Random – если отключить, то весь список будет добавлен торговцу. Если вкл, то из всего этого списка, каждая единица товара, будет проходить цикл случайности.
Теперь добавим наш диалог созданному торговцу
Создаем на тестовой карте нового персонажа и дадим ему название Trader
И добавим нашему персонажу компоненту Character Component
Теперь назначим ему наш загруженные ранее BaseMale7 в Type и выставим ему наш Character , а так же наш скрипт генерации инвентаря , поправим координаты и сделаем наглядным отображение.
Наш торговец готов.
Создание квеста
Для создания квеста воспользуемся тестовым персонажем из нашего урока “создание диалогов”.
(Создание описания для предметов, квестов и других моментов, будет рассмотрено отдельным уроком “Создание локализации”.)
За весь квест отвечают эти Ноды
QuestBegin – начать квест. Будет сделана соответствующая запись в дневник ГГ.
QuestDone – квест выполнен. Будет сделана соответствующая запись в дневник ГГ.
QuestStatus – проверка статуса квеста.
Создадим простейший квест, в котором нашему НПЦ потребуется вернуть ПТРД.
Сделаем проверку на наличие квеста у ГГ, и добавим варианты ответа если квест выполнен, активен, и ещё не взят.
В первом случае у нас будет вариант событие если квест уже взят. Во втором случае никакого дополнительного ответа более не появится, так как квест уже выполнен. В третьем случае наше первичное знакомство с квестом.
Создадим для третьего пункта, ответ НПЦ и создадим начало квеста.
Где важно отметить, что для QuestBegin потребуется создать уникальную переменную как указано на рисунке.
И ее же мы будем использовать для поиска и закрытия квеста.
Теперь создадим условия для проверки наличия ПТРД у игрока (Предварительно потребуется загрузить ассет оружия через Asset Viewer в категории Weapons)
Воспользуемся выбором нод Inventory и нодой InventoryHasItem для поиска наличия предметов в инвентаре у персонажей.
Обязательно укажем в каком инвентаре искать данный предмет, в нашем случае у игрока Player. И сделаем два варианта ответа, при наличии и отсутствии предмета.
Далее завершаем наш квест нодой QuestDone и за ним окончание диалога.
Так же выдадим небольшую награду ГГ и заберем ПТРД из инвентаря игрока.
Квест готов.
Создание напарника
[link]- Для создания нового напарника мы будем использовать оригинальную модель из игры.
- По умолчанию используем Character c характеристиками Фиделя.
- Создадим первичный диалог, до вступления персонажа в отряд.
- Второй диалог, при вступлении нового напарника в отряд. Мы будем использовать стандартный из игры, на примере диалога Гексогена в отряде. Так же будем использовать стандартный скрипт поведения нпц.
- Потребуется иконка персонажа для паспорта и диалога. Вы можете скачать любую иконку из интернета в формате PNG.
- Всё поведение напарника задается и делается в диалоге. Как и множество событий.
Используя Asset Viewer и выбрав категорию Character найдём Fidel
Загрузим его и сразу переименуем в test_companion
Сделайте по своему усмотрению характеристики для персонажа и измените ссылку на локализацию.
Загрузим любой диалог, например zvezda_pronin
Переименуем его в test_companion_off (Диалог до вступления в отряд игрока)
Установим наш диалог test_companion_off нашему персонажу test_companion
Теперь скачаем диалог gexogen_teammate и переименуем его в test_companion_on (диалог, когда персонаж в отряде)
При желании вы можете самостоятельно изменить все базовые реплики у персонажа в test_companion_on, этого мы в этому уроке рассматривать не будет.
Теперь требуется с помощью Asset Viewer скачать базовое поведение нпц в отряде. Выбираем категорию Behavior и скачаем поведение Fidel.
Переименуем его в test_companion
Откроем и удалим всё лишнее как показано на рисунке.
Возвращаемся к нашему диалогу test_companion_off. Удаляем всё лишнее и создаем базовый диалог. Но начнём наш диалог не с DialogBegin, а с Dummy. Это требуется для того, чтоб была возможность до проигрывания диалога, перехватить событие на другой диалог.
В данном случае, для переключения на диалог напарника мы используем ключ Teammate который мы выдаем при выборе реплики для вступления нового напарника в отряд.
AddKeyword – Ключ, Флаг.
CharacterCaps – присоединение персонажа к отряду игрока.
CharacterSetRalationship – устанавливаем положительную репутацию данного нпц к игроку.
PlayBehavior – подключаем наш Скрипт поведения нпц в отряде.
PlayState – подключение нашего второго диалога когда НПЦ в отряде.
Наш диалог и вступление НПЦ в отряд готов.
Теперь подготовим 2 иконки в формате PNG. Одну скопируем в папку AVA вторую в Character
И обе переименуем, в папке AVA в ava_test_companion, в папке Character в test_companion.
Внимание, имя Аватарки в паспорте, должна совпадать с именем заспавленого персонажа через скрипт или на карте.
Выделяем нашу иконки. И устанавливаем тип Sprite. Проделываем тоже самое и с картинкой в папке AVA.
Назначаем нашу иконку персонажу.
Осталось создать и разместить персонажа на сцене.
Сохранить и протестировать. Как это было показано в предыдущих уроках.
Создание локализации
[link]
Для создания описания предметов и формирования локализации на другие языки используется один и тот же метод, но с разными подходами.
Урок делиться на два вида.
- Формирование локализации для предметов, квестов и имён персонажей и т. д. (Не заменит файлы.) Используется, когда в моде нет диалогов и скриптов с текстом.
- Формирование локализации для всего текста. (Произойдет замена текста на ID ссылки.) Когда в проекте свои диалоги и скрипты с текстом.
Формирование локализации для предметов
Файлы локализации хранятся в папке Localization
Их можно редактировать любым текстовым редактором. (рекомендуется Notepad++)
Имя для названия файлов локализации задается в скрипте ModEntryPoint
Откройте его любым редактором.
Выделил строку загрузки локализации. В нашем случае mymod_string_ , где mymod – это наше отличительное название файла в данном уроке и оно может быть любым.
Файлы должны находиться в папки локализации и иметь вид mymod_strings_ru – русская локализация, mymod_strings_en – английская локализация и т.д.
Сгенерировать локализацию для предметов можно через меню Game> Localization> Generate String Localization.
Будут сформированы файлы для англ. и рус. локализации, которые потребуется заполнить.
После добавления описания, файлы нужно переименовать для правильной загрузки из мода.
Например: strings_ru в mymod_strings_ru, strings_en в mymod_strings_en
открываем данные файлы c помощью notepad++
Short – короткое имя, например при наведении на предмет. Full – полное описание предмета.
Заполняем согласно формату
Так же, если вы используете оригинальные предметы, то вам потребуется скачать оригинальную локализацию через Asset Viewer в категории Localization и перенести к себе в файлы mymod_strings_ru эту локализацию. Оригиналы, после данных манипуляций, требуется удалить из проекта.
Если же файлы уже были сформированы ранее и вам требуется добавить новые ID ссылки локализации, то вам потребуется обратно переименовать файлы локализации в strings_en и strings_ru. И сформировать локализацию повторно.
Формирование локализации для всего текста
Сгенерировать полную локализацию для предметов и диалогов и скриптов, можно через меню Game> Localization> Generate Localization
Внимание – после формирования полной локализации, везде, где есть текст в скриптах, сформируются на него ID ссылки, сам текст, будет использоваться из файла локализации text_. Рекомендуется сделать копию таких файлов (папка Dialog и Behavior).
После генерации локализации появятся файлы. string_ru string _en text_ru
Теперь потребуется прописать в скрипте загрузку локализации, а также загрузку всего текста при запуске модкита, иначе вместо текста в скриптах будут только ID ссылки.
После сохранения кода, потребуется перезапустить проект!
Для проверки вашего файла локализации на ошибки в JSON файле, воспользуйтесь сторонним сайтом [link]
Создание случайной встречи
[link]В данном уроке создадим случайную встречу и вставим её в оригинальную игру.
Все случайные встречи генерируются через скрипты behavior. (Моды, которые добавляют случайные встречи друг друга перезаписывают.)
Создадим простую встречу, где будет медведь, а их количество будет зависеть от уровня игрока.
Воспользуемся Asset Viewer и скачаем любой готовый скрипт встречи, например z_z_ants
Скачайте его и переименуйте в z_z_testbear
Откроем его – это легкий и простой скрипт для понимания.
Для спавна медведей нам потребуется скачать Character медведя и его ассет модели Creature через Asset Viewer.
Откроем наш скрипт и заменим крыс на медведей, как показано на картинке.
Скрипт поведения Rat.Swing – можно оставить, он отвечает за случайное перемещение в коротком радиусе.
Удалим все кроме начального dummy и спавна монстров.
Теперь добавим проверку на уровень игрока раздел Player > Has Modifier
Воспользуемся условием и создадим возможность чтоб при уровне игрока больше 5 спавнилось 4 медведя, если ниже, то 2.
Скрипт готов.
Теперь требуется объявить нашу случайную встречу в скрипте глобальной карты и добавить случайную встречу в ассет событий на глобальной карте.
Скачаем себе в проект, скрипт основной глобальной карты Z_1 в категории behavior
Открываем его и ищем dummy из которого будут выходить множество EncounterType
Сделаем копию любого EncounterType сочетанием клавишь ctrl+d или правой кнопкой и меню duplicate.
Назовём его testbear
Из него запустим PlayBehavior и выделим наш созданный ранее скрипт на спавн, а так же соединим Dummy с нашим EncounterType.
Готово.
Осталось объявить нашу новую случайную встречу.
Для этого найдем Ассет случайных событий в Asset Viewer категория encounter
Скачаем WorldMap и вместе с ним загрузятся и картинки всех случайных встреч.
Выделяем WorldMap и раскрываем список encounters
Это список всех случайных встреч первой глобальной карты. Добавим новую строчку для нашей случайной встречи указав 50 в поле size
И нажав Enter она добавиться, раскроем её.
Все характеристики сдублированы автоматически с предыдущего события.
В поле Type введем имя Энкаунтера которое мы задали в скрипте глобальной карты.
Остальные настройки могут быть установлены по желанию.
Chance – шанс случайного события
Period – Выбор периода события (например только ночью)
Trigger – ключ флаг благодаря которому запуститься случайное событие
Trigger Invert – работает пока триггера нет
Trigger Reset – сбрасывает триггер после первой встречи
Can skip – появится возможность в меню отказаться от встречи.
Once – данное событие произойдёт один раз.
Icon – иконка в формате PNG
Desc – ссылка на локализацию на описание случайной встречи
Enter – ответ ГГ в меню случайной встречи (Войти, Атаковать и т.д.)
Levels – список уровней на которых может происходить случайная встреча.
Chance – добавить проверки на навыки для возможности избежать встречи.
Requirements – определенные события для активации случайной встречи, например уровень игрока.
Requirements EX – дополнительные условия.
Weather Condition – условия проигрывания события в зависимости от погодных условий.
Заменим локацию, на которой будет происходить случайное событие. Их можно взять из других событий.
Взяв со списка с 38 Element
Карта Z_1 вполне нас устроит. Добавим ее к нашей встречи.
Теперь сменим иконку на любую другую из базовых и добавим ссылку на локализацию нашей случайной встречи.
Так же отключим все требования, которые достались нам от предыдущего события.
Наша случайная встреча готова.
Экспорт персонажей в игру.
[link]Для вставки наших персонажей в оригинальную игру потребуется создать точки для спавна, а для этого нужно знать координаты точек.
В данном уроке мы рассмотрим один из способов получения координат прямо в игре, через консоль.
Для разблокировки режима «Пульт» необходимо ввести кодовое слово youshallnotpass. Высветится ошибка, что команда не распознана, но так и должно быть.
Выделяем любого нпц и вводим команду debuginfo, в нашем случае это верный наш соратник.
Все данные по персонажу включая координаты будут записаны в лог файл.
Файл находится в рабочей папке по адресу C:UsersИМЯ ПОЛЬЗОВАТЕЛЯ СИСТЕМЫAppDataLocalLowAtomTeamAtom
Открываем его
Находим нашего соратника и его хар-ки, главное — это текущие координаты на момент ввода команды в POS (87.0, -1.9, 29.0) это (X,Y,Z)
Вот мы и получили требуемые координаты.
Теперь воспользуемся Asset Viewer и найдем в категории Behavior требуемый уровень. В нашем уроке это начальная локация КРЗ.
Загружаем level_city_1 и открываем его.
От основного стартового dummy сделаем новую ноду из категории Spawn > Add Spawn Point
Введем в неё наши полученные координаты и дадим точке новое имя testspawn
Теперь от неё сделаем спавн нашего персонажа из других уроков. Выбрав категорию Spawn > SpawnCharacter
Назначим нашему персонажу модель нпц и ассет нашего торговца, а также его Behavior и укажем нашу точку спавна.
Теперь требуется сделать проверку на спавн, чтоб при каждом срабатывании скрипта наш персонаж не появлялся повторно и не дублировался.
Готово. Мы добавили нашего персонажа на оригинальную локацию.
—Расширенный курс—
Вам потребуются расширенные знания Unity, которые можно получить на официальном ресурсе [link] или другие уроки в интернете.
Добавление модели оружия
Если видео не грузит ссылка на видеоурок
Для добавления новой модели оружия нам понадобиться, модель в формате FBX или OBJ, а также текстуры.
Для удобства добавления новых предметов. воспользуемся тестовым модом, где представлены тестовые прототипы.
Скачать его можно по ссылке: Githab [github.com]
Запустив тестовый модкит создадим в папке Assets/Resources/Models папку Weapons и в ней папку с наименованием нашего оружия. В нашем примере это Colt_1851. Все модели, звуки и иконки требуется хранить в соответствующей директории папке Assets/Resources/.
Перемещаем нашу модель и текстуры в созданную папку. Выбираем нашу модель и раскрываем ее стрелкой.
Выделяем материал, правой кнопкой мышки делаем Extract from Prefab, для встроенного в модель материала. (Иначе материал можно создать самостоятельно, и назначить её на модель.)
Назначаем текстуры для нашей модели.
Модель и текстуры готовы.
Открываем префаб тестового пистолета.
Перемещаем на сцену модель оружия, которую мы копировали в проект.
Выравниваем параметры оружия на сцене. Position, Rotation и Scale.
Удаляем старую модель. Устанавливаем точку выстрела FlashSlot в соответствующую позицию возле дула пистолета.
Для проверки нашего оружия в тестовом модките, есть два варианта
- Скомпилировать мод и посмотреть результат в игре на тестовой сцене. При подключении тестового мода, на локацию можно попасть нажав клавишу F2.
- Запустить тестовую сцену, выдать оружие нпц и запустить Play
Важно! Модель и ассет оружия должны иметь одинаковое имя.
Добавление модели экипировки
Если видео не грузит ссылка на видеоурок
Для добавления новой экипировки нам понадобиться, модель в формате FBX или OBJ, а также текстуры к ней.
Для удобства добавления новых предметов воспользуемся тестовым модом, где представлены тестовые прототипы.
Скачать его можно по ссылке: Githab [github.com]
Запустив тестовый модкит, создадим в папке Assets/Resources/Models папку Armor и в ней, папку с наименованием нашей экипировки. В нашем примере это trooper_helmet. Все модели, звуки и иконки требуется хранить в соответствующей директории папке Assets/Resources/.
Перемещаем нашу модель и текстуры в эту папку. После, выбираем нашу модель и раскрываем ее стрелкой.
Выделив материал делаем Extract from Prefab, для встроенного в модель материала. (Иначе материал можно создать самостоятельно, и назначить её на модель.)
Назначаем текстуры для нашей модели.
Модель и текстуры готовы.
Открываем префаб тестовой экипировки.
Перемещаем на сцену модель, которую мы копировали в проект.
Выравниваем параметры экипировки на сцене. Position, Rotation и Scale.
Удаляем старую модель. Удалив Mesh Renderer компонент из префаба.
Для проверки нашей экипировки в тестовом модките, есть два варианта
- Скомпилировать мод и посмотреть результат в игре на тестовой сцене. При подключении тестового мода, на локацию можно попасть нажав клавишу F2.
- Запустить тестовую сцену, выдать экипировку нпц и запустить Play
Важно! Модель и ассет экипировки должны иметь одинаковое имя.
Добавление новой модели персонажа
Если видео не грузит ссылка на видеоурок
Для добавления новой модели персонажа нам понадобиться, модель в формате FBX или OBJ, а также текстуры к ней. Потребуется создать скелет для этой модели, через Mixamo. Процесс наложения скелета на вашу модель полностью показан на сайте [link].
Требуется регистрация на сайте Adobe. Загрузите модель, расставьте точки и скелет сформируется автоматически. После скачайте модель выбрав FBX for Unity в T-позе.
Для удобства, добавления модели персонажа, воспользуемся тестовым модом, где представлены тестовые прототипы.
Скачать его можно по ссылке: Githab [github.com]
Запустив тестовый модкит в нём, уже имеется папка Characters, создадим папку c любым именем для нашей модели внутри этой папки. Например human_1 .
Перемещаем нашу модель и текстуры в эту папку. (Если текстуры хранятся внутри модели, то их можно распаковать в настройках материала модели.)
Выделяем модель, раскрываем, далее выделив материал сделаем Extract from Prefab, для встроенного в модель материала. (Иначе материал можно создать самостоятельно, и назначить её на модель.).
Назначаем материал к модели и готово.
Открываем префаб тестовой модели персонажа. (Для удобства добавления новых моделей, сделайте копию префаба модели тестового персонажа и её ассета из проводника Windows, и переименуйте.)
Перемещаем на сцену модель, которую мы копировали в проект.
Подгоняем параметры модели как на сцене в соответствии оригиналом через параметр scale ( в самой модели, не в префабе!)
Далее потребуется перенести все компоненты с модели оригинал, на нашу модель, а также объект cameraTarget. Для нашей модели так же потребуется выставить Layer на Character и применить для всей модели, когда будет задан вопрос.
Отключаем модель оригинал как показано на картинке.
Далее существует 2 способа переноса слотов. Вручную или Авто.
В ручную
Каждый слот CapSlot, BloodSlot и т.д. переноситься руками на модель, в соответствии с положением костей в анимации. В основном это требуется, когда модель состоит не из стандартного скелета и размера. И все положения слотов подгоняются в ручную, но позволяет адаптировать практические любые модели с разными размерами.
Авто вариант
Делаем Re-bind в компоненте Character Skeleton и далее bind. Будут перемещены все слоты на нашу модель. Теперь можно удалять стандартную модель персонажа из префаба.
Добавление новой модели Монстра
[link]
Для добавления новой модели персонажа нам понадобиться, модель в формате FBX, текстуры и файлы анимации. В данном уроке мы будем брать готовую модель из Unity Asset Store.
Для удобства, добавления модели персонажа, воспользуемся тестовым модом, где представлены тестовые прототипы. Для овладения уроком требуются дополнительные знания Unity.
Загружаем и импортируем себе в проект Creature Cave Troll из магазина Unity
Делаем копию дерева анимации тестового волка
Назовём его troll
Откроем его и начнем вставку анимации из загруженной модели в ноды с анимацией. (Более подробную информацию по дереву анимации и многих значений параметров, можно получить в инструкции по Unity, есть много способов создания нод и вставки анимации.)
В данном уроке рассматривается легкий способ – путем перетаскивания требуемых анимаций в дерево.
Раскроем Idle – он содержит 2 состояния, обычное и боевое состояние.
Добавим наши анимации, путем перетаскивания из раскрытой модели в поле Motion.
Так проделываем со всеми стандартными анимациями. которые есть у нашей модели.
Цепочку Attack_fake можно полностью удалить. – это фейковые атаки для волков которые дерутся на ринге в перегоне.
Теперь требуется расставить События (Event) на анимацию – это требуется для отработки определенных моментов в игре. Например, попадание по персонажу или атака.
Требуется добавить в требуемые анимации следующие эвенты.
- Attack- для каждой анимации атаки.
- Step – это для звуков шагов.
- Dead – для смерти.
- Hit – для анимации попадания по персонажу.
После того как будут выставлены все эвенты, нужно проверить чтобы был включен параметр Keyframe Reduction
И сама модель была отвязана от рут нод, как показано на рисунке.
Теперь сделаем копию префаба тестового волка и назовём его troll
Перетащим созданный ассет троля в префаб
Теперь открываем префаб и перетаскиваем нашу модель монстра. Как и в уроке по добавлению модели персонажа.
Выставляем правильные координаты
Выставляем Layer у нашей модели на Character
И применяем на всю модель, когда будет задан вопрос.
Далее переносим все компоненты с волка. на нашу модель.
Character Anim Event
Character skeleton
Далее выставляем наше дерево анимаций троля
Теперь требуется создать коллизию для нашего монстра и сделать на него ссылку через Proxy Component
Модель Монстра готова.
Создание уровня (Часть первая)
[link]Урок состоит из нескольких этапов и поделён на 2 части.
Часть первая
• Создание сцены и её настройка.
• Загрузка ассетов из магазина Unity.
• Создание и настройка слоёв.
• Добавление деревьев и размещение.
• Создание рельефа местности.
Часть вторая
• Создание уровня используя ассеты Unity.
• Размещение воды и других необходимых зон.
• Добавление локации на глобальную карту.
• Создание проходимости на карте.
• Cоздание миникарты.
• Подготовка уровня.
Для создания новой карты нам понадобиться модели объектов для карты их текстуры, а также текстуры земли.
Для учебного урока мы загрузим бесплатные ассеты из магазина юнити. Список, которые использовались для создания локации.
Conifers [BOTD] – деревья
Rock and Boulders 2 – камни
Shed, Tools, Bridge and Fences – фурнитура
Outdoor Ground Textures – текстуры земли
Для полноценного понимания создания рельефа, слоёв, деревьев и т.д. следует изучить базовые курсы Unity. Данный урок для пользователей кто уже знаком с Unity.
Создание сцены и её настройка.
Создание нового игрового уровня необходимо начинать с создания сцены в Unity.
Перейдите в директорию Scene и вызовите контекстное меню Create > Scene
Открываем созданную сцену и создаем объект (Create Empty) с именем Level
Обнуляем координаты Position и добавляем компонент Environment Level
Добавляем террейн, например 3D Object > Terrain
(Важно! Все статические объекты (дома, деревья, прочий антураж), которые не являются интерактивными, должны содержаться внутри объекта Level. В противном случае они не будут отображаться в игре.
Настраиваем размер карты
Максимум 400х400 рекомендуемый 100.
Отключаем генерацию освещения. У нас используется глобальное освещение.
Выставляем теги PathGround и слой Level для нашего terrain.
Добавляем новый пустой объект в Level, называем Path. Далее добавляем ему компонент Pathfinder(карту проходимости). Настраиваем карту для поиска путей в 25 клеток. Он всегда равен половине размера карты террайн.
Включим глобальное освещение для карты. Нажмите на Auto generated Lighting Off
Включаем автогенерацию освещения
Сохраните сцену и Level.
Загрузка ассетов из магазина Unity.
Открываем Asset Store в проекте
Используем поиск и находим требуемые для уровней ресурсы. В нашем уроке это:
Conifers [BOTD] – деревья
Rock and Boulders 2 – камни
Shed, Tools, Bridge and Fences – фурнитура
Outdoor Ground Textures – текстуры земли
Нажимаем загрузить и после загрузки импорт, и далее просто кнопка import.
Таким образом, себе в проект можно добавлять множество любых других ресурсов.
Создание и настройка слоёв.
Более подробную информацию о слоях можно получить в официальном мануале по Unity.
Выделяем наш террейн и выбираем меню его редактирования и Paint Texture
Далее Edit Terrain Layers и Create Layer
Находим нашу текстуру и карту нормалей и добавляем в слой.
Таким способом добавляем все слои для загруженных текстур.
Добавление деревьев и размещение.
Выделяем наш террейн и выбираем меню редактирования деревьев.
Нажимаем Edit Tree и Add Tree и далее находим префаб наших деревьев и добавляем их.
Таким способом добавляем все 4 деревца.
Размещение деревьев происходит кистью. Размер и прочие детали задаются в параметрах дерева.
Создание рельефа местности.
Выделяем наш террейн и выбираем меню редактирования террейна.
Настраиваем высоту и размер кисти и рисуем на карте желаемый эскиз.
Создание уровня (Часть вторая)
[link]Создание уровня используя ассеты Unity.
Весь процесс создания уровня состоит в перетаскивании загруженных моделей на сцену. Как во многих других игровых движках.
Все статические объекты должны находиться внутри объекта LEVEL.
Помимо сохранения сцены, при любом изменении статики требуется сохранять и уровень.
Для удобства можно все статические объекты спрятать, внутри LEVEL создать например пустой объект и назвать Static.
И все статические объекты перетащить в него.
Размещение воды и других необходимых зон.
Для удобства просто перемещаем все необходимые вам зоны и объекты из оригинальной тестовой сцены.
В нашем случае – это вода, точка входа и зона выхода на глобальную карту.
Вставляем ее в нашу тестовую карту.
Настраиваем правильное расположение скопированных объектов
В компоненте Level out напишем OutMyMod2, данную точку создадим на глобальной карте позднее, это спавн точка на глобальную карту.
Добавление локации на глобальную карту.
Открываем тестовую глобальную карту. Выделяем тестовую базовую локацию и копируем её. Так же копируем точку выхода и OutMyMod и назовём её OutMyMod2
Переименуем нашу локацию в test и добавим вход в нашу созданную локацию level_test
Создание проходимости на карте.
Переходим в Path Editor и выполняем последовательно:
1. Clean Map – очистить карту.
2. Calculate raycast highest – вычисление лучей для препятствий на карте.
3. Calcuate passability – выполнить расчет проходимости карты.
Далее нажимаем кнопку Paint и рисуем прям на карте поклеточно.
Серый – не пропускает, и не простреливается
Синий – не пропускает, стрелять можно свозь.
Зеленый – полная проходимость.
Горячие клавиши помогают рисовать, зажав правый ctrl или правый ctrl + shift и нажимаете мышкой на сцене.
Если нужно чтобы при генерации отдельно была сформирована поверхность (например, внутри здания) то есть два пути:
- Создать пустой объект Plane и дать ему Tag Playground и слой Level
- Если объект разделен выставить данные теги на меш.
После потребуется сгенерировать проходимость повторно.
Создание миникарты
Для создания миникарты нам потребуется создать папку UI в каталоге Resources. И создать папку minimap в папке UI.
Далее Game>Utils>Save Minimap To Png и сохраняем в нашу созданную директорию.
Так же выставляем нашей картинке тип Sprite
Подготовка уровня.
Осталось сделать интерактив для нашей карты и создать для нее скрипт behavior. Делаем копию MyMod_Level
Назовём их Level_test
В префаб level_test добавим наш ассет level_test
Наш префаб перетаскиваем на карту и называем logiclevel
Осталось подключить логику для уровня. Для этого сделаем копию behavior mymod_level и назовём его level_test
Вставляем нашу логику в наш уровень.
Уровень готов.
Дополняется…
Инструкция дополняется, пишите в комментариях интересующийся аспекты по использованию модов.