虚幻4C++编程入门(搬运1)

来源:互联网 发布:python count 编辑:程序博客网 时间:2024/05/21 11:36

首先我们将使用虚幻编辑器中的类向导生成基础 C++ 类

,以便蓝图稍后进行延展。下图展示了向导的第一步 - 新建一个 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() 代码后的属性视图。
这里写图片描述