Моддинг: советы по эффективности моддинга

From Vintage Story Wiki
This page is a translated version of the page Modding:Modding Efficiently and the translation is 100% complete.
Other languages:

Эта страница проверялась в последний раз для версии Vintage Story 1.15.


Моддинг и даже сама разработка игр обычно требует множества проб и ошибок. Чем больше времени вы сможете сэкономить на этих итерациях, тем лучше, так как оно быстро накапливается. Помимо быстрого запуска, VS предлагает множество дополнительных приемов, которые помогут вам делать моды быстро и эффективно. Вот некоторые приемы, которые должен использовать каждый серьезный моддер.

Ярлыки

  • Используйте макросы! Переключение из/в творческий режим/режим выживания и /time set day привязаны к сочетанию клавиш. Нажмите CTRL+M, чтобы открыть диспетчер макросов, который позволит вам их настроить!
  • Когда вы редактируете файлы текстур и форм - их можно перезагрузить без перезагрузки с помощью команд .reload textures и .reload shape. Последнее может потребовать от вас размещения и удаления блока, чтобы фрагмент перерисовывался.
  • Записи перевода можно перезагрузить с помощью .reload lang, руководство можно перезагрузить с помощью .reloadhandbook
  • Настройте скрипт quickstart.bat, который содержит, например. VintageStory.exe -oTestWorld -pcreativebuilding — мгновенно запустит вас в сверхплоский творческий мир под названием «TestWorld».
  • Не перезапускайте игру полностью, чтобы проверить изменения! В 95% случаев достаточно просто выйти из игрового мира и вернуться или использовать внутриигровые команды перезагрузки. Вы можете быстро перезагрузить мир, используя сочетание клавиш CTRL+F1.
  • Оставьте свой мод распакованным в папке с модами! Его не нужно застегивать, он прекрасно загрузится в распакованном виде :-)
  • Используйте .tfedit, чтобы изменить внешний вид вашего предмета/блока в графическом интерфейсе, в руках или на земле — с предварительным просмотром в реальном времени.
  • Используйте .bsedit для редактирования выбора блоков и коллизий в игре — с предварительным просмотром в реальном времени.
  • Используйте команду /expclang для создания аккуратно отформатированного списка языковых записей, предназначенных для вашего en.json, он находится в файле с именем collectiblelang.json в той же папке, что и VintageStory.exe. Он создает языковые записи для любого блока или элемента, который в настоящее время не имеет перевода. Может сэкономить вам массу времени, поскольку вам не нужно вручную писать файл en.json.
  • Если вы изменяете файл json и хотите включить в свой мод только изменения, вы можете создать JSON патч. Обычно вы даже можете сэкономить время, написав его самостоятельно, используя ModMaker 3000 ™, инструмент командной строки, который поставляется с игрой, для создания патчей для вас.

Поиск проблем

  • Если вы столкнулись с проблемой актива, просмотрите server-main.txt и client-main.txt! Движок очень разговорчив, когда дело доходит до ошибок ассетов.
  • Включите отчет об ошибках на постоянной основе через /errorreporter 1, чтобы избавить себя от работы по поиску и просмотру файлов журналов на наличие проблем. Эта функция сделает так, чтобы диалоговое окно появлялось после завершения игры, если были обнаружены какие-либо ошибки.

При написании модов на C#

  • Используйте точки останова для отладки
  • Просмотрите множество служебных классов, предоставляемых VS API, возможно, вы сможете сэкономить много усилий по написанию кода! (например, ColorUtil, GameMath , ArrayExtensions, DictExtensions , HashsetExtensions, JsonUtil , ReaderWriterExtensions, SerializerUtil , WildcardUtil)
  • Если вы еще не знаете, расширение LINQ, являющееся частью .net framework, является чрезвычайно мощный инструмент, позволяющий сделать код более выразительным.
  • Используйте функцию Горячая перезагрузка Visual Studio для изменения кода во время работы игры, чтобы сразу увидеть изменения, не перезапуская мир.
    • Обратите внимание, что эта функция работает, если вы используете официальный шаблон мода и настроили свой мод как «скомпилированный». Это не работает, если вы настроили свой мод как «исходный» мод, и он может не работать со всеми другими настройками среды разработки.
  • Если вы еще этого не сделали, убедитесь, что вывод игрового журнала заканчивается в окне вывода Visual Studio.
  • Если вы работаете с шейдерами, вы можете перезагрузить их с помощью .reload shaders
  • Не храните статические ссылки, если только это не примитивные данные. Статические ссылки не удаляются сборщиком мусора, когда игрок покидает сервер/игровой мир. Пример: статическая ссылка на Block сохранит этот блок в памяти, что, в свою очередь, сохранит в памяти экземпляр API, который, в свою очередь, сохранит в памяти весь игровой мир.
  • Игровой клиент и сервер имеют ряд аргументов запуска для облегчения вашей жизни.

Эффективные методы поиска

Чаще всего вы хотите, чтобы ваш код нашел что-то в игровом мире. Как вы, возможно, уже знаете, компьютеры не так хороши в параллельной обработке, как человеческие глаза, поэтому им приходится последовательно просматривать все пространство поиска. При этом имейте в виду, что, в первую очередь, самый эффективный метод поиска — это тот, который никогда не запускается в пространстве поиска нулевого размера ;-)
Другими словами, иногда вы можете вообще избежать поиска с помощью другие умные средства! Если вам все же нужно выполнить поиск, вот несколько более оптимальных способов, чем метод грубой силы:

  • Поиск объектов
    Используйте EntityPartitioning - api.ModLoader.GetModSystem<EntityPartitioning>().WalkEntityPartitions(). Эта система разбивает объекты на сегменты блоков 8x8x8 по всему загруженному игровому миру, а затем ищет только внутри этих сегментов в пределах заданного вами радиуса поиска, что значительно сокращает пространство поиска.
  • Поиск блока
    a) Если вы хотите, чтобы сущность нашла определенный, не слишком распространенный блок, используйте POI Registry. Этот реестр позволяет блочным объектам регистрировать точки интереса, которые объекты могут очень эффективно искать. Они также разделены на сегменты столбцов фрагментов, чтобы дополнительно сократить пространство поиска. Для примера кода ознакомьтесь с блочной сущностью ягодного куста
    b) Для регулярного полного сканирования чанка я рекомендую отдельный фоновый поток, который загружает чанк и получает доступ к необработанным данным блока через chunk.Blocks. Это массив с индексом (y * размер фрагмента + z) * размер фрагмента + x, где xyz — локальные координаты от 0 до фрагмента-1. Однако вы должны писать только в кусок в основном потоке! Если вы хотите пока избежать многопоточности, вы все равно можете перебирать chunk.Blocks в основном потоке и даже разбивать задачу на несколько тиков, как это делают ванильные ульи.
    c) Для сканирования редких областей используется api.World.GetBlockAccessorPrefetch(). Этот метод доступа к блокам позволяет предварительно загрузить область, а затем довольно эффективно перебирать каждый блок в заданной области.
 

Wondering where some links have gone?
The modding navbox is going through some changes! Check out Navigation Box Updates for more info and help finding specific pages.