01 创建一个Actor子类,默认生成代码如下:
//FirstActor.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "FirstActor.generated.h"
UCLASS()
class QUICKSTART_API AFirstActor : public AActor
{
GENERATED_BODY()
public:
// 设置此Actor属性的默认值
AFirstActor();
protected:
// 游戏开始时或生成时调用
virtual void BeginPlay() override;
public:
// 逐帧调用
virtual void Tick(float DeltaTime) override;
};
//FirstActor.cpp
#include "FirstActor.h"
// 设置默认值
AFirstActor::AFirstActor()
{
// 将此Actor设为逐帧调用Tick()。如无需此功能,可关闭以提高性能。
PrimaryActorTick.bCanEverTick = true;
}
// 游戏开始时或生成时调用
void AFirstActor::BeginPlay()
{
Super::BeginPlay();
}
// 逐帧调用
void AFirstActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
02 首先看.h文件
头文件的作用
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "FirstActor.generated.h"
-
#include "CoreMinimal"的作用
CoreMinimal包含一些经常使用的类的定义(包括TArray、FString、FName等),该头文件位于UE4根目录\Engine\Source\RunTime\Core\Public\CoreMinimal.h下。 -
#include "GameFramework/Actor.h"的作用
因为是创建一个Actor子类,所以需要包含我们继承的类的头文件。 -
#include "XXX.generated.h"的作用
所有Actor类都需要包含其生成的.h文件,UE4将生成所有反射数据,并放入该文件中必须将该文件放在所有头文件的最下面。
宏UCLASS和GENERATE_BODY
在.h中声明你的类,如果你的类继承自UObject,你的类名上方需要加入UCLASS()宏。同时,你需要在类体的第一行添加GENERATED_BODY()宏,该宏需要手动实现一个无参构造函数。
UCLASS允许我们将类暴露在unreal的反射系统中,反射允许我们在运行时检查和迭代对象属性,以及管理对垃圾回收对象的引用。
举例
UCLASS(BlueprintType, Blueprintable, config=Engine, meta=(ShortTooltip="An Actor is an object that can be placed or spawned in the world."))
class ENGINE_API AActor : public UObject
{
GENERATED_BODY()
//......
}
类型说明符就是UCLASS()
括号中可选的说明符,比如:
类说明符 | 作用 | 说明 |
---|---|---|
Abstract | 注明这个类是抽象类,可以阻止用户通过“拖拽”的方式向场景里添加这个类的Actor | |
Blueprintable | 可以被蓝图类继承,该说明符会传递给派生类 | AActor 已声明 |
NotBlueprintable | 不可被蓝图类继承,该说明符会传递给派生类 | |
BlueprintType | 可用于蓝图的变量类型 | AActor 已声明 |
Config=ConfigName | 指定默认的配置文件 |
具体可参考:官方文档
class ENGINE_API AActor : public UObject { }
如果Actor 希望将 AActor 类公开到其他模块,则需要指定 ENGINE_API,这对游戏项目将包括的模块或插件十分实用。
声明函数BeginPlay()和Tick(float DeltaTime)
BeginPlay()和Tick(float DeltaTime)是在子类中重写父类的虚函数,调用子类之前要先调用父类的函数(具体看.cpp中)
BeginPlay()是在游戏一开始的时候调用
Tick(float DeltaTime)是逐帧调用
03 .cpp文件
构造函数
// 可以在构造函数中设置默认值
AFirstActor::AFirstActor()
{
// 将此Actor设为逐帧调用Tick()。如无需此功能,可关闭以提高性能。
PrimaryActorTick.bCanEverTick = true;
}
实现函数BeginPlay()和Tick(float DeltaTime)
// 游戏开始时或生成时调用
void AFirstActor::BeginPlay()
{
Super::BeginPlay();
}
// 逐帧调用
void AFirstActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
Super的作用:
调用父类有参数的构造方法,必须放在子类的构造方法中,并且只能放在构造方法的首句;括号中的参数是指与父类此有参构造方法中参数苏剧类型相对应的的子类中的参数。