Добрый день, здесь я хочу расписать все известные фишки и возможности, а также свои рекомендации и советы по работе в редакторе карт старкрафт 2.
Навигация
№1. Унификация ID объектов данных
Это первое что я хочу рассказать, и к слову это стало причиной почему я начал писать эту тему
Соблюдайте однородность ID ваших данных!
Если вы ID разных данных, которые надо связать, будете указывать одними и теми же, то редактор и игра свяжет их автоматически без необходимости явного указания одного объекта в поле другого.
Такой подход к созданию данных сильно упростить их создание, а также это достаточно сильно может оптимизировать ваш проект в редакторе. У вас в файлах xml просто не будет строчек, с указанием этих объектов в других объектах.
К примеру у вас есть юнит, актор, модель, звук смерти, модель смерти
Это всё объекты разных каталогов
Это всё объекты разных каталогов
Вы можете ID каждого из этих объектах прописать одно и тоже, а в звуке и модели смерти прописать айди как {objectID}Death
Тогда для того чтобы их всех вместе сцепить вам потребуется просто указать токен в акторе юнита (снизу полей свойств есть окошечко)
И всё, у вас чудесным образом образовались связи без явного указания объектов в каждом объекте.
И всё, у вас чудесным образом образовались связи без явного указания объектов в каждом объекте.
Это можно проворачивать с чем угодно, главное чтобы в поле свойства объекта, куда в хотите что-то подцепить было что-то вроде MyCustomUnit (unknown)
№2. Использование родителей в данных
Рекомендации по работе с данными в редакторе StarCraft 2
Если вы столкнулись с тем, что в ваших данных много повторяющихся данных, например, объекты с одинаковыми свойствами, попробуйте воспользоваться методом обобщения через родительские объекты. Это значительно упростит и ускорит работу с данными.
Шаг 1: Создание родительского объекта
Создайте шаблонный объект, который будет служить основой для всех ваших юнитов. Назовите его, например, "Standard Unit Template". В этом шаблоне соберите все общие данные, которые будут присутствовать во всех юнитах. Это могут быть:
- Стандартная панель приказов с кнопками: , , , , .
- Стандартные способности атаки, перемещения и движения.
- Дефолтная скорость перемещения и другие базовые параметры.
Шаг 2: Наследование свойств от родительского объекта
При создании новых игровых юнитов используйте этот шаблонный объект как основу. Все свойства, заданные в родительском объекте, будут автоматически наследоваться новым юнитом. При этом вы сможете добавлять уникальные свойства и изменять параметры, которые не наследуются.
Преимущества использования родительских объектов:
- Отсутствие дублирования данных: Каждый новый юнит будет использовать только уникальные данные, что исключает повторение информации.
- Упрощение работы: Все базовые свойства и параметры будут заданы один раз в родительском объекте, что упрощает их настройку и управление.
- Гибкость: Вы можете легко изменять общие свойства для всех юнитов, просто отредактировав родительский объект.
- Универсальность: Вы всё ещё сможете редактировать каждый объект индивидуально
примеры
- Как пример, можно создать общего родительского юнита, в котором будут установлены самые базовые настройки.
- Можно сделать родительского юнита для наземных единиц, наследуемый от общего родителя единиц из пункта 1, настроить в нём только то, что касается только наземных единиц (Флаги выставить, перекрываемые уровни на землю настроить, и прочее)
- Можно сделать родительского юнита для воздушных единиц, наследуемый от общего родителя единиц из пункта 1, со всеми настройками для воздушных единиц
- Всё тоже самое можно сделать для зданий, чтобы например родительский объект зданий имел в панели приказов кнопки отмены строительства, смены рабочего, и прочее.
Данные для наземных единиц
<CUnit default="1" id="CommanderGround">
<FlagArray index="ArmySelect" value="1"/>
<Speed value="2.25"/>
<Acceleration value="1000"/>
<CostCategory value="Army"/>
<AttackTargetPriority value="20"/>
<Collide index="Ground" value="1"/>
<Collide index="ForceField" value="1"/>
<Collide index="Locust" value="1"/>
<PlaneArray index="Ground" value="1"/>
<AbilArray Link="move"/>
<AbilArray Link="stop"/>
<AbilArray Link="attack"/>
<CardLayouts>
<LayoutButtons Face="MovePatrol" Type="AbilCmd" AbilCmd="move,Patrol" Row="0" Column="3"/>
<LayoutButtons Face="MoveHoldPosition" Type="AbilCmd" AbilCmd="move,HoldPos" Row="0" Column="2"/>
<LayoutButtons Face="Attack" Type="AbilCmd" AbilCmd="attack,Execute" Row="0" Column="4"/>
<LayoutButtons Face="Stop" Type="AbilCmd" AbilCmd="stop,Stop" Row="0" Column="1"/>
<LayoutButtons Face="Move" Type="AbilCmd" AbilCmd="move,Move" Row="0" Column="0"/>
</CardLayouts>
<CargoSize value="2"/>
<EditorCategories value="ObjectType:Unit,ObjectFamily:Coop"/>
<StationaryTurningRate value="990"/>
<TurningRate value="990"/>
<Fidget>
<ChanceArray index="Anim" value="33"/>
<ChanceArray index="Idle" value="33"/>
<ChanceArray index="Turn" value="33"/>
</Fidget>
</CUnit>
Данные для воздушных единиц
<CUnit default="1" id="CommanderAir">
<FlagArray index="ArmySelect" value="1"/>
<Speed value="2.25"/>
<CostCategory value="Army"/>
<AttackTargetPriority value="20"/>
<AbilArray Link="move"/>
<AbilArray Link="stop"/>
<AbilArray Link="attack"/>
<CardLayouts>
<LayoutButtons Face="MovePatrol" Type="AbilCmd" AbilCmd="move,Patrol" Row="0" Column="3"/>
<LayoutButtons Face="MoveHoldPosition" Type="AbilCmd" AbilCmd="move,HoldPos" Row="0" Column="2"/>
<LayoutButtons Face="Attack" Type="AbilCmd" AbilCmd="attack,Execute" Row="0" Column="4"/>
<LayoutButtons Face="Stop" Type="AbilCmd" AbilCmd="stop,Stop" Row="0" Column="1"/>
<LayoutButtons Face="Move" Type="AbilCmd" AbilCmd="move,Move" Row="0" Column="0"/>
</CardLayouts>
<EditorCategories value="ObjectType:Unit,ObjectFamily:Coop"/>
<StationaryTurningRate value="990"/>
<TurningRate value="990"/>
<PlaneArray index="Air" value="1"/>
<Collide index="Flying" value="1"/>
<Mover value="Fly"/>
<Height value="3.75"/>
<VisionHeight value="4"/>
</CUnit>
Данные ваших единиц, созданных по родителю
<CUnit id="Marine" parent="CommanderGround"/>
<CUnit id="Marauder" parent="CommanderGround"/>
<CUnit id="Reaper" parent="CommanderGround"/>
<CUnit id="Firebat" parent="CommanderGround"/>
<CUnit id="Medic" parent="CommanderGround"/>
<CUnit id="VikingFighter" parent="CommanderAir"/>
<CUnit id="Banshee" parent="CommanderAir"/>
<CUnit id="Battlecruiser" parent="CommanderAir"/>
<CUnit id="Medivac" parent="CommanderAir"/>
В данном примере можно наблюдать, что такие параметры, как:
- стандартные элементы управления движением (перемещение, атака, патрулирование, остановка, удержание позиции)
- Способности;
- Скорость;
- Коллизия;
- другие базовые характеристики
сосредоточены в едином родительском объекте и НЕ повторяются для всех остальных единиц.
Эта функция позволяет быстро изменять стандартные параметры для всех юнитов, чтобы они соответствовали заданным значениям. Это экономит время и упрощает процесс настройки, делая его более удобным и эффективным.
И не только такое с юнитами проворачивать можно, но и с любыми другими данными
№3. Использование дата коллекций
Что могу сказать? Крайне удобная возможность организации данных, если у вас хоть сколько нибудь масштабная карта, не знаю там: расу новую полноценную делаете, или командира коопа, или другой набор данных для себя. Оборачивайте ваши данные в дата коллекции, и создавайте паттерны на них, очень сильно повысит удобство редактирования данных, когда все поля сосредоточены в одном объекте, и не нужно бегать по разным каталогам данных, выискивая в огромной куче один несчастный параметр.
Также вы копировать полноценные структуры данных сможете в два клика,
Ctrl C - Ctrl V, и готово, полностью Способность была скопирована и сразу же работает, БЕЗ ДОРАБОТОК!! Также и с единицами,
Ctrl C - Ctrl V, и готово, полностью Способность была скопирована и сразу же работает, БЕЗ ДОРАБОТОК!! Также и с единицами,
Ещё и с улучшениями проще работать будет, вместо того чтобы вписывать ТОННУ полей на каждого юнита в улучшении, вы сможете в улучшении вписать необходимый шаблон изменяемых данных, и добавлять этот апгрейд всем нужным юнитам в два клика, без надобности дописывать у улучшение ещё тонну полей
№4 Использование Wizard'ов
Разберитесь как создаются визарды!
Как только вы будете их писать и напишите набор готовых шаблонов разных способностей, оружий, баффов и прочего, то вы сильно можете сократить время разработки.
Да конечно, их надо ещё написать, но как только вы это сделаете, вы забудете про создание начальной структуры данных своих проектов.
К тому же с помощью визардов вы разработаете свой уникальный, правильный стиль создания данных.
Всю базовую информацию можно найти в этой статье: Работа с Wizard'ами
№5. Работа с проектом в виде компонентов
Компоненты позволят вам работать с вашим проектом в виде структуры папок. У вас будет не единый цельный файл SC2Map или SC2Mod, а папка, со всем что содержит ваша карта.
Такой подход позволяет:
- Свободно редактировать xml-данные вашей карты
- Переносить из карты в карту сразу целые и готовые данные одной карты в другую, просто переносом файлов из одной папки в другую
- Вы сможете разработать на других языках программирования, собственные алгоритмы, предназначенные для работы с данными StarCraft 2. Так например один мододел под ником Visceroid сделал парсер данных, позволяющий без конфликтов объединить данные одной библиотеки ресурсов с другой, чтобы например войска из кампании использовать в обычной сетеввой игре не ломая текущий баланс.
- С помощью компонентов вы сможете настроить собственные "пространства данных" (Data spaces). Вкратце, это отдельная папка с файлами данных. С их помощью вы можете создать собственную структуру данных. Например у вас может быть пространство С героем вашей карты и всем что с ним связано, в другом пространстве данные друго героя, а в третьем например глобальные таланты игрока
№6 Дебаг триггеров: как разобраться в сложных конструкциях
Умение дебажить код — ключевой навык для любого разработчика. Вы всегда должны понимать, как работает ваш код. В редакторе карт StarCraft 2 нет сложных отладчиков (точнее есть, но для работы с ним нужно хотя бы немного понимать galaxy), но есть несколько простых методов для решения этой задачи.
Если вы не уверены, запускается ли определённый участок триггера или почему он активируется, когда этого не должно происходить, используйте действие Debug message. Этот инструмент поможет вам понять, как работает ваш код.
Представьте, что у вас есть сложный триггер с конструкцией if then else. Вам нужно проверить, выполняется ли условие в блоке if и запускается ли код в блоке then. Для этого просто добавьте действие Debug message в начало блока then.
Если сообщение появляется в игре, значит условие в блоке if выполняется и код заходит в блок then. Если же сообщение не появляется, условие не выполняется, и код не заходит в блок then.
Этот простой метод позволяет быстро проверить работу сложных конструкций и выявить проблемы в триггерах.
№7 Использование отладчика триггеров.
Отладчик триггеров - достаточно неплохой и удобный для отслеживания нагрузки на триггеры вашей карты.
Как вызвать окно отладчика?
- находясь в вашей запущенной карте локально, перевести отображение игры "в оконный режим" (Alt - Enter)
- прописать в чат команду "trigdebug"
Также в настройках редактора, в разделе "Test Document" Можно поставить галочку "Show trigger debugging window". В таком случае окно дебаггера будет открываться сразу после запуска карты.
Более подробную информацию можно прочитать в статье: Отладчик триггеров
№8 Триггеры: Использование записей (Record) для данных игрока
Если вам в триггерах надо хранить какую-то информацию для каждого игрока, например текущего героя игрока, включённые для него режимы, и прочее, Рекомендуется использовать записи (Records) (далее "структуры")
Структура - это набор разнотипных переменных в одной другой переменной. Каждая переменная внутри структуры, становится полем для той переменной, в которой она находится.
Кроме того, если на структуру ссылается целый массив, то каждая ячейка этого массива будет иметь собственные уникальные переменные записи.
И доступ к ним будет максимально прост и интуитивен.
И доступ к ним будет максимально прост и интуитивен.
Пример
Kill Player[(Triggering player)].Hero unit
Пример убийства героя, принадлежащего активирищего триггер, игроку
Как использовать?
- Создайте новую запись в списке триггеров (горячая клавиша Ctrl U)
- добавьте в неë переменные которые хотите хранить относительно каждого игрока отдельно
- Создайте глобальный массив размером 15 типа "- Record" И укажите свою запись
- Запишите какое-то значение в переменную записи в каком-то триггере, с помощью действия Set Variable