Unreal-虚幻C++基础

Unreal项目规范:

Allar/ue5-style-guide

中文翻译版

常用的命名规范有:

  1. 派生自UObject类的都以U为前缀(派生自U开头类的类也都已U为前缀)
  2. 派生自AActor的以A为前缀
  3. bool变量以b前缀,如bPendingDestruction
  4. 抽象接口以I前缀

    虚幻中派生自UInterface的类都有两个定义,一个以U开头实现作为一个基本类的功能,一个以I开头实现接口功能

虚幻C++基础

虚幻的C++开发不是使用纯粹的C++进行编程,虚幻引擎为了实现各种复杂机制,在C++基础上搭建了一套反射机制。下面是我们新建一个C++类,虚幻自动帮我们生成的头文件的结构,其中有很多宏定义和必须引用的头文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "SBaseProjectile.generated.h"

UCLASS()
class CPPRPG_API ASBaseProjectile : public AActor
{
GENERATED_BODY()

public:
// Sets default values for this actor's properties
ASBaseProjectile();

UPROPERTY(EditAnywhere, Category="Attribute of Base Projectile")
float ProjectileMoveSpeed;

protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;

public:
// Called every frame
virtual void Tick(float DeltaTime) override;
};

反射

反射在Java和C#等语言中比较常见,概况的说,反射数据描述了类在运行时的内容。这些数据所存储的信息包括类的名称、类中的数据成员、每个数据成员的类型、每个成员位于对象内存映像的偏移(offset),此外,它也包含类的所有成员函数信息。

简单来说,反射可以实现在程序运行时动态地对类,对象,方法等进行操作。例如在虚幻中,反射用来实现序列化(就是将对象转换为字节流,存储和网络传输使用),编辑器中动态调整各种属性,垃圾回收,网络复制,蓝图/C++通信和相互调用的功能。

虚幻引擎的反射机制的核心是UObject类,所有的类都继承自UObject:

#include “xxx.generated.h” 以及 UPROPERTY()UFUNCTION()UCLASS() 等宏定义都用来让UE实现反射。

UBT(Unreal Build Tool)

虚幻项目的编译全权由UBT负责,其本质就和其名字一样就是一个编译工具,和CMake之类的是一个东西,只不过其是专门为UE量身定做的编译工具。有了UBT就可以方便配置各个平台的参数和编译选项,不用为每个平台单独配置编译了。

我们可以直接使用Engine\Binaries\DotNET\UnrealBuildTool目录下的UnrealBuildTool.exe再命令行中编译我们的项目。在创建新项目时,自动生成的Target.cs,Build.cs都是为这个工具服务的。

UBT工作流程分为两步:

  1. 调用UHT(Unreal Header Tool)
  2. 调用平台特定的编译工具(VS,LLVM)编译各个模块

UHT(Unreal Header Tool)

UHT(Unreal Header Tool)是用来解析虚幻C++的,上面我们提到了要实现UE反射需要些各种宏,UHT就是将这些代码解析成标准的C++代码,之后再由UBT组织这些标准C++代码进行正常的C++编译。

可以这样直观理解,我们写的虚幻C++代码其实和标准C++不同,有很多宏以及很多省略或者固定的写法(接口函数实现xxx_Implementation),可以将我们写的代码称为U++。编译过程就是调用UBT,UBT先调用UHT将U++翻译为C++,再调用C++编译工具对C++编译。

参考

大象无形UE4笔记六:UBT
UE4反射机制
《InsideUE4》基础概念


Unreal-虚幻C++基础
https://kenny-hoho.github.io/2023/10/12/Unreal-虚幻C++基础/
作者
Kenny-hoho
发布于
2023年10月12日
许可协议