虚幻引擎每个游戏性类由一个类头文件(.h)和一个类源文件(.cpp)构成。
类头文件包含类和类成员(如变量和函数)的声明,类源文件包含对应的实现。
引擎的C++类向导可以直接生成新类所需要的头文件和源文件,并随之更新游戏模板。自动生成的代码包含类声明,类构造函数,常用函数及引擎专有代码,例如 UCLASS()宏 。
引擎中的游戏性类通常具有单独且唯一的类头文件,这些文件的命名与其中定义的类相匹配,减去A/U前缀,并加上.h文件扩展名,如AActor类的头文件命名为 Actor.h。
类头文件使用标准C++语法,并结合专门的宏,简化类,变量和函数的声明过程。
所以在头文件的顶端,需要包含生成的特定头文件,因为方便反射工作的进行,必须包含在所有引入头文件的最后。
#include "ClassName.generated.h"
类声明基于标准C++的类申明。
类声明定义类的名称,类的父类,需要的变量和函数。此外,还通过特定的 类说明符和元数据宏 实现特定的引擎和编辑器行为。
包含UCLASS()宏和GENERATED_BODY()宏,前者定义在类之前,后者定义在类内的最前面。
//Class
UCLASS([specifier,specifier,...],[meta=(key=value,key=value,...)])
class ClassName : public ParentName {
GENERATED_BODY()
public:
};
源文件(.cpp)必须包含 C++ 类声明的头文件(.h),C++ 类声明通常为引擎自动生成,但也可手动生成(如有必要)。
类构造函数用于设置属性和其他变量的默认值,并执行其他必要的初值设定。
类构造函数通常放置在类实现文件中
,也可以将构造函数内联放置在类头文件中
。然而,如果构造函数在类头文件中,UClass 必须结合 CustomConstructor 说明符进行声明,因为这阻止了自动代码生成器在标头中创建构造函数声明。
/* ALearnDeepData Class can be replaced
* with any class type
*/
//Default constructor
ALearnDeepData::ALearnDeepData();
//Secondary constructor, supporting a special parameter
ALearnDeepData::ALearnDeepData(const FObjectInitializer&ObjectInitializer);
protected:
为更负责的数据类型设置数值(尤其是类引用、命名和资源引用)时,需要在构造函数中定义并实例化一个 ConstructorStatics 结构体,以保存所需的诸多属性数值。
ALearnDeepData::ALearnDeepData(const FObjectInitializer& ObjectInitializer):Super(ObjectInitializer) {
//Initialize the ClassDefaultObject(CDO) property here
/* Static guarantees that a resource or class
* is loaded only once
*/
struct FConstructStatics {
//Resource reference
ConstructorHelpers::FObjectFinder<UStaticMesh>DiyObject;
//Class reference
ConstructorHelpers::FClassFinder<UNetConnection>DiyClass;
FConstructStatics(){
DiyObject=ConstructorHelpers::FObjectFinder<UStaticMesh>(TEXT("Your file path"));
DiyClass=ConstructorHelpers::FClassFinder<UNetConnection>(TEXT("Your file path"));
}
};
static FConstructStatics ConstructStatics;
//Your properties can be initialized using the structure above
//ConstructStatics.DiyObject.Object;
//ConstructStatics.DiyClass.Class;
}
在构造函数中还可创建组件子对象并将其附着到 actor 的层级。生成一个 actor 时,将从 CDO 复制其组件。为确保组件固定被创建、被销毁和被正确地垃圾回收,构建函数中创建的每个组件的指针应被存储在拥有类的一个 UPROPERTY 中。
.h文件
protected:
UPROPERTY()
UStaticMeshComponent*StaticMesh;
.cpp文件
ALearnDeepData::ALearnDeepData() {
//Initialize the ClassDefaultObject(CDO) property here
/* For resources or classes that do not
* require path references(without cross-modules)
* You can use StaticClass()
*/
StaticMesh=Cast<UStaticMeshComponent>(UStaticMeshComponent::StaticClass());
//Can directly create
StaticMesh=CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Your diy name"));
//Add the loaded resource to the component
if (RootComponent==nullptr) {
RootComponent=StaticMesh;
}else {
const FAttachmentTransformRules Rules(EAttachmentRule::KeepRelative,false);
StaticMesh->AttachToComponent(RootComponent,Rules);
}
}
见 反射机制