Решил создать тему, посвященную модификации этой замечательной игры, потому что адекватных форумов по этой теме не найти днем с огнем, а в сообщества Steam инструкции, мягко говоря кривые и сделаны на коленке. Я же подхожу к модам тщательно и не хочу делать их на предлагаемых костылях. В этой теме я поделюсь всем, что постиг за неделю знакомства с Unity и модкитом игры в частности. Сам модкит можно скачать ТУТ, на Fandom есть так же пара видеоинструкций (кривых, естественно, но для начала посмотреть стоит). Тут я буду публиковать только собственные наработки, избавленные от костылей. И так, начнем! Unity Hub берем ЗДЕСЬ. Думаю с установкой юнити вы вполне себе справитесь, иначе бы не были тут. В моих примерах я буду практически все делать с нуля и работать с бренчем "Master". Если тут чего-то нет - значит оригинальная инструкция правильна или я до этого еще не дошел.
Переименование мода (избавляемся от MyMod и снимаем таблички "дерево" с деревьев)
В видеоинструкции автор не переименовывает скрипт мода, однако из-за этого могут возникать конфликты, так что мы это поправим! Для начала распакуем модкит в рабочую папку и откроем наш проект (не забыли? Никаких примеров, только "Master"!). Абсолютно не обязательно ставить именно ту версию юнити, которая прописана в модките. Ставим последний LTS - на сегодня это 2019.4.17f1.
После импорта вы увидите восклицательный знак рядом с Unity version, означающий что у вас нет той же версии юнити, в которой создавался модкит. Это не беда, потому что, как я и писал выше, подойдет и более свежая 2019 года, выбираем ее из списка (вы же ее установили, не так ли?), жмакаем на название проекта (modkit-master) и соглашаемся с конвертацией:
Все, юнити чуть подумает и наш проект открыт. Далее идем в папку Scripts в дереве слева, кликаем по ассету MyMod, переименовываем его в название вашего мода сначала справа в Inpector, затем сам файл. В примере буду использовать Modgames:
Осталось переименовать мод в C# скрипте ModEntry. Открываем его, и правим в строках 8 и 26 название мода и рабочего пространства для локализаций:
Код
//[assembly: AssemblyTitle("Modgames")] // ENTER MOD TITLE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Localization.LoadStrings("Modgames_strings_");
Создание рецепта для крафта и записки для изучения с параметрами локализации
Создание самого рецепта вполне адекватно описано в сообществе Steam, так что не буду я на этом заострять внимание. В данном примере у меня уже создан рецепт патронов 6х49mm_jhp. Однако для мультиязычных модов подход по созданию записки (memo) в корне не верен, с этим сейчас и разберемся. Открываем справа в дереве каталогов Resources > Entities > Memo - тут у нас будут жить наши записки. Затем идем сверху в Game > Asset Viewer. В поиске набираем "Craft_book" и скачиваем понравившуюся книжку (ПКМ>Download). Тут же переименовываем скачанный ассет на свой лад. Делается это для того, чтобы не создавать иконки. Если вы намерены использовать свои Sprite - то можно просто создать новый рецепт, как описано в сообществе Steam.
Далее нам понадобится нормальный текстовый редактор, понимающий json. Настоятельно рекомендую Notepad++. Запускаем Notepad++, создаем файл с двумя скобками внутри
Код
{ }
и сохраняем его как modgames_book.json в любое удобное место и перетаскиваем в рабочее пространство Memo. Или сохраняем прямо в Assets > Resources > Entities > Memo рабочей папки проекта - на Ваше усмотрение. Кликаем по переименованному ассету записки и справа в inspector в поле "Note" привязываем к нему наш modgames_book. Так же правим рабочее пространство локализации в соответствии с названием нашего мода. Далее кликаем по modgames_book.json и жмем Node editor справа в Inspector:
Мы попали в редактор поведения. Тут редактируются все диалоги, квесты, записки... Тут нам надо создать дерево диалога (в данном случае одностороннего, ибо это книга и ГГ ее читает). Создаем начало дерева: ПКМ > Memo > Memo Begin. Далее создаем нужное количество страниц: ПКМ > Memo > Memo Page. Затем надо добавить пустышку: ПКМ > Dummy. Затем создаем триггер на Keyword: ПКМ > Keyword > Has Keyword. Далее создаем действие добавления рецепта: ПКМ > Player > Player Add Recipe. Затем добавляем Keyword (ПКМ > Keyword > Add Keyword, чтобы рецепт не учился каждый раз при прочтении книги.Ну и под конец создаем логические цепочки. В качестве Keyword в обоих случаях используем название нашей книги, можно с префиксом, главное чтобы значение в обоих полях было одинаково.
Далее приводим дерево к такому виду:
Заполняем кейворды и рецепт: кликаем по HasKeyword и в открывшемся окошке пишем название нашей книги (modgames_book), тоже самое проделываем и с AddKeyword. Добавляем рецепт в PlayerAddRecipe:
Жмем SAVE в левом верхнем углу и выходим из редактора.
Теперь мы подошли к самому главному, о чем в других инструкциях нет ни слова. Начинаем заполнять нашу книжку умными (или не очень) фразами. Продолжение следует.
Добавлено (08 Января 2021, 19:23) --------------------------------------------- Продолжаем тему. Для дальнейшей работы потребуется много копипастить, так что приготовьте левую руку к CTRL+C CTRL+V =)) Для начала надо создать локализацию. Идем Game > Localizalion > Generate String Localization Затем идем в Assets > Resources > Localization - там будут 2 файла: strings_en и strings_ru. Переименовываем их в modgames_strings_en и modgames_strings_ru соответственно. Открываем оба в Notepad++. Там нас интересуют строки:
Тут 2 параметра, относящихся к названию нашей записки. Приводим их в соответствующий вид:
Код
"memo" : { "modgames_book" : { "short" : "Modgames лучший сайт", "full" : "Книга о том как надо делать моды и инструкции. Научит как создать ~чего вы там создаете~"
Параметр "short" отвечает за короткое имя при наведении мышки, если книга лежит на полу или в ящике, к примеру, а параметр "full" покажет более подробную информацию при наведении мышки в инвентаре. Тоже самое проделываем в файле _en, но уже по-английски. С названием разобрались. Теперь перейдем к наполнению книги полезной (и не очень) информацией. Открываем Notepad++ и создаем пустой json файл с двумя скобками, как описано выше. Сохраняем под именем text_ru и text_en. Помещаем оба файла в рабочее пространство рядом с modgames_strings_ru. Открываем оба. Идем в memo и открываем Node Editor на файле modgames_book.json. Теперь самое важное: переключаемся в Notepad++ и приводим оба файла к следующему виду:
Теперь переключаемся на редактор и кликаем Page. Из открывшегося окошка копируем идентификатор фразы и тут же вставляем его ниже, дописываем в начало префикс
Код
#modgames_book.
Переключаемся на Notepad++ и вставляем идентификатор первыой фразы в первые кавычки. Повторяем тоже самое для английской версии файла. Таким образом проходим по всем фразам. В результате получаем это:
Переключаемся на редактор поведений, сохраняем и закрываем его. Осталось только наполнить каждую фразу смыслом. Во вторые кавычки каждой фразы пишем нашу полезную информацию:
Код
{ "modgames_book" : { "53c420c2-0016-4fec-9d6e-cc22235229e7" : "На самом деле я не знаю что писать, так что пишу от балды", "b69b4e76-1e8e-40a0-b27b-96be47a29fe7" : "Тут тоже должно быть что-то написано...", "3b3b446f-5702-4277-bdd1-9e8713332ad8" : "Ну а тут концовка. Всех благ." } }
Вот в принципе и все. Повторяем процедуру для английской версии, сохраняем оба файла и можно компилить мод. По такому же принципу создаются квесты, диалоги, реплики NPC. Надеюсь я все понятно объяснил. Знаю, сейчас закидаете помидорами, что можно прописать все прямо в окошках и нажать Generate Localisation - и весь текст заменится на ID и пропишется в text_ru, так вот: это актуально, если у вас все диалоги, записки и прочее создаются в один присест. Если вы добавляеете несколько диалогов не за раз - то генерация порушит все предыдущее и снова придется копипастить. По мне - уж лучше вручную. Еще добавлю: если вы прописываете перки оружию - то потрудитесь удалить их из strings_ru - самый последний блок Weaponerk должен выглядеть так:
Код
"weaponperk" : { }
Если, конечно, вы не создали свой оружейный перк - тогда его и только его прописываем сюда. Иначе все нативные перки будут без описания или придется их заполнить для каждого.
К сожалению данный метод хоть и работает для нашей книги, но рушит все диалоги в игре. Для того, чтобы этого не происходило, нам надо переименовать наши файлы text_(ru)(en) в modgames_text_(ru)(en) и прописать загрузку данного текста в скрипт ModEntryPoint.cs "Localization.LoadTexts("modgames_text_");" сразу после "Localization.LoadStrings("modgames_strings_");" Выглядит это так:
Так же, чтобы наши диалоги были видны в редакторе поведений не в виде идентификаторов прописываем еще 2 абзаца. Один сразу после 8 строки "//[assembly: AssemblyTitle("modgames")] // ENTER MOD TITLE":
Продолжение следует. Все, что я проделал в этой инструкции доступно для скачивания вместе с модкитом. Да-да, все исходники ТУТ! Пароль на архив: modgames.net
Добавлено (09 Января 2021, 02:41) --------------------------------------------- Продолжение, как и обещал.
Звуки. Конвертация и добавление в проект.
Про звук в официальных источниках так же не бельмеса. Сейчас это исправим. В этом примере мы будем добавлять звук создания/неудачи к нашему рецепту патронов из предыдущего урока. Для работы нам в принципе не требуется ни особых навыков, ни даже звукового редактора. Достаточно просто скачать нужный звук и преобразовать его в формат Vorbis (ogg). Важно заметить, что Unity примет и воспроизведет практически любой формат, но в игре такой звук воспроизводится НЕ БУДЕТ. Для этой нехитрой операции нам вполне хватит обычного VLC плеера. Создаем путь в проекте Assets > Resources > Sounds > SFX > Craft > Modgames (просто создаем папки по порядку, можно прямо в рабочей папке проекта или непосредственно в Unity). Теперь скачаем нужные нам звуки. Для примера я взял звук перезарядки дробовика в качестве удачного крафта и звук поломки часового механизма в качестве неудачи. Все звуки в формате mp3, так что будем их конвертировать. Просто открываем их в vlc по одному, кликаем ПКМ > Сохранить, выбираем преобразовать и профиль Audio - Vorbis (OGG), указываем путь прямо на папку Assets > Resources > Sounds> SFX > Craft > Modgames и имя файла modgames_sucsess и modgemes_fail соответственно для каждого звука и жмем кнопку "Начать". На выходе получаем оба файла сразу в нашем проекте.
Звуки готовы к использованию. Осталось только привязать их к двум событиям в рецепте крафта. Переходим в Entities > Craft, выделяем наш рецепт, кликаем по стрелочкам и назначаем звук для каждого события.
На этом все, звуки готовы. Продолжение следует.
Добавлено (11 Января 2021, 10:17) ---------------------------------------------
Prefab и с чем его едят.
Сегодня научимся ковырять игровые модели. Игровые модели выполнены в виде скрипта YAML с расширением .prefab. Напрямую сгенерировать их по неведомой мне причине модкит не умеет, или разработчики намеренно вставляют палки в колеса - сие для меня загадка. В модките с примерами существует несколько готовых prefab, те, которые я буду использовать, я выложу в свободный доступ. Сегодня пропишем лекарство от жадности вредности создателю урока по добавлению винтовки в игру а так же создадим prefab для холодного оружия. Итак, начнем!
Скачаем prefab пистолета, с которым будем работать. Открываем наш проект, добавляем prefab в папку Weapon. Добавляем в проект существующую винтовку, к примеру pipe_sniper_4. Скачиваем на просторах интернета модель винтовки в формате FBX (или конвертим из другого формата в FBX), которую будем добавлять. Создаем папки Textures и Materials прямо в папке Weapon. Если наша модель несет в себе запакованные материалы и текстуры - то нам надо их распаковать, в чем нам поможет сам Unity, для этого выделим саму модель и справа в Inspector нажмем сначала "Extract Textures", затем "Extract Materials". Тут так же есть нюансы. Текстуры могут быть в любом формате, dds, png, tga и даже jpg. Unity с данным модкитом НЕ МОЖЕТ ПОЛНОЦЕННО РАБОТАТЬ НИ С ЧЕМ, КРОМЕ PNG! Так что если извлеченные текстуры у нас не PNG - то придется их конвертировать, о чем я расскажу позже. Если текстуры у нас отдельны от модели - то просто конвертируем их, если они не PNG и помещаем в папку Textures. Я буду использовать уже подготовленную модель с извлеченными и конвертированными текстурами и материалами.
Открываем Prefab пистолета в Notepad++ (ПКМ > Show in Explorer > ПКМ > Edit with Notepad++) и находим там строки с координатами:
Как видно - коллайдер стал гораздо больше меша пистолета и теперь соответствует винтовкам и ружьям в игре. Теперь мы удалим меш ствола, оставив только рукоять (ее мы тоже удалим, но потом).
Перетаскиваем нашу модель FBX винтовки в сцену и размещаем внутри рамки, подгоняя размер и положение по рукояти. Ствол должен быть направлен по оси X, а приклад подходить почти вплотную к стенке коллайдера. Когда наша винтовка хорошо попала в рамку и рукоять совпадает с мешем в префабе - удаляем меш рукояти и переключаем обзор в режим 2D. Затем выделяем FlashSlot и двигаем его к выходному отверстию ствола пока на проекции 2D по осям XY придерживаясь центра ствола.
Затем переходим в 3D и подгоняем положение нашей модели так, чтобы дуло совпадало с FlashSlot. Поскольку по двум координатам у нас уже порядок - двигаем модель только по оси Z. ДВИГАЕМ ТОЛЬКО МОДЕЛЬ ОРУЖИЯ, НИ В КОЕМ СЛУЧАЕ НЕ ПРЕФАБ!
Теперь наша винтовка расположена правильно. Переименовываем префаб EPIstol в название нашего оружия, задаем параметры оружия, локализации. Правим M Entry Data
Теперь к ножу: Тут все проще. Еще раз вставляем префаб пистолета в проект. Удаляем меш ствола, оставляем только рукоять. Скачиваем модель ножа (или рисуем сами) и добавляем в проект. Текстурируем. Переносим модель в префаб, размещаем рукоять ножа внутри меша рукоятки пистолета, острой стороной по оси X, удаляем меш рукояти, удаляем FlashSlot - готово. Так же добавляем в проект любой нож из Asset Viewer, назначаем параметры, локализацию, привязываем к префабу, создаем иконку и привязываем ее - готово. Правим параметр "M Entry Data" в префабе. Можно открыть его Notepad++, а можно и прямо в Inspector.
Добавлено (15 Января 2021, 08:35) ---------------------------------------------
Prefab. Создание с нуля.
И так, продолжим. Для создания с нуля игровой модели нам нужно ее... создать! Создать ее можно прямо в редакторе сцены. Для этого кликаем правой мышкой по пустому месту в иерархии сцены и выбираем Create Empty. У нас появляется новый GameObject. Это и есть наш префаб, осталось только его настроить. Просто хватаем GameObject мышкой и перетаскиваем его в наш проект в нужную папку. Выделяем GameObject и справа в Inspector жмем Open Prefab. Дальше начинаем работу с Add Component. Тут нужно определится, для чего именно мы создаем игровую модель. В примере оружие, потому что координаты для него известны. Для начала добавим коллайдер: Add Component > Physics > Box Collider. Затем, уж коли это оружие - добавим оружейные скрипты: Add Component > Scripts > Weapon Link, Add Component > Scripts > Weapon Component. Теперь создадим FlashSlot - кликаем правой мышкой по пустому месту в иерархии сцены и выбираем Create Empty. Переименовываем новый GameObject в FlashSlot. Добавляем созданный FlashSlot в соответствующее поле в скрипте Weapon Link. На этом настройка префаба для огнестрела завершена, за исключением размеров, к сожалению, кроме как скоммуниздить параметры Transform и BoxCollider из видеоурков и скриншотов на просторах интернета, я других вариантов пока не знаю.