unreal C++
UE4提供了两种创建新Gameplay元素的方法:C++和蓝图视觉脚本。
程序员利用C++即可添加基础Gameplay系统,然后设计师可基于这些系统进行构建或利用这些系统为某个特定关卡或游戏本身创建自定义Gameplay。
在这些情况下,C++程序员在文本编辑器(如Notepad++)或IDE(通常是Microsoft Visual Studio或Apple Xcode)中工作,设计师则在UE4的蓝图编辑器中工作。
C++实例:
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"
UCLASS()
class AMyActor : public AActor
{
GENERATED_BODY()
public:
// 设置该Actor属性的默认值
AMyActor();
// 每一帧都调用
virtual void Tick( float DeltaSeconds ) override;
protected:
// 游戏开始或产生时调用
virtual void BeginPlay() override;
};
C++类提供 BeginPlay 和 Tick 两个重载方法。
BeginPlay 事件告诉Actor以可运行状态进入了游戏。这是启动类Gameplay逻辑的好位置。
Tick 每帧调用一次,使用自上次调用传递以来经过的时间。可以在这里执行任何重复逻辑。
如果不需要该功能,最好将其移除,这样对性能有益。
如果将其移除,确保移除构造函数中指示应开始发生tick事件的相应行。下面的构造函数就包含所提及的行。
AMyActor::AMyActor()
{
// 将该Actor设置为每帧调用一次Tick()。如果您没有这个需要,可以将其关闭来改善性能。
PrimaryActorTick.bCanEverTick = true;
}
属性出现在编辑器中
创建类后,现在让我们创建一些设计师可以在虚幻编辑器中设置的属性。
将属性公开给编辑器非常简单,只需要使用说明符UPROPERTY
即可实现。您只需在属性声明的上一行加入UPROPERTY(EditAnywhere)
即可.
UCLASS()
class AMyActor : public AActor
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere)
int32 TotalDamage;
...
};
另外还可以添加分类:
UPROPERTY(EditAnywhere, Category="Damage")
int32 TotalDamage;
这样属性就被添加到Damage分类下面了。
当在C++类中创建完成后,就可以在编辑窗口中看到了,如下所示:
UCLASS()
class AMyActor : public AActor
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Damage")
int32 TotalDamage;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Damage")
float DamageTimeInSeconds;
UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Transient, Category="Damage")
float DamagePerSecond;
...
};
编辑窗口中显示如图:
image.png设置默认值
在构造函数中为属性设置默认值的方式与典型的C++类一样。
设置默认值的两种方式:
AMyActor::AMyActor()
{
TotalDamage = 200;
DamageTimeInSeconds = 1.0f;
}
AMyActor::AMyActor() :
TotalDamage(200),
DamageTimeInSeconds(1.0f)
{
}
编辑窗口中显示如图:
image.png
函数调用
如何在创建Gameplay系统期间,设计师将需要能够调用C++程序员创建的函数。而程序员也要能够从C++代码调用蓝图中实现的函数。
首先来让CalculateValues()能够从蓝图调用。
如下所示:
UFUNCTION(BlueprintCallable, Category="Damage")
void CalculateValues();
-
UFUNCTION() 宏
负责处理将C++函数公开给反射系统。 -
BlueprintCallable
将其公开给蓝图虚拟机。 -
Category
每一个公开给蓝图的函数都需要一个与之关联的类别,这样右键点击快捷菜单的功能才能正确生效。
网友评论