写一个UE5的插件DEMO
时间: 2023-07-01 19:07:57 浏览: 252
UE5 OpenCV插件
5星 · 资源好评率100%
好的,我来写一个简单的UE5插件Demo。
首先,需要在UE5中新建一个插件项目。打开UE5编辑器,进入File -> New C++ Class,选择Plugin,然后选择要创建插件的目录和名称。在创建的时候可以选择空白模板或者基础代码模板,我们选择空白模板。
创建完成后,在插件目录中会生成一些文件和文件夹。我们需要在Source文件夹下创建一个新的C++类,这个类将会是我们插件的主要实现。
在新建的C++类中,我们需要实现插件的逻辑。这里我写一个简单的功能,就是在场景中生成一个球体,并且可以设置球体的半径和颜色。
```cpp
#include "MyPlugin.h"
#include "MyPluginCommands.h"
#include "MyPluginStyle.h"
#include "LevelEditor.h"
#include "Editor/UnrealEd/Public/LevelEditorActions.h"
#include "Engine/StaticMesh.h"
#include "Engine/StaticMeshActor.h"
#include "Components/StaticMeshComponent.h"
DEFINE_LOG_CATEGORY(LogMyPlugin);
#define LOCTEXT_NAMESPACE "FMyPluginModule"
void FMyPluginModule::StartupModule()
{
// 注册命令
FMyPluginCommands::Register();
// 注册菜单按钮
PluginCommands = MakeShareable(new FUICommandList);
PluginCommands->MapAction(
FMyPluginCommands::Get().GenerateSphere,
FExecuteAction::CreateRaw(this, &FMyPluginModule::GenerateSphere),
FCanExecuteAction());
FLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor");
TSharedPtr<FExtender> MenuExtender = MakeShareable(new FExtender);
MenuExtender->AddMenuExtension("LevelEditor", EExtensionHook::After, PluginCommands, FMenuExtensionDelegate::CreateRaw(this, &FMyPluginModule::AddMenuExtension));
LevelEditorModule.GetMenuExtensibilityManager()->AddExtender(MenuExtender);
}
void FMyPluginModule::ShutdownModule()
{
// 注销命令
FMyPluginCommands::Unregister();
}
void FMyPluginModule::AddMenuExtension(FMenuBuilder& Builder)
{
Builder.BeginSection("MyPlugin", LOCTEXT("MyPluginLabel", "My Plugin"));
Builder.AddMenuEntry(FMyPluginCommands::Get().GenerateSphere);
Builder.EndSection();
}
void FMyPluginModule::GenerateSphere()
{
// 获取当前场景
UWorld* World = GEditor->GetEditorWorldContext().World();
if (!World)
{
UE_LOG(LogMyPlugin, Error, TEXT("Failed to get current world!"));
return;
}
// 创建球体
AStaticMeshActor* SphereActor = World->SpawnActor<AStaticMeshActor>();
UStaticMeshComponent* SphereComponent = SphereActor->GetStaticMeshComponent();
SphereComponent->SetStaticMesh(LoadObject<UStaticMesh>(nullptr, TEXT("/Engine/BasicShapes/Sphere.Sphere")));
SphereComponent->SetMobility(EComponentMobility::Movable);
// 设置半径
float Radius = 100.f;
SphereComponent->SetWorldScale3D(FVector(Radius / 100.f));
// 设置颜色
FLinearColor Color = FLinearColor::Red;
SphereComponent->SetMaterial(0, UMaterialInstanceDynamic::Create(SphereComponent->GetMaterial(0), nullptr));
SphereComponent->GetMaterial(0)->SetVectorParameterValue(FName(TEXT("Color")), Color);
UE_LOG(LogMyPlugin, Log, TEXT("Sphere generated!"));
}
#undef LOCTEXT_NAMESPACE
IMPLEMENT_MODULE(FMyPluginModule, MyPlugin)
```
在这个C++类中,我们实现了插件的启动和关闭方法,以及添加菜单按钮和生成球体的方法。其中,菜单按钮的逻辑是通过注册命令和菜单扩展来实现的。生成球体的逻辑是通过获取当前场景、创建球体、设置半径和颜色来实现的。
在完成C++类的编写后,我们还需要在插件目录下创建一个资源文件夹,用来存放插件的图标和UI界面等资源。在资源文件夹下,我们可以创建一个XML文件,用来定义插件的UI界面。
```xml
<?xml version="1.0" encoding="UTF-8"?>
<Widgets>
<Widget
Type="Menu"
ID="MyPlugin"
DisplayName="My Plugin">
<Item
Type="Button"
CommandName="MyPlugin.GenerateSphere"
DisplayName="Generate Sphere"/>
</Widget>
</Widgets>
```
这个XML文件定义了一个菜单按钮,点击后会执行MyPlugin.GenerateSphere命令。
最后,我们需要在插件的.build.cs文件中添加一些模块依赖和资源依赖。这些依赖会在编译插件时自动添加到插件中。
```cpp
using UnrealBuildTool;
public class MyPlugin : ModuleRules
{
public MyPlugin(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore", "LevelEditor" });
DynamicallyLoadedModuleNames.AddRange(new string[] { "AssetTools", "MainFrame", "LevelEditor", "Projects" });
PrivateIncludePaths.AddRange(new string[] { "MyPlugin/Private" });
string PluginPath = Utils.MakePathRelativeTo(ModuleDirectory, BuildConfiguration.RelativeEnginePath);
AdditionalPropertiesForReceipt.Add(new ReceiptProperty("ModuleRelativePath", PluginPath));
}
}
```
这样,我们就完成了一个简单的UE5插件Demo。当我们在UE5编辑器中启用这个插件后,就可以在My Plugin菜单下看到Generate Sphere按钮。点击按钮后,就可以在场景中生成一个球体了。
阅读全文