,以便蓝图稍后进行延展。下图展示了向导的第一步 - 新建一个 Actor。
这里根据对character、pawn和actor的描述,知道了pawn是actor类型,而charactor是pawn的一种类型。
进程中的第二步是告知向导需要生成类的命名。下图显示的第二步中使用了默认命名。
选择创建类后,向导将生成文件并打开开发环境,以便开始编辑。这便是生成的类定义。如需了解类向导的更多信息,请查阅此 链接 。
这里我们建立了一个继承与actor类的类myactor。然后可以从微软的VS里面进行编写。
就像上面的图里面的位置,可以找到我们要编写的myactor的.h和.cpp文件。
myactor.h文件:
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"
UCLASS()
class AMyActor : public AActor
{
GENERATED_BODY()
public:
// 设置该 actor 属性的默认值
AMyActor();
// 游戏开始时或生成时调用
virtual void BeginPlay() override;
// 每帧调用
virtual void Tick( float DeltaSeconds ) override;
};
这里的BeginPlay()和Tick( float DeltaSeconds )都是声明的为虚函数。
BeginPlay() 是一个事件,将告知您 Actor 已以可操作状态进入游戏中。现在便适合开始类的游戏性逻辑。Tick() 每帧调用一次,对应的时间量为自上次调用传入的实际运算时间。在此可创建反复逻辑。如不需要此功能,最好将其移除,以节约少量性能开销。如要移除此功能,必须将构建函数中说明 tick 应该发生的代码行删除。以下构建函数包含讨论中的代码行。
而在构造函数里需要声明actor 设为每帧调用就得用下面的写法:
AMyActor::AMyActor()
{
// 将此 actor 设为每帧调用 Tick()。不需要时可将此关闭,以提高性能。
PrimaryActorTick.bCanEverTick = true;
}
构造函数是你在调用这个类时就会默认去调用的,比如你用这个类建立一个对象,然后就会自动调用构造函数去进行初始化。
现在即可创建一些属性(设计师可在虚幻编辑器中设置这些属性)。使用特殊宏 UPROPERTY() 即可轻松将属性公开到虚幻编辑器。只需在属性声明之前使用 UPROPERTY(EditAnywhere) 宏即可,如以下类所示。
UCLASS()
class AMyActor : public AActor
{
GENERATED_BODY()
UPROPERTY(EditAnywhere)//可以在任何地方编辑。
int32 TotalDamage;
...
};
执行这些操作后,即可在编辑器中对数值进行编辑。有多种方式控制其编辑方法和位置。为 UPROPERTY() 宏传入更多信息可完成此操作。例如:如需 TotalDamage 属性和相关属性出现在一个部分中,可使用分类功能。以下属性声明对此进行演示。
UPROPERTY(EditAnywhere, Category=”Damage”)
int32 TotalDamage;
用户需要编辑此属性时,它将和其他属性(这些属性已以此类型命名标记)一同出现在 Damage 标题之下。这可将常用设置放置在一起,便于设计师进行编辑。
现在让我们将相同属性对蓝图公开。
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=”Damage”)
int32 TotalDamage;
如您所见,存在一个蓝图特有的参数。正是此参数使属性为可读取和可编写状态。还存在一个单独选项 - BlueprintReadOnly。可通过此选项使属性在蓝图中被识别为常量。此外还有多个选项可控制属性对引擎公开的方式。
继续讨论以下部分之前,我们来添加一些属性到这个示例类。已有属性对此 actor 输出的伤害总量进行控制。我们更进一步,实现随时间输出伤害。以下代码添加了一个设计师可进行设置的属性,和另一个设计师可查看但无法进行更改的属性。
UCLASS()
class AMyActor : public AActor
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Damage")
int32 TotalDamage;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Damage")
float DamageTimeInSeconds;
UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Transient, Category="Damage")
float DamagePerSecond;
...
};
DamageTimeInSeconds 是设计师可进行修改的属性。DamagePerSecond 属性是使用设计师设置的计算值(详见下一部分)。VisibleAnywhere 标记意味着属性在虚幻编辑器中为可见状态,但不可进行编辑。Transient 标记意味着无法从硬盘对其进行保存或加载;它应该为一个派生的非持久值。下图将属性显示为类默认的部分。
在构建函数中设置属性默认值和典型 C++ 类方法一致。以下是在构建函数中设置默认值的两个例子,它们在功能上相同。
AMyActor::AMyActor()
{
TotalDamage = 200;
DamageTimeInSeconds = 1.f;
}
AMyActor::AMyActor() :
TotalDamage(200),
DamageTimeInSeconds(1.f)
{
}
下图是在构建函数中添加默认值后的属性视图。
为支持设计师对每个实例设置属性,数值也从给定对象的实例数据中加载。此数据应用在构建函数之后。与 PostInitProperties() 调用链挂钩即可基于设计师设置的数值创建默认值。此处的进程范例中,TotalDamage 和 DamageTimeInSeconds 为设计师指定的数值。即时这些数值为设计师指定,您仍然可以为它们提供恰当的默认值,正如我们在上例中执行的操作。
如未向属性提供默认值,引擎将自动把属性设为零(指针类设为 nullptr)。
void AMyActor::PostInitProperties()
{
Super::PostInitProperties();
DamagePerSecond = TotalDamage / DamageTimeInSeconds;
}
下图是添加以上 PostInitProperties() 代码后的属性视图。