Здравствуйте, меня зовут Сергей, вы, возможно, знаете меня как MacSergey. Я являюсь автором нескольких популярных модификаций для Cities: Skylines, таких как Инструмент Разметки Перекрёстков, Обновление Контроллера Узлов, Мультитул Сети и некоторых других. Два года назад меня наняли в Colossal Order, и теперь я работаю над возможностями модификации в Cities: Skylines II. Сегодня я пишу дневник разработчика, чтобы поделиться с вами нашим подходом к модификации кода.
Модификация кода была важной частью Cities: Skylines, и мы хотим принести те же и даже больше возможностей для модификации в Cities: Skylines II. Мы считаем, что возможность модифицировать игру — это очень крутое дело, которое открывает множество возможностей. Если посмотреть, как разные игроки используют моды в Cities: Skylines, можно увидеть совершенно разные стили игры, почти как если бы они играли в разные игры. Некоторые игроки любят воссоздавать реальный мир с каждой мелочью. Некоторые предпочитают управлять трафиком и производственными цепочками индустрии. А кто-то просто хочет веселиться, обрушив на город 100 торнадо.
У каждого своё видение «идеального набора функций». С функциями базовой игры мы включили множество популярных предложений от сообщества, но, честно говоря, невозможно удовлетворить желание каждого игрока. Здесь на помощь приходят моды. Каждый может реализовать что-то своё или изменить игру по своему желанию, даже если вы единственный в мире, кому нужна эта функция.
Так было и со мной. Я узнал о Cities: Skylines в 2019 году, когда увидел в интернете пост, где один игрок воссоздал свой родной город в игре, и это заставило меня захотеть попробовать игру. Я начал играть, и мне понравилось, что позволяла делать базовая игра, но в какой-то момент я начал думать: «Было бы круто иметь возможность сделать это или то». Тогда я понял, что могу модифицировать игру, но, к сожалению, не смог найти ни одного мода, который делал бы то, что я хотел, поэтому я решил написать свой. Я не думал, что мои моды станут популярными или что кому-то еще понадобятся такие же функции, но оказалось, что мои моды стали очень популярными.
Я думаю, это так круто, что хотя Cities: Skylines вышла почти 9 лет назад, я всё ещё вижу новые моды, созданные для неё. Некоторые из них стали необходимыми модами в глазах сообщества. И всё потому, что люди не осознавали, что им это нужно, пока кто-то не решил сделать это для себя и поделиться с другими!
Cities: Skylines предлагала очень ограниченную поддержку модификации. Часто вы достигали точки, когда игра не позволяла легко изменить что-то, и вам приходилось тратить дни на реализацию. Другие моддеры сталкивались с теми же ограничениями и создавали свои собственные реализации, которые могли конфликтовать друг с другом.
В Cities: Skylines II мы хотим предоставить как можно больше поддержки для вещей, упрощающих модификацию, чтобы вам не приходилось создавать собственную реализацию общих вещей, которые требуются практически каждому моду независимо от их функционала. Мы также внедрили некоторые улучшения качества жизни, чтобы вам не приходилось тратить дни, пытаясь разобраться, какую версию внешнего инструмента вам нужно установить или как настроить проект мода в IDE и добавить необходимые зависимости игры для компиляции вашего мода.
Первым шагом к достижению наших целей стало создание цепочки инструментов для моддинга и её развёртывание. Одним нажатием кнопки будут установлены все необходимые зависимости и внешние инструменты, такие как движок Unity, компилятор Burst и ECS, которые требуются для создания модов. Если какие-либо зависимости обновляются или требования меняются, цепочка инструментов для моддинга уведомит вас об этом, как только вы запустите игру, и предложит обновления, так что ваша настройка разработки всегда будет актуальной.
Интерфейс отслеживает прогресс установки инструментов, необходимых для модификации игры
Затем мы создали шаблон проекта мода, который использует новый механизм шаблонов .Net и будет доступен в списке проектов при создании нового проекта в Visual Studio или Rider. Все необходимые зависимости, пути и действия после сборки настроены, так что вы можете нажать кнопку «сборка», и мод будет скомпилирован, обработан и помещён в правильную папку, чтобы вы могли запустить игру и увидеть, что он там есть.
Шаблон проекта мода в Visual Studio создаёт новый диалог проекта
Когда ваш мод готов, его можно опубликовать на Paradox Mods прямо из Visual Studio или Rider, используя стандартную опцию публикации IDE. В шаблоне проекта есть пустой файл конфигурации публикации, который следует заполнить, после чего вы кликаете по своему проекту и выбираете опцию «публикация». Затем ваш мод будет опубликован на Paradox Mods и будет доступен другим игрокам для подписки и использования.
Опция публикации в Rider
Игра использует некоторые новые технологии движка Unity, такие как Система Компонентов Сущностей или компиляция Burst, для использования преимуществ многопоточности и низкоуровневой оптимизации, которая может увеличить скорость некоторых расчётов до 30-40 раз. Но эти технологии требуют дополнительных знаний для достижения этих преимуществ, иначе производительность может быть хуже, чем без их использования. Подход к модификации, к которому люди привыкли от Cities: Skylines, не позволит вам добиться лучших результатов, которых вы можете достичь в Cities: Skylines II.
Использование инструментов вроде Harmony, который распространён для модификации Cities: Skylines, по-прежнему возможно, но теперь он немного ограничен. Harmony может патчить только управляемый код, но часть кода игры становится неуправляемой в целях оптимизации после компиляции Burst. Harmony не может патчить такой код, но это не проблема, поскольку вся информация обо всех сущностях и компонентах игры доступна из систем модов и может быть изменена или добавлена без модификаций существующего кода игры.
Чтобы помочь оптимизировать ваши моды, мы также предоставляем Постпроцессор Модов, который использует компиляцию Burst и низкоуровневые оптимизации, используемые в игре, чтобы позволить модам использовать те же возможности движка, что и игра, без дополнительных усилий, чтобы разобраться, как это сделать самостоятельно. Наша цель с этим инструментом — направить вас использовать правильный подход и сократить наиболее распространённые ошибки, чтобы вы не тратили много времени, пытаясь понять, что не так. Это также позволяет достичь той же производительности и оптимизаций, которые будет иметь игра после того, как команда реализует все оптимизации.
Оптимизации не требуются, поскольку некоторый код не извлекает из этого преимуществ, поэтому действительно зависит от того, что именно делает ваш код. Во многих случаях он должен быть использован, поскольку API Unity использует генерацию исходного кода, которая заменяет некоторую часть кода их реальной реализацией на этапе после обработки. Если ваш код использует такие вызовы API, и вы не используете настройку, которую мы создали для вас в сгенерированном шаблоне проекта мода и постпроцессоре мода, ваш код не будет работать и выбросит исключение «NotImplemented».
Если вы модифицировали Cities: Skylines, вы знаете, как обновления игры могут повлиять на функциональность модов, и это то, что мы хотим попытаться улучшить в Cities: Skylines II. Хотя полностью предотвратить проблемы с модами невозможно, поскольку изменяется игровой код, который они модифицируют, мы стараемся сделать так, чтобы моды реже ломались при обновлении игры.
Если вы знакомы с модификацией, вы, вероятно, знаете, почему моды ломаются, но если нет, я попробую кратко объяснить, почему это происходит: когда моды модифицируют игровой код, они ищут определённые части кода, используя некоторые «сигнатуры» (имена классов, параметры методов, поля и т. д.). Когда были сделаны какие-либо обновления или исправления ошибок, базовый игровой код изменялся, и «сигнатуры», которые искали моды, больше не существовали или место кода, который они модифицировали, работало немного иначе после обновления. Мы не можем знать, какую часть кода модифицирует каждый из тысяч модов, и даже в этом случае нам нужно было изменить его, чтобы исправить проблемы и добавить новые функции в игру. Единственный возможный способ не ломать моды — это вообще не обновлять игру, что нам, конечно, нужно было делать. Один из забавных моментов, которые у меня были, когда я работал над одним из последних дополнений для Cities: Skylines, был тот, что после выпуска я понял, что один из моих модов сломался, и причиной были изменения базового кода игры, сделанные мной для исправления ошибки или добавления новой функции.
В Cities: Skylines II это должно быть гораздо меньшей проблемой, когда моды вводят свои функции так же, как это делает игра. Чтобы создать совершенно новую функцию, вам не нужно искать разные места в игровом коде и модифицировать все их, чтобы включить функциональность вашего мода, и беспокоиться о том, что одно из этих мест базовой игры будет изменено в одном из будущих обновлений игры. Единственное, что вам нужно сделать, — это создать свою собствен