Cave: Руководство по началу работы
Инструменты Python и Расширения Редактора
Lesson 16 of 19 • 10 XP
Keep your place in this quest
Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.
В предыдущем занятии вы узнали, как Python может управлять сущностями во время игрового процесса. Но Python в Cave не ограничивается только работающей игрой. Вы также можете использовать его для создания Инструментов редактора, которые помогут вам быстрее строить вашу игру.
Это особенно полезно, потому что многие проекты имеют повторяющиеся задачи. Возможно, вы часто размещаете врагов, создаете контрольные точки, организуете папки, тестируете значения или проверяете данные сцены. Вместо того чтобы делать все вручную каждый раз, вы можете создать небольшие инструменты, которые автоматизируют части вашего рабочего процесса. Вы даже можете создать более продвинутые редакторы, чтобы позволить вам делать процедурно генерируемые уровни, процедурные здания и многое другое.
В этом уроке вы узнаете:
- Разницу между игровыми сценариями и сценариями редактора.
- Для чего может использоваться инструмент редактора.
- Как структурирован инструмент в вкладке редактора.
- Почему
#editoronlyимеет значение. - Когда стоит создать пользовательский инструмент.
Вам не нужно сразу создавать инструменты, начиная с нуля, но хорошо знать, что такая система существует. Это одна из тех функций, которая становится более ценной по мере роста вашего проекта.
Игровые сценарии против инструментов редактора
Короче говоря:
- Игровые сценарии выполняются во время игры.
- Инструменты редактора работают внутри редактора, чтобы помочь вам работать над проектом.
| Тип сценария | Запускается в | Пример |
|---|---|---|
| Игровой сценарий | Режим игры и экспортированная игра. | Движение игрока, ИИ врагов, двери, предметы. |
| Инструмент редактора | Cave Editor. | Помощник уровня, пакетный переименовщик, инспектор сцены, генератор процедурных зданий, инструмент размещения. |
Например, сценарий открытия двери — это игровая логика, потому что игрок должен испытать это во время игры. Инструмент, который размещает десять факелов вдоль коридора — это логика редактора, потому что он помогает вам строить уровень, но не требует существования в экспортированной игре.
Почему инструменты редактора полезны
Сначала пользовательские инструменты могут показаться чем-то, что нужно только крупным командам.
Но даже индивидуальные разработчики могут извлечь выгоду из небольших инструментов, так как они уменьшают количество повторяющейся ручной работы. Если вы выполняете одну и ту же задачу много раз, простой сценарий редактора может сделать проект гораздо более быстрым в работе.
Инструменты редактора могут помочь с такими вещами, как:
- Размещением групп сущностей.
- Проверкой, отсутствуют ли необходимые компоненты.
- Создание общих установок сцены.
- Печать отладочной информации.
- Тестирование значений без входа в режим игры.
- Помощь дизайнерам в корректировке данных игрового процесса.
Например, представьте, что вы создаете игру от третьего лица с множеством лагерей врагов. Вместо того чтобы вручную создавать одну и ту же структуру папок каждый раз, вы могли бы создать инструмент, который автоматически добавляет Группу врагов, несколько точек появления и область триггера.
Скрипты только для редактора
Скрипты редактора обычно начинаются с этой строки:
#editoronly
Это говорит Cave, что скрипт предназначен для использования в редакторе.
Это важно, потому что инструменты редактора могут использовать API или поведение, которое имеет смысл только внутри редактора. Обычно вы не хотите, чтобы помощник по дизайну уровней или панель отладки были частью вашей финальной игры.
Это также важно для того, чтобы сообщить Cave, какие скрипты запускать при запуске игры и какие скрипты игнорировать. По умолчанию он запускает каждый скрипт, поэтому, если вы хотите, чтобы один из них игнорировался, он должен включать этот комментарий как первую строку.
Таким образом, если вы создаете скрипт, который существует только для того, чтобы помочь вам работать внутри Cave Editor, сделайте его только для редактора.
Инструменты вкладки редактора
Один из распространенных способов создания инструмента — это использование Вкладки редактора.

Вкладка редактора — это пользовательская панель, которая появляется внутри Cave Editor. У нее есть метод draw(), и Cave вызывает этот метод, пока вкладка видима, чтобы инструмент мог рисовать кнопки, текст, свойства и другие элементы управления.
Очень простая вкладка редактора выглядит так:
#editoronly
import cave
class ExampleTab(cave.ui.DebugTab):
def __init__(self):
super().__init__()
self.counter = 0
def draw(self):
cave.ui.text("Это пример инструмента.")
cave.ui.separator()
self.counter = cave.ui.prop("Счетчик", self.counter)
if cave.ui.buttonDark("Увеличить счетчик +1"):
self.counter += 1
print("Счетчик увеличен на +1")
Это также и есть код по умолчанию, когда вы добавляете вкладку редактора. Если вы нажмете, чтобы открыть его в вкладке свойств, а затем перейдете в вкладку инструментов редактора, вы увидите класс примерной вкладки, появляющийся как вкладка отладки. Тогда вам просто нужно зарегистрировать или перезагрузить вкладку, и она будет доступна для вас в интерфейсе:

Этот пример прост, но он уже показывает основную идею:
cave.ui.DebugTabсоздает пользовательскую вкладку редактора.draw()определяет, что показывает вкладка.cave.ui.text()рисует текст.cave.ui.prop()рисует редактируемое свойство.cave.ui.buttonDark()создает кнопку.print()может использоваться для отправки информации в консоль.
Вот так просто создавать пользовательские инструменты для Cave Editor. Вы можете использовать эту же структуру для создания реальных инструментов позже.
Что означает метод draw()
Метод draw() не похож на start() в игровом компоненте.
Он вызывается многократно, пока инструмент видим, потому что пользовательский интерфейс редактора должен быть нарисован и обновлен. Это означает, что код внутри draw() должен описывать текущий интерфейс инструмента.
Например:
def draw(self):
cave.ui.text("Помощник уровня:")
if cave.ui.buttonDark("Создать группу врагов"):
print("Нажата кнопка создать группу врагов")
Кнопка рисуется каждый раз, когда вкладка обновляется, но код внутри if выполняется только тогда, когда пользователь нажимает кнопку.
Этот шаблон очень распространен в инструментах редактора.
Идея практического инструмента
Допустим, вы строите уровень и часто нуждаетесь в одной и той же базовой структуре папок:
Окружающая средаВрагиТриггеры игрового процессаОсвещениеАудиоОтладочные помощники
Вы могли бы создать инструмент редактора с кнопкой, называемой Создать папки уровня. При нажатии она могла бы создать эти папочные сущности в текущей сцене. Помните: папка в графе сцены — это просто сущность без прикрепленных к ней компонентов.
Это может показаться мелочью, но маленькие инструменты, подобные этому, делают большие проекты легче организованными. Они также помогают вам следовать вашим собственным проектным стандартам без необходимости запоминать каждый шаг вручную.
Компоненты редактора
Иногда вы хотите смешать игровую логику с логикой редактора. Например, вы можете захотеть, чтобы компонент прикреплялся к сущности и одновременно выполнял логику редактора, например, отображал информацию отладки или сферу отладки, указывающую диапазон движения или атаки врага. В этом случае вместо использования cave.Component вы используете cave.EditorComponent.
Это полезно, когда сущности требуется специальное поведение редактора, но это поведение не должно быть частью самой игры.
Например:
- Точка появления могла бы рисовать вспомогательную информацию в редакторе.
- Объем триггера мог бы открывать элементы управления отладки.
- Маркер уровня мог бы проверять, правильно ли он настроен.
Важная идея заключается в том, что скрипты редактора предназначены для рабочего процесса вокруг создания игры. Игровые скрипты предназначены для самой игры.
ВАЖНО: В этом случае поведение немного отличается от обычного компонента, потому что, поскольку это компонент редактора, у него будет метод обновления редактора, который будет вызываться каждый кадр, пока редактор работает, а игра не. Но, и это самое важное отличие, этот компонент будет фактически зарегистрирован, инициализирован и запущен с самой сущностью, независимо от того, находится ли она в режиме игры или нет. Поэтому, если вы поместите логику в метод start этого компонента, она будет вызываться даже вне режима игры.
Это может быть потенциально опасно, например: если вы поместите логику в метод start редакторского компонента, который получает все сущности в сцене и удаляет их, тогда ваша игра будет полностью удалена в редакторе разрушительным (нельзя отменить) способом. Это не ошибка, это не баг, это так задумано по дизайну. Так что будьте внимательны к этому.
Если вы хотите более безопасный способ сделать это, вы можете использовать компонент Python Code, потому что он действительно имеет метод обновления редактора, и наличие этого метода обновления редактора не будет мешать вызовам методов start и end в редакторе (они не будут вызываться). Посмотрите на врага в начальном проекте, который создает Cave, потому что он использует компонент Python Code, чтобы нарисовать debug-сферу вокруг врагов, указывая радиус, в котором они могут бродить. Это хороший способ узнать об этом больше.
Когда вам следует создать инструмент?
Не создавайте пользовательский инструмент для каждого мелкого действия.
Создайте инструмент, когда он решает реальную проблему рабочего процесса, такую как:
- Вы повторяете одну и ту же задачу много раз.
- Установку легко забыть.
- Сцене требуется валидация.
- Дизайнеру нужен более чистый интерфейс для изменения значений.
- Прототипу нужны быстрые кнопки отладки.
Для начинающего лучше сначала вручную создать объект игры. Затем, как только вы поймете шаги, вы можете автоматизировать скучную часть.
Что вам следует помнить
Python в Cave может использоваться как для игрового процесса, так и для инструментов редактора.
Игровые скрипты контролируют, что происходит во время работы игры. Скрипты редактора помогают вам строить, проверять, отлаживать или организовывать проект внутри Cave Editor.
Вам не нужны инструменты редактора, чтобы сделать свою первую игру, но они полезны, когда ваш проект начинает расти. Небольшой инструмент, который экономит пять минут сегодня, может сэкономить часы позже.