【UE基础】创建PLUGINS

本文详细介绍了如何在C++中创建并使用Plugins,包括创建Shape Plugin的步骤,代码组织结构,以及如何在TestPlugin中集成和使用Shape的功能。通过实例展示如何使代码模块化,便于维护和复用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何使代码模块化,使用Plugins可能是一种比较好的方式,下面通过一个例子,讲一讲如何创建和使用Plugins。

一、创建C++工程TestPlugins:


从菜单中选择"Edit"->"Plugins",会弹出如下窗口:

点出“New Plgin”,在弹出的窗口中选中“Blank”,然后输入“Shape”,点出“Create Plugin”后,会创建一个名为“Shape”的plugin:

工程的目录结构如下:

从上图可以看到,Shape Plugin的代码目录和TestPlugin工程的基本上是一样的,都有Source文件夹和.uproject文件,Source文件夹下都有.Build.cs文件。打开“Shape.Build.cs”文件,可以看到内容如下:

// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
 
using UnrealBuildTool;
 
public class Shape : ModuleRules
{
	public Shape(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
		
		PublicIncludePaths.AddRange(
			new string[] {
				"Shape/Public"
				// ... add public include paths required here ...
			}
			);
				
		
		PrivateIncludePaths.AddRange(
			new string[] {
				"Shape/Private",
				// ... add other private include paths required here ...
			}
			);
			
		
		PublicDependencyModuleNames.AddRange(
			new string[]
			{
				"Core",
				// ... add other public dependencies that you statically link with here ...
			}
			);
			
		
		PrivateDependencyModuleNames.AddRange(
			new string[]
			{
				"CoreUObject",
				"Engine",
				"Slate",
				"SlateCore",
				// ... add private dependencies that you statically link with here ...	
			}
			);
		
		
		DynamicallyLoadedModuleNames.AddRange(
			new string[]
			{
				// ... add any modules that your module loads dynamically here ...
			}
			);
	}
}

内容和TestPlugin.Build.cs大致相同,主要是多了对“Public”和“Private”这两个目录的包含,实际上TestPlugin也可以创建这两个目录来存放代码,只要在TestPlugin.Build.cs中中加入如下代码即可:

PublicIncludePaths.AddRange(
	new string[] {
		"TestPlugin/Public"
		// ... add public include paths required here ...
	}
	);
		
 
PrivateIncludePaths.AddRange(
	new string[] {
		"TestPlugin/Private",
		// ... add other private include paths required here ...
	}
	);

二、在Shape中添加代码:

代码目录结构:

Shape--+
       |-Public--+
       |         |-circle.h
       |
       |-Private-+
                 |-circle_impl.h
                 |-circle_impl.cpp
                 |-circle.cpp
// circle.h
// 圆的接口类
class SHAPE_API Circle {
public:
	virtual ~Circle() {};
 
	// 接口方法:面积
	virtual double area() = 0;
 
 
	static Circle* create(double radius);     // 创建circle实例
	static void destroy(Circle* circlePtr);   // 销毁circle实例
};
// circle.cpp
#include "circle.h"
#include "circle_impl.h"
 
Circle* Circle::create(double radius) {
	Circle* circlePtr = new CircleImpl(radius);
 
	return circlePtr;
};
 
void Circle::destroy(Circle* circlePtr) {
	delete circlePtr;
};
// circle_impl.h
#include "circle.h"
 
// 圆的具体实现类
class CircleImpl : public Circle {
 
private:
	double radius;
public:
	CircleImpl(double radius);
	double area() override;
};
// circle_impl.cpp
#include "circle_impl.h"
 
#include <cmath>
 
inline double pi() {
	return std::atan(1) * 4;
};
 
CircleImpl::CircleImpl(double _radius) : radius(_radius) {
};
 
double CircleImpl::area() {
	return pi() * radius * radius;
};

中宏SHAPE_API会自动被识别,用于把Plugin导出成dll,可能的名字为UE4Editor-Shape.dll。

三、 修改TestPlugin工程

在“TestPlugin.Build.cs”中添加“Shape”Plugin,否则编译时会找不到。

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "Shape" });

修改ATestPluginGameModeBase:

// TestPluginGameModeBase.h
#pragma once
 
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
 
#include "circle.h"
 
#include "TestPluginGameModeBase.generated.h"
 
/**
 * 
 */
UCLASS()
class TESTPLUGIN_API ATestPluginGameModeBase : public AGameModeBase
{
	GENERATED_BODY()
 
private:
	Circle* circle;
	
public:
 
	ATestPluginGameModeBase();
 
	~ATestPluginGameModeBase();
	
	void BeginPlay();
};
// TestPluginGameModeBase.cpp
 
#include "TestPluginGameModeBase.h"
 
 
ATestPluginGameModeBase::ATestPluginGameModeBase() {
 
	circle = Circle::create(10);
 
	UE_LOG(LogTemp, Log, TEXT("circle.area=%f"), circle->area());
};
 
ATestPluginGameModeBase::~ATestPluginGameModeBase() {
};
 
 
void ATestPluginGameModeBase::BeginPlay() {
	Circle::destroy(circle);
 
	UE_LOG(LogTemp, Log, TEXT("destroy circle"));
};

同时在UEEditor将当前Level的GameMode设置成TestPluginGameModeBase:

编译后,点Play,就可以在Output Log中看到打印的日志了。

参考文档:

https://docs.unrealengine.com/en-us/Programming/Plugins

https://wiki.unrealengine.com/An_Introduction_to_UE4_Plugins

<think>嗯,用户想了解如何在Unreal Engine(UE)中创建一个空白插件。首先,我需要回忆一下UE插件开发的基本流程。记得UE提供了插件创建的工具,可以通过编辑器内的菜单生成插件模板。但用户可能需要详细的步骤说明,所以得一步步来。 首先,应该提到打开Unreal Engine编辑器,然后在菜单栏中找到“工具”选项,那里应该有一个“新建插件”的入口。接下来,用户需要选择插件模板。这里需要注意,空白插件通常对应的是“Blank”模板,可能还有其他选项,比如带有UI的,但用户明确要空白的,所以重点说明选择Blank。 然后,填写插件的基本信息,比如插件名称、作者、描述等。这部分需要提醒用户注意命名规范,不能有空格或特殊字符,避免后续编译问题。版本和适用的引擎版本也需要正确填写,特别是如果用户使用的是特定版本的UE,比如UE4或UE5,可能会有差异,不过现在普遍是UE5了,但可能需要提到兼容性。 接下来,生成插件后的目录结构需要解释清楚。比如,插件的Source文件夹、资源文件夹,还有.uplugin文件的作用。可能需要说明每个文件的作用,比如.uplugin是插件的描述文件,Build.cs负责编译设置等。 然后,启用插件这一步也很重要。用户可能不知道创建后需要手动启用,所以需要指导他们在项目设置中找到插件管理,勾选启用,并可能需要重启编辑器。这部分需要详细,避免用户找不到地方。 接下来,添加功能部分可能比较关键。空白插件默认没有功能,所以需要用户自己添加模块或代码。需要解释如何创建C++类,修改Build.cs和.uplugin文件来包含新模块。这里可能会涉及到UE的模块系统,可能需要简单说明模块的作用和添加方法。 测试插件也是一个重要步骤。用户可能需要知道如何验证插件是否正常工作,比如添加日志输出或创建简单的蓝图节点。需要给出具体的代码示例,比如使用UE_LOG输出日志,并指导如何查看输出日志确认。 打包和分发部分可能需要简要说明,但用户可能暂时不需要,所以可以简单带过,提醒他们如果需要分发的话需要注意的事项。 此外,可能要考虑用户的潜在问题。比如,创建插件时遇到编译错误怎么办?可能需要检查命名是否符合规范,或者依赖项是否正确添加。或者,插件启用后没有生效,可能需要检查日志或重新生成项目文件。 最后,确保整个流程结构清晰,步骤分明,用户能一步步跟随操作。同时,使用中文,避免专业术语过多,必要时进行解释。比如,解释.uplugin文件的作用时,可以用简单的语言说明它是插件的配置文件,包含元数据等信息。 总结下来,回答需要分步骤,从创建、配置、启用、添加功能到测试,每个步骤详细但不过于冗长,确保用户能理解并操作。同时,注意提到的LaTeX格式要求,虽然这个问题中可能用不到数学公式,但如果有涉及公式的地方需要按照规则处理,但此处可能不需要。</think>在Unreal Engine中创建空白插件的步骤如下: ### 一、创建插件模板 1. **打开UE编辑器** 启动UE后,在顶部菜单栏选择 **工具(Tools) → 新建插件(New Plugin)** 2. **选择模板类型** 在弹出窗口中: - 选择 **空白(Blank)** 模板 - 勾选「显示内容目录中的插件」(便于在项目目录中直接查看) 3. **配置插件信息** ```plaintext 插件名称(Plugin Name): MyBlankPlugin // 使用驼峰命名,无空格 描述(Description): 空白插件示例 作者(Author): YourName 版本(Version): 1.0 ``` ### 二、插件目录结构 生成的文件结构如下: ``` MyProject/Plugins/MyBlankPlugin/ ├── Resources/ // 图标资源 ├── Source/ // C++源码目录 │ └── MyBlankPlugin/ │ ├── Private/ │ └── Public/ ├── MyBlankPlugin.uplugin // 插件描述文件 └── MyBlankPlugin.Build.cs // 编译规则文件 ``` ### 三、启用插件 1. 进入 **编辑(Edit) → 项目设置(Project Settings) → 插件(Plugins)** 2. 在「已安装插件」列表中找到你的插件 3. 勾选「已启用(Enabled)」,重启编辑器 ### 四、添加基础功能(示例) 1. **创建新模块** 在`Source/`目录下新建`MyModule`文件夹,包含: - `MyModule.Build.cs`:定义模块依赖 ```csharp public class MyModule : ModuleRules { public MyModule(ReadOnlyTargetRules Target) : base(Target) { PublicDependencyModuleNames.AddRange(new string[] { "Core" }); } } ``` 2. **修改.uplugin文件** ```json { "Modules": [ { "Name": "MyModule", "Type": "Runtime", "LoadingPhase": "Default" } ] } ``` ### 五、编译验证 1. 右键`.uproject`文件选择 **Generate Visual Studio Project** 2. 编译后查看输出日志: ```log LogPluginManager: Mounting plugin MyBlankPlugin ``` ### 六、常见问题排查 - **插件未显示**:检查是否放置在`Project/Plugins/`而非引擎目录 - **编译失败**:确保VS包含C++游戏开发组件 - **加载错误**:检查模块名称在`.uplugin`和`.Build.cs`中的一致性 ### 高级配置(可选) 1. **添加Slate UI** 在模块中添加: ```csharp PublicDependencyModuleNames.Add("Slate"); ``` 2. **创建控制台命令** ```cpp static FAutoConsoleCommand MyCommand( TEXT("MyPlugin.Command"), TEXT("示例命令"), FConsoleCommandDelegate::CreateLambda([](){ UE_LOG(LogTemp, Warning, TEXT("Command Executed!")); }) ); ``` 建议从简单功能开始测试,逐步扩展插件能力。官方文档《Plugins Programming Guide》提供了更深入的API参考。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值