返回「计算机、信息技术与工程」

Unreal插件开发

更多
Markdown 结构化数据
本文目录 15 个章节

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

public class AGenericClass<T> where T : IComparable<T> { }

插件编译执行过程

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

public class AGenericClass<T> where T : IComparable<T> { }

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

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

编辑器拓展开发接口

LevelEditorModule.GetToolBarExtensibilityManager()可以拓展关卡编辑器的工具栏,GetMenuExtensibilityManager()可以拓展菜单栏。 GEditor->GetEditorSubsystem()->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目录:

public class AGenericClass<T> where T : IComparable<T> { }
public class AGenericClass<T> where T : IComparable<T> { }

添加第三方依赖库

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

public class AGenericClass<T> where T : IComparable<T> { }
public class AGenericClass<T> where T : IComparable<T> { }

Build.cs

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

public class AGenericClass<T> where T : IComparable<T> { }

Ref

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