03/28/2021

文章目录

  • 前言
  • Build.cs
    • [ProjectName.Build.cs]
    • [XXXEditor].Target.cs
  • 补充
    • TargetRules.cs类
    • 例子1:EOS
  • 总结
  • 参考资料

前言

首先C#的脚本,都在Engine/Source/Programs/中

Build.cs

[ProjectName.Build.cs]

Build.cs 主要作用是帮助link,C++中如何建立好的include体系是非常重要的!第一个介绍的是以项目命名的build.cs文件。首先我建了一个新项目,模板用的是FirstPerson,项目名字是TestBuild

//TestBuild.build.cs
using UnrealBuildTool;public class TestBuild : ModuleRules  //ModuleRules 父类去Engine/Source/Programes/去github下载开发版本
{public TestBuild(ReadOnlyTargetRules Target) : base(Target){PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;PublicDependencyModuleNames.AddRange(new string[] { "Core",             //CoreMinimal"CoreUObject", "Engine",           //GameFramework"InputCore", "HeadMountedDisplay" });}
}

首先我们打开TestBuildCharacter.h查看,发现include “GameFramework/Character.h”,这代表我们使用引擎中GameFramework目录下的代码,它属于Engine模块。

//Source/Runtime/Engine/Classes/GameFramework/Character.h
#include "GameFramework/Character.h"//Source/Runtime/Core/Public/CoreMinimal.h ----- Core模块
#include "CoreMinimal.h"//Source/Runtime/CoreUObject/Public/UObject/ConsturctorHelper.h
#include "UObject/ConsturctorHelper.h"        //TestBuildHUD.cpp 引用到//Source/Runtime/HeadMountedDisplay/Public/HeadMountedDisplayFunctionLibrary.h
//VR 头显
#include "HeadMountedDisplayFunctionLibrary.h"
#include "XRMotionControllerBase.h" // for FXRMotionControllerBase::RightHandSourceId
  • GameFramework目录包括一些Gameplay相关的类,比如Character,HUD,GameMode,Actor,Component等等
  • Core 目录下的主要是UE4常用到的类

当我检查完所有.h/.cpp文件发现并没有引用到inputCore模块,所以我打算删除InputCore,然后编译,最后编译是通过的,我现在也不想要引用任何HeadMountDisplay,我开始删除HeadMountDisplay相关函数


当你错误引用相关文件,将会报LINK错误,可以通过文件名找到所需要更改的地方,我这边是Character.h


记得声明宏定义在.cpp文件中,比如IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, TestBuild, “TestBuild” );或者IMPLEMENT_GAME_MODULE(FDefaultGameModuleImpl, NewModules);

[XXXEditor].Target.cs

Target.cs同样存在于项目中,加入需要编译的新模块名字

//TestBuildEditor.Target.cs
using UnrealBuildTool;
using System.Collections.Generic;public class TestBuildEditorTarget : TargetRules
{public TestBuildEditorTarget(TargetInfo Target) : base(Target){Type = TargetType.Editor;DefaultBuildSettings = BuildSettingsVersion.V2; //ExtraModuleNames.Add("TestBuild");       //有一个TestBuild 模块ExtraModuleNames.AddRange(new string[] {"TestBuild",     //TestBuild.Build.cs"NewModules"      //NewModules.Build.cs == class NewModules});  }
}
  1. ExtraModuleNames加入了一个TestBuild模块,即第一部分,打开项目中\Intermediate\Build\Win64\UE4Editor\Development\路径发现有一个TestBuild文件夹,里面有编译好的UE4Editor-TestBuild.lib/.dll文件
  2. 首先会先去找到名字相同的Build.cs,找到之后开始进行编译和链接,经测试发现Target.cs中引用的模块名字必须与Build.cs文件名保持一致,同时Build.cs中类名字也需要保持一致
  3. 编译的第一个文件是IMPLEMENT_GAME_MODULE

IMPLEMENT_GAME_MODULE([My Game Module Class], [Game Module name string]),第二个参数的名字与Build.cs名字保持一致

  1. 如果不需要编译某个文件,我们可以设置Target.cs,但是以前编译过模块不会被删除,除非Rebuild

补充

using UnrealBuildTool; //找到UnrealBuildTool项目代码,需要去git下载开发引擎

TargetRules.cs类

public enum BuildSettingsVersion
{/// <summary>/// Legacy default build settings for 4.23 and earlier./// </summary>V1,/// <summary>/// New defaults for 4.24: ModuleRules.PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs, ModuleRules.bLegacyPublicIncludePaths = false./// </summary>V2,// *** When adding new entries here, be sure to update GameProjectUtils::GetDefaultBuildSettingsVersion() to ensure that new projects are created correctly. ***/// <summary>/// Always use the defaults for the current engine version. Note that this may cause compatibility issues when upgrading./// </summary>Latest
}public readonly UnrealTargetPlatform Platform;
UnrealTargetPlatform.PS4/Win32/Linux/Stadia/Mac/...

例子1:EOS

Epic Online Service SDK提供了许多接口,比如玩家数据存储,成就排行榜,沟通,组队,匹配,等等。在UE4的表现形式是以引擎插件存在,打开相关目录,并查阅Build.cs

//Engine\Plugins\Online\OnlineSubsystemEOS\Source\OnlineSubsystemEOS.Build.csusing UnrealBuildTool;
using System.IO;public class OnlineSubsystemEOS : ModuleRules
{public OnlineSubsystemEOS(ReadOnlyTargetRules Target) : base(Target){PrivateDefinitions.Add("ONLINESUBSYSTEMEOS_PACKAGE=1");PublicDependencyModuleNames.AddRange(new string[] {"OnlineSubsystemUtils"});PrivateDependencyModuleNames.AddRange(new string[] {"Core","CoreUObject","Engine","Sockets","OnlineSubsystem","OnlineFrameworkCore""Json"});// Change this to true once you have the SDK installedbool bSDKInstalled = true;// Update this to your SDK path once it is installedstring EOSSDKVersion = "EOS-SDK-14316386-1.8";string EOSPath = Path.Combine(ModuleDirectory, "..", "EOS", EOSSDKVersion, "SDK");     //路径组合string EOSIncludePath = Path.Combine(EOSPath, "Include");if (bSDKInstalled){PrivateDefinitions.Add("WITH_EOS_SDK=1");   //宏设置PublicIncludePaths.Add(EOSIncludePath);        //头文件  --- 编译器需要string EOSLibPath = Path.Combine(EOSPath, "Lib");    //库文件  --- 链接器linker需要if (Target.Platform == UnrealTargetPlatform.Win64){PublicAdditionalLibraries.Add(Path.Combine(EOSLibPath, "EOSSDK-Win64-Shipping.lib"));PublicDelayLoadDLLs.Add("EOSSDK-Win64-Shipping.dll");string EOSDLLPath = Path.Combine(EOSPath, "Bin", "EOSSDK-Win64-Shipping.dll");RuntimeDependencies.Add(EOSDLLPath);}else{bSDKInstalled = false;}}else{PrivateDefinitions.Add("WITH_EOS_SDK=0");}}
}

文件夹中还有一个EOS SDK目录,我们需要引用相关库文件和加载.lib和.dll

  • PublicIncludePaths:找到SDK的include文件夹
  • PublicAdditionalLibraries:lib文件夹路径+文件
  • RuntimeDependencies:.dll文件
  • PublicDelayLoadDLLs:延迟加载

总结

  1. 如何创建一个模块,即XXX.build.cs,不要忘记声明宏定义
  2. XXX.Target.cs 依赖模块设置,确保与声明的类名保持一样
  3. 外部文件的引用,即头文件,库文件,dll文件的设置

参考资料

  • UE4模块介绍
  • UE4 官网介绍UBT
    • 类的名称必须与在其中声明这个类的文件的名称相匹配,后跟"Target"(例如,MyProject.target.cs定义类"MyProjectTarget")。

UE4 C#(1):虚幻编译工具(UBT)相关推荐

  1. 蓝图解锁怎么用_[UE4蓝图][Materials]虚幻4中可互动的雪地材质完整实现(一)

    不说废话,先上个演示图 最终成果(脚印,雪地可慢慢恢复,地形可控制) 主要原理(白话文): 假如你头上是块白色并且可以透视的平地,来了个非洲兄弟踩上面,你拿起单反对着上面拍了一张,照片如下 把脚印稍作 ...

  2. ue4 改变枢轴位置_[UE4蓝图][Materials]虚幻4中可互动的雪地材质完整实现(一)

    不说废话,先上个演示图 最终成果(脚印,雪地可慢慢恢复,地形可控制) 主要原理(白话文): 假如你头上是块白色并且可以透视的平地,来了个非洲兄弟踩上面,你拿起单反对着上面拍了一张,照片如下 把脚印稍作 ...

  3. UE4资源热更打包工具HotPatcher

    UE4资源热更打包工具HotPatcher https://imzlp.me/posts/17590/ Z's Blog 首页 归档 分类 标签 笔记 微言 资源 简历 关于 待办事项 站点日志 搜索 ...

  4. 反编译工具jad简单用法

    反编译工具jad简单用法 下载地址: [url]http://58.251.57.206/down1?cid=B99584EFA6154A13E5C0B273C3876BD4CC8CE672& ...

  5. CMake编译工具与项目构建

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 文章导读 本文从C/C++代码的编译过程入手,弄清楚Make与Ma ...

  6. ILSpy可以反编译c语言,ILSpy反编译工具的使用

    本文导读:ILSpy反编译工具的使用.不过,ILspy需要在电脑上安装.NET Framework 4.0.ILspy可以将一个dll文件转换为C#或VB语言.ILspy对于单个文件可以保存为.cs文 ...

  7. 一些Java反编译工具/源代码查看工具的介绍

    2019独角兽企业重金招聘Python工程师标准>>> 有的朋友抱怨他们在使用他们公司的闭源框架时看不到底层的源代码.那么可以尝试使用一些Java反编译工具. 下面我举个例子介绍具体 ...

  8. 一文详解CMake编译工具与项目构建

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 文章导读 本文从C/C++代码的编译过程入手,弄清楚Make与Makefile,CMake与CMake ...

  9. bat小工具_小程序反编译工具在windows系统下的调用脚本

    点击上方蓝字可以订阅哦 之前的文章中介绍了小程序的反编译工具,工具在 Linux 系统下使用时执行bingo.sh [xxx.wxapkg]就可以. 有小伙伴不知道在windows系统下如何使用,这里 ...

最新文章

  1. Python实现信息自动配对爬虫排版程序(附下载)
  2. 一文读懂序列建模(deeplearning.ai)之序列模型与注意力机制
  3. [SPOJ705]不同的子串
  4. 聊聊Elasticsearch的ExponentiallyWeightedMovingAverage
  5. Vulkan统一所有平台的API
  6. 名词解释_名词解释的答题技巧
  7. android 的webview解析
  8. 多线程程序中操作的原子性
  9. 数据驱动精准化营销在大众点评的实践
  10. (stl排序+检索)大理石在哪
  11. 包导出Android升级ADT22后会报ClassNotFoundException的原因分析
  12. Scan chain/SE,SI,SO 带scan的寄存器
  13. Hexo+Github博客搭建教程
  14. wx.uploadFile上传图片 在正式环境无响应问题
  15. zebradesginer zpl代码_斑马ZebraDesigner免费标签编辑软件
  16. 学习Fiddler安全测试
  17. 网络安全实战之植入后门程序
  18. 对 云寻觅贴吧(http://tieba.yunxunmi.com/)的简要分析
  19. 在Eclipse MarketPlace网页中安装插件显示Eclipse:Drag to Install!
  20. 用simple mapi 发送一个带附件的邮件

热门文章

  1. bat基础(转自堇色苹果)
  2. 几个javascript框架对比(vue,react,Angular等),如何选择?
  3. 标准生物钟作息时间表
  4. 【HTCVR】VRTK插件案例分析之0021~030
  5. Python打开读文件:UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xed in position 7014: invalid conti
  6. 网易云音乐 ubuntu
  7. howler.js_异步加载音频文件并使用howler.js播放
  8. Linux下C语言实现TCP文件传输
  9. 基本共射放大电路的动态分析(低频、Ri、Ro大小对电路影响的分析)
  10. c语言需要数学英语,学C语言需要数学和英语吗?