---
title: "Unreal插件开发"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/unreal-plugin-development/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/05-游戏图形与运行时/Unreal/Unreal插件开发.md"
content_hash: a0ecb1ce7fc5cf4d2c83201406ebc6f7b7a6ce9cdcf2930285f1ad3b9d2e53fa
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# Unreal插件开发

﻿# Unreal插件开发

> 创建时间：2022/3/4 18:40

* 目录结构
    * Plugin Descriptor Files
  * 操作方法
    * 打包发布
  * 插件编译执行过程
  * 编辑器拓展开发接口
  * 其他技巧
    * Include
      * Include public
      * Include private
    * 添加第三方依赖库
      * 链接错误的解决方法
    * 访问private或protected的UPROPERTY
  * Build.cs
  * Ref

## 目录结构

Engine /[UE4 Root]/Engine/Plugins/[Plugin Name]/

Game /[Project Root]/Plugins/[Plugin Name]/
(will be detected and loaded at Engine or Editor start-up time)

Public/Classes的父目录名就是module名

### Plugin Descriptor Files

Plugin descriptor Files: `.uplugin`
API: https://docs.unrealengine.com/4.27/en-US/API/Runtime/Projects/FPluginDescriptor/

Category：类目名即在插件浏览器中所属的类目。
Installed：默认启用或禁用状态，在插件浏览器中可以控制加载卸载插件模块。
Modules：描述模块名、运行类型、加载时机、支持平台等信息。
Type：Runtime，RuntimeNoCommandlet，Developer，Editor，EditorNoCommandlet，Program。
LoadingPhase：Default，PreDefault，PostConfigInit，PostConfigInit。
WhitelistPlatforms：支持的平台
BlacklistPlatforms：不支持的平台

## 操作方法

unreal的理念是开发工作都是在工程目录进行，包括插件开发

### 打包发布

https://blog.csdn.net/jxyb2012/article/details/88839224

```xml
public class AGenericClass&lt;T&gt; where T : IComparable&lt;T&gt; { }

```

## 插件编译执行过程

Plugins will automatically be compiled by UBT when compiling your game project.

```xml
public class AGenericClass&lt;T&gt; where T : IComparable&lt;T&gt; { }

```

每个独立模块都有一个类继承自 IModuleInterface，重写了插件加载卸载的方法。

.uplugin文件中Modules下的LoadingPhase字段说明了模块加载的时机，当满足这个时机时此模块StartupModule函数将被调用。此插件的功能入口就是从这里开始。当程序关闭或主动调用ShutdownModule函数时，模块将被卸载。

## 编辑器拓展开发接口

LevelEditorModule.GetToolBarExtensibilityManager()可以拓展关卡编辑器的工具栏，GetMenuExtensibilityManager()可以拓展菜单栏。
GEditor->GetEditorSubsystem<UAssetEditorSubsystem>()->OnAssetOpenedInEditor()，可以监听UE中，任意编辑器打开的事件。
FCoreUObjectDelegates::OnObjectPropertyChanged可以监听任意Object，任意属性的变化事件。

## 其他技巧

### Include

> unreal中所有头文件都可以include。只是ue建议只include public目录或Classes的头文件，不建议include private目录的。

#### Include public

在XXX.Build.cs文件中添加依赖Module：PublicDependencyModuleNames.AddRange
然后在某个源码文件，直接include。（从Public/Classes开始算路径）

#### Include private

在当前插件模块的build.cs文件中添加Private目录:

```xml
public class AGenericClass&lt;T&gt; where T : IComparable&lt;T&gt; { }

```
```xml
public class AGenericClass&lt;T&gt; where T : IComparable&lt;T&gt; { }

```

### 添加第三方依赖库

PublicIncludePaths.Add(zlibPath + “include” + platform); //把（.h）头文件路径引入。
PublicLibraryPaths.Add(zlibPath + “lib” + platform); //把（.lib）库文件路径引入。
PublicAdditionalLibraries.Add(“zlibstatic.lib”); //把（.lib）库文件引入。

https://blog.csdn.net/jxyb2012/article/details/88839224

#### 链接错误的解决方法

  1. 确保：把所属module添加到PublicDependencyModuleNames中
  2. 确保：如果缺失的函数or类是某个插件中的，需要标识为API，在函数前加入对应API宏。

> 例如module名为SamplePlg，则API宏为：SAMPLEPLG_API

### 访问private或protected的UPROPERTY

```xml
public class AGenericClass&lt;T&gt; where T : IComparable&lt;T&gt; { }

```
```xml
public class AGenericClass&lt;T&gt; where T : IComparable&lt;T&gt; { }

```

## Build.cs

配置文件属性详细说明：https://blog.csdn.net/jxyb2012/article/details/88839224

```xml
public class AGenericClass&lt;T&gt; where T : IComparable&lt;T&gt; { }

```

## Ref

https://www.jianshu.com/p/ec0ae889f417
https://www.jianshu.com/p/49684c1b6011
https://gameinstitute.qq.com/community/detail/121298
