Введение в разработку плагинов в Unreal Engine

Добро пожаловать в увлекательный мир разработки плагинов в Unreal Engine! Если вы здесь, вероятно, вам не терпится раскрыть весь потенциал этого мощного игрового движка, создавая собственные уникальные плагины. В этой статье мы отправимся в путешествие по созданию плагина с нуля, используя C++ как нашу верную волшебную палочку.

Зачем нужны плагины?

Плагины — это магические заклинания, которые могут усилить или полностью изменить поведение Unreal Engine. Они позволяют добавлять новые функции, инструменты и даже целые системы без необходимости изменять основной код движка. Это делает их невероятно универсальными и необходимыми для любого серьёзного разработчика.

Настройка среды

Прежде чем погрузиться в волшебство, давайте убедимся, что наша среда настроена правильно.

Выбор подходящего типа проекта

При создании нового проекта в Unreal Engine убедитесь, что вы выбрали опцию «C++». Это важно, поскольку позволяет создавать и работать с плагинами на C++, что было бы невозможно при выборе опции только Blueprint.

Visual Studio и настройка редактора

После создания проекта Unreal Engine автоматически откроет Visual Studio и редактор Unreal Engine. Здесь вы увидите структуру вашего проекта, включая карту по умолчанию.

Создание первого плагина

Шаг 1: Добавление нового плагина

В редакторе Unreal Engine перейдите в «Настройки» > «Плагины» и нажмите кнопку «Добавить новый». Вы увидите различные шаблоны плагинов; для этого примера мы будем использовать шаблон «Кнопка панели инструментов редактора».

  • Назовите свой плагин (например, «NightModePlugin»).
  • Заполните необходимые данные и нажмите «Создать».

Шаг 2: Написание кода плагина

Теперь давайте напишем код на C++, чтобы наш плагин работал. Наша цель — создать кнопку, которая при нажатии превращает текущий уровень в ночную сцену.

Структура кода плагина:

Вот базовая структура того, как может выглядеть ваш код плагина:

// NightModePlugin.h
#pragma once

#include "CoreMinimal.h"
#include "Modules/ModuleManager.h"
#include "NightModePlugin.generated.h"

class NIGHTMODEPLUGIN_API FNightModePlugin : public IModuleInterface
{
public:
    virtual void StartupModule() override;
    virtual void ShutdownModule() override;
};

// NightModePlugin.cpp
#include "NightModePlugin.h"
#include "LevelEditor.h"
#include "Editor.h"
#include "DirectionalLight.h"
#include "PostProcessVolume.h"

void FNightModePlugin::StartupModule()
{
    // Create the toolbar button
    TSharedPtr<FExtender> Extender = MakeShareable(new FExtender);
    Extender->AddToolBarExtension(
        "NightMode",
        EExtensionHook::After,
        FToolBarExtensionDelegate::CreateRaw(this, &FNightModePlugin::AddToolbarButton)
    );

    // Register the button click event
    FLevelEditorModule& LevelEditorModule = FModuleManager::GetModuleChecked<FLevelEditorModule>("LevelEditor");
    LevelEditorModule.GetToolBarExtender()->AddExtender(Extender);
}

void FNightModePlugin::ShutdownModule()
{
    // Clean up
}

void FNightModePlugin::AddToolbarButton(FToolBarBuilder& Builder)
{
    Builder.AddToolBarButton(
        FUIAction(
            FExecuteAction::CreateRaw(this, &FNightModePlugin::OnNightModeButtonClicked),
            FCanExecuteAction::CreateRaw(this, &FNightModePlugin::CanExecuteNightModeButton)
        ),
        NAME_None,
        FText::FromString("Night Mode"),
        FText::FromString("Toggle Night Mode"),
        FSlateIcon(FAppStyle::GetAppStyle()->GetIcon("LevelEditor.ViewOptions")),
        EUserInterfaceActionType::Button
    );
}

void FNightModePlugin::OnNightModeButtonClicked()
{
    // Get the current world
    UWorld* World = GEditor->GetEditorWorldContext()->World();

    if (World)
    {
        // Find the directional light and adjust its intensity
        for (AActor* Actor : World->GetActors())
        {
            if (ADirectionalLight* Light = Cast<ADirectionalLight>(Actor))
            {
                Light->SetIntensity(0.1f);
                break;
            }
        }

        // Adjust post-process volume settings
        for (AActor* Actor : World->GetActors())
        {
            if (APostProcessVolume* Volume = Cast<APostProcessVolume>(Actor))
            {
                Volume->SetAutoExposureMinBrightness(0.1f);
                Volume->SetAutoExposureMaxBrightness(1.0f);
                break;
            }
            else
            {
                // Add an unbound post-process volume if none exists
                APostProcessVolume* NewVolume = World->SpawnActor<APostProcessVolume>(APostProcessVolume::StaticClass());
                NewVolume->SetAutoExposureMinBrightness(0.1f);
                NewVolume->SetAutoExposureMaxBrightness(1.0f);
            }
        }
    }
}

bool FNightModePlugin::CanExecuteNightModeButton()
{
    return true; // Always executable in this example
}

Шаг 3: Упаковка плагина

Когда вы написали и протестировали свой плагин, пришло время упаковать его, чтобы вы могли использовать его в других проектах.

  • В редакторе Unreal Engine перейдите к «Настройки» > «Плагины», найдите свой плагин.
  • Нажмите на три точки рядом с вашим плагином и выберите «Упаковка».
  • Выберите каталог для сохранения упакованного плагина.

Вот простая диаграмма, иллюстрирующая процесс упаковки:

graph TD A("Unreal Engine Editor") -->|Go to Settings > Plugins| B("Plugins List") B -->|Select Plugin| C("Plugin Options") C -->|Package| D("Choose Directory") D -->|Save| B("Packaged Plugin")

Использование плагина в других проектах

Чтобы использовать упакованный плагин в другом проекте, выполните следующие действия:

  • Скопируйте папку упакованного плагина в каталог «Плагины» нового проекта.
  • Откройте файл .uplugin и убедитесь, что «EnabledByDefault» установлено в значение true.

Вот как вы можете включить плагин в свой новый проект:

graph TD A("New Project Directory") -->|Copy Plugin Folder| B("Plugins Directory") B -->|Edit .uplugin File| C("Enable Plugin") C -->|Restart Editor| B("Plugin Available")