赞
踩
UE4引擎和UE4项目是由各个模块组成的,其主要编程语言是C++。
插件也是一个模块,说到插件必须讲到耦合性与独立性,耦合性是对模块间关联程度的度量,模块间关联越强,则耦合性强,独立性差。
庞大的UE4引擎各模块相互参差作用,所以想要读懂并拆解并非易事,而创建UE4游戏项目实则只引入了引擎的部分模块,再想想如果很多游戏项目都需要用到这一个自定义功能时,是不是每个项目都要开发一次这个功能,个人或者一家公司内部还好,只要把项目代码复制给另一个项目即可,但是全球这么多的UE4开发者怎么办,开发者的结晶势必要发挥它最大的用处,把自己的研发成果分享出去,为了解决这类问题,就要使得模块独立起来,那么UE4插件就该闪亮登场了。
举个栗子:两个人同时在设计创建机器人,A为自己的机器人造了一把枪,B却为自己的机器人造了飞行器,AB两人把自己的成果分享出来,于是高达诞生了。
UE4引擎拥有插件管理模块并提供了插件加载卸载和其他功能接口,所以UE4插件可以自定义功能,因为其独立性强可以发布共享,且使用方便。
UE4引擎由Epic官方维护与发布,源码托管在GitHub平台上,可以上官网下载EpicGamesLauncher管理下载各个UE4 Release版本。
UE4项目是基于某个版本而创建的Game项目,在Game项目中可以设计关卡、摆放场景、添加功能、发布应用程序等,发布后可以脱离引擎独立运行。
UE4插件可以增加UE4的扩展性,丰满Game项目,也可让开发应用程序变得简单且多样化,但其不能独立运行。
UE4插件管理界面中的插件对应了UE4安装目录下的Plugins文件下的插件,列表类目名有些和文件夹名字对应不上,那是因为类目名由插件项目.uplugin文件中的Category字段内容来生成的。
1. UE4插件浏览器界面
2. UE4安装目录插件文件夹
假如创建一个游戏项目叫PluginFactory,在这个游戏项目来创建一个名为PanoCam的插件则插件目录如下
Binaries:编译后的dll文件存放位置
Content:游戏资源Asset文件存放位置
Intermediate:编译的中间文件存放位置
Resources:一般为图片图标的存放位置
Source:代码存放位置
.uplugin文件:插件项目配置文件,JSON格式
.Build.cs文件:每个 .build.cs 文件声明派生自 ModuleRules 基类的类,并设置属性控制器从构造函数进行编译的方式。由虚幻编译工具编译,并被构造来确定整体编译环境。使用C#语法
1. uplugin文件
{ "FileVersion": 3, "Version": 1, "VersionName": "1.0", "FriendlyName": "PanoCam", "Description": "", "Category": "Other", "CreatedBy": "Scrat", "CreatedByURL": "", "DocsURL": "", "MarketplaceURL": "", "SupportURL": "", "CanContainContent": true, "IsBetaVersion": false, "Installed": true, "Modules": [ { "Name": "PanoCam", "Type": "Runtime", "LoadingPhase": "PreDefault", "WhitelistPlatforms": [ "Win32", "Win64" ] } ] }
几个重点注意的标签
2. Build.cs文件
// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved. using UnrealBuildTool; public class PanoCam : ModuleRules { public PanoCam(ReadOnlyTargetRules Target) : base(Target) { PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; PublicIncludePaths.AddRange( new string[] { "PanoCam/Public" // ... add public include paths required here ... } ); PrivateIncludePaths.AddRange( new string[] { "PanoCam/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 ... } ); } }
配置文件中的属性说明
Build.cs配置文件一个重要技巧
如果插件中有依赖非UAsset文件,打包时需要手动拷贝到打包对应路径下,使用一下方法可使其自动拷贝过去
using UnrealBuildTool; using System.IO; public class PanoCam : ModuleRules { //封装一个函数专门获取依赖文件的路径 private string ContentSlatePath { get { return Path.GetFullPath(Path.Combine(ModuleDirectory, "../../Content/Slate/")); } } public PanoCam(ReadOnlyTargetRules Target) : base(Target) { PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; //遍历路径下的文件,通过RuntimeDependencies来添加运行时依赖文件 if (Directory.Exists(ContentSlatePath)) { foreach (string Picture in Directory.EnumerateFiles(ContentSlatePath, "*.*", SearchOption.AllDirectories)) { RuntimeDependencies.Add(Path.Combine(ContentSlatePath, Picture)); } } } }
开发环境:Windows、UE4.21、VistualStudio2017
前提:必须创建一个UE4 C++项目
插件创建有三种方法:
1.使用UE4自带的插件创建方法
2.自己手动创建插件目录及相关配置与代码文件
手动创建后需要在UE4项目的.uproject文件上右键执行Generate Vistual Studio project files来刷新代码目录结构,如果只是添加或删减少量文件的话此步骤也可以手动在VistualStudio中操作。
3.写一个插件生成插件
创建一个插件,并在插件中设置自定义的插件模板文件,在插件功能中复制对应的自定义插件模板文件到项目插件目录中,并动态修改文件夹名和文档关键字即可实现自定义插件生成器。
PanoCam.h的代码内容如下
#pragma once
#include "CoreMinimal.h"
#include "ModuleManager.h"
class FPanoCamModule : public IModuleInterface
{
public:
/** IModuleInterface implementation */
virtual void StartupModule() override;
virtual void ShutdownModule() override;
};
每个独立模块都有一个这样的类且继承于 IModuleInterface,重写了插件加载卸载的方法。
.uplugin文件中Modules下的LoadingPhase字段说明了模块加载的时机,当满足这个时机时此模块StartupModule函数将被调用。
此插件的功能入口就是从这里开始。
当程序关闭或主动调用ShutdownModule函数时,模块将被卸载。
UE4模块引入第三方库,只要在Build.cs中配置头文件路径及添加lib文件即可。
以zlib为例,在.uplugin同级创建ThirdParty文件夹,把第三方库文件放在其中,此处为了节省篇幅只展示一条全路径zlib/v1.2.8/include/Win64/VS2015/。
此第三方库zlib引擎自带,可根据自己的引擎安装目录获取到(如:E:\Program Files\Epic Games\UE_4.21\Engine\Source\ThirdParty\zlib),我也上传了一份到csdn资源中可供单独下载使用。
目录结构如下。
重新编辑Build.cs代码,引入第三方库zlib
using UnrealBuildTool; public class PanoCam : ModuleRules { public PanoCam(ReadOnlyTargetRules Target) : base(Target) { PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; //~~~和之前一样,此处代码不变 DynamicallyLoadedModuleNames.AddRange( new string[] { // ... add any modules that your module loads dynamically here ... } ); //此处开始配置第三方库zlib string zlibPath = ModuleDirectory + "../ThirdParty/zlib/v1.2.8/"; if (Target.Platform == UnrealTargetPlatform.Win64) { string platform = "/Win64/VS2015"; PublicIncludePaths.Add(zlibPath + "include" + platform); PublicLibraryPaths.Add(zlibPath + "lib" + platform); PublicAdditionalLibraries.Add("zlibstatic.lib"); } else if (Target.Platform == UnrealTargetPlatform.Win32) { string platform = "/Win32/VS2015"; PublicIncludePaths.Add(zlibPath + "include" + platform); PublicLibraryPaths.Add(zlibPath + "lib" + platform); PublicAdditionalLibraries.Add("zlibstatic.lib"); } } }
虽然添加了十几行代码,但重要的代码就三行
之后就可以在你的代码中#include 第三方的(.h)文件,使用其中的功能了。
//添加头文件 #include "LevelEditorViewport.h" #include "Engine/StaticMeshActor.h" //修改PluginButtonClicked函数代码 void FTestToolbarModule::PluginButtonClicked() { //通过当前编辑视图实例获取当前World UWorld *World = GCurrentLevelEditingViewportClient->GetWorld(); if (World) { //在视图中放置StaticMeshActor AStaticMeshActor* Actor = World->SpawnActor<AStaticMeshActor>(FVector(0, 0, 100), FRotator::ZeroRotator); //加载引擎Asset资源 UStaticMesh* ConeMesh = LoadObject<UStaticMesh>(NULL, TEXT("/Engine/BasicShapes/Cone.Cone"), NULL, LOAD_None, NULL); UMaterial* Mat = LoadObject<UMaterial>(NULL, TEXT("/Engine/BasicShapes/BasicShapeMaterial.BasicShapeMaterial"), NULL, LOAD_None, NULL); if (ConeMesh) { //设置Mesh材质 ConeMesh->SetMaterial(0, Mat); //设置MeshComponent的Mesh Actor->GetStaticMeshComponent()->SetStaticMesh(ConeMesh); } //刷新编辑中的视图,如果不加这行,则需要鼠标触发一下视图,视图才会刷新 GEditor->RedrawLevelEditingViewports(true); } }
"WhitelistPlatforms": [
"Win32",
"Win64"
]
"E:\Program Files\Epic Games\UE_4.27\Engine\Build\BatchFiles\RunUAT.bat" BuildPlugin -Plugin="D:\Work\UE4.27\DTPluginFactory\Plugins\DigitalTwin\DigitalTwin.uplugin" -Package="D:\Work\UE4.27\PluginsPackage" -VS2019=true -CreateSubFolder
//部分省略 ,需添加 "EnabledByDefault": false,否则启动打包程序运行将失败
"EnabledByDefault": false,
"Installed": true,
//若存在bPrecompile = true; 则替换成bUsePrecompiled = true;
//否则添加bUsePrecompiled = true;
插件发布是指把你开发的插件分享出去给其他人使用,这时候有几个地方要注意
更多插件链接,敬请关注。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。