UE-c++ Class

一. Class介绍

虚幻引擎每个游戏性类由一个类头文件(.h)和一个类源文件(.cpp)构成。

类头文件包含类和类成员(如变量和函数)的声明,类源文件包含对应的实现。

二. Class命名

  • A 继承自AActor,可以直接生成到场景中的物体。
  • U 继承自UObject,可以附加到Actor,无法直接生成到场景。

三. Class生成

1. 添加类

引擎的C++类向导可以直接生成新类所需要的头文件和源文件,并随之更新游戏模板。自动生成的代码包含类声明,类构造函数,常用函数及引擎专有代码,例如 UCLASS()宏 。

2. 类头文件

引擎中的游戏性类通常具有单独且唯一的类头文件,这些文件的命名与其中定义的类相匹配,减去A/U前缀,并加上.h文件扩展名,如AActor类的头文件命名为 Actor.h。

类头文件使用标准C++语法,并结合专门的宏,简化类,变量和函数的声明过程。

所以在头文件的顶端,需要包含生成的特定头文件,因为方便反射工作的进行,必须包含在所有引入头文件的最后。

	#include "ClassName.generated.h"

3. 类的声明

类声明基于标准C++的类申明。

类声明定义类的名称,类的父类,需要的变量和函数。此外,还通过特定的 类说明符和元数据宏 实现特定的引擎和编辑器行为。 包含UCLASS()宏和GENERATED_BODY()宏,前者定义在类之前,后者定义在类内的最前面。

	//Class
	UCLASS([specifier,specifier,...],[meta=(key=value,key=value,...)])
	class ClassName : public ParentName {
		GENERATED_BODY()
		public:
	};

4. 类的实现

源文件(.cpp)必须包含 C++ 类声明的头文件(.h),C++ 类声明通常为引擎自动生成,但也可手动生成(如有必要)。

5. 类构造函数

类构造函数用于设置属性和其他变量的默认值,并执行其他必要的初值设定。

类构造函数通常放置在类实现文件中,也可以将构造函数内联放置在类头文件中。然而,如果构造函数在类头文件中,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:

6. 类静态助手(类和资源引用)

为更负责的数据类型设置数值(尤其是类引用、命名和资源引用)时,需要在构造函数中定义并实例化一个 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);
		}
    }

四. Class的反射

见 反射机制

你可能感兴趣的:(#,入门知识,c++,ue4,开发语言)