Найти в Дзене

Разработка модификаций для Unity-игр на типе компиляции «Mono» Часть 1: внедрение кода

Оглавление

Что вы представляете, когда слышите слово «моды» ? В большинстве случаев, люди представляют подмену моделей, текстур либо звуков. В меньшинстве же, создание новых механик и изменения внутренней логики. О последнем сейчас и речь пойдет.

О игре:

Копатель Онлайн — браузерная, строительная, онлайн игра которая есть в почти всех соц сетях. Игра вышла в 2011 году. В соцсети Вконтакте «Копатель Онлайн» установило более 11 миллионов игроков. Жанр «Копателя Онлайн» — Аркада. В наилучшие года онлайн доходил до 8 000 игроков ! Если с давних времён вы любитель браузерных игр, то скорее всего, вы уже знаете, что такое Копатель онлайн. Если нет, то, может быть, вы видели хотя бы одну запись игры в рекомендациях Youtube.

Общая информация:

В качестве основы модификации будет динамически подключаемая библиотека(DLL) на языке программирования C Sharp. Библиотека будет работать ссылаясь на код игры. После создания DLL будет в последующем внедрена в игру.

Получаем код игры:

В случае если у вас игра в виде клиента, то проблем возникнуть не должно. Переходите в папку где находится ваша игра\название_data\Managed и уже тут будут храниться все необходимые библиотеки. Однако в случае браузерных игр, тут все труднее. Нам необходимо задампить процесс игры. Я использую «Swf and Unity Memory Dumper» и вам советую. Плюсы: ПО бесплатное и имеет легкий интерфейс для понимания. Ищем процесс игры по ID, и дампим в удобное место.

Создание модификации:

Вам понадобиться любая IDE, я покажу на примере VisualStudio 2019. Создаем библиотеку классов, и добавляем в «ссылки» все файлы, которые мы достали ранее

-2
-3

Указываем:

using UnityEngine;


Нужно
обязательно чтоб главный класс модификации наследовал весь функционал от класса MonoBehaviour.

-4

В этой игре есть режим, под названием «беги»
Суть проста: Когда вы бегаете, за вами ломаются блоки, если вы не смогли удержаться на платформе, то вы проиграли. Победит тот, кто останется на платформе последним. Ломание блоков есть только на этом самом режиме. Почему бы не добавить это и на другие ? :)

Для начала, нам нужно декомпилировать Assembly-CSharp.dll. Я использую декомпилятор dnSpy, по тем же причинам что и Swf and Unity Memory Dumper. После декомпиляции исследуем код игры, и ищем то, что нам нужно. А вот и метод который отвечает за ломание блоков под ногами:

-5
-6

Давайте сделаем что-нибудь простенькое, например активацию по нажатию клавиши

-7

Есть сотни способов как это реализовать, например функция будет работать при нажатии на GUI-шную кнопку. Ограничивается только вашими навыками и фантазией.
Теперь давайте напишем класс, который будет создавать объект и накладывать на него наш скрипт. Назовем его «Loader»
И реализуем задачи написанные выше:

GameObject gameObject = new GameObject();
gameObject.AddComponent<Class1>();
UnityEngine.GameObject.DontDestroyOnLoad(gameObject);

DontDestroyOnLoad нужен чтоб объект не удалялся при загрузке новой сцены.

Осталось скомпилировать: Сборка - > Собрать решение

Инъекция/внедрение:

Последний штрих, осталось внедрить созданную нами модификацию. Здесь говорить много не буду, на GitHub-е есть десятки различных Loader-ов, но суть у них у всех одна:

  1. Выбираешь файл
  2. Указываешь пространство имен
  3. Класс
  4. Метод который создает объект со скриптом

Инжекторы ищут процесс игры по модулю mono.dll, но в разных версиях юнити модуль может иметь разные названия. Именно поэтому нужно будет проверить модули процесса, и в случае если там другое название изменять его в инжекторе.

Готово, теперь при нажатии на указанную кнопку у нас будут ломаться блоки под ногами.

Спасибо за прочтение этой статьи ! Я убил кучу времени и сил на ее написания, надеюсь, эта информация вам пригодиться. В следующей части мы напишем уже существенную модификацию со своей GUI-шкой.
Всем добра !