08/29/2020
10/14/2020
前言
虚幻引擎4的使用涉及到两个部分一个是蓝图,另一个是C++编程。蓝图更加偏向于设计师或者美术师,C++编程更加偏向程序员。当一个程序员想要去了解游戏引擎,那么一定需要去了解引擎的框架,那么首先需要接触的是C++编程部分,因为有时候别的引擎将没有蓝图或其他可视化编程。
- 本专栏主要为了了解虚幻引擎4的C++,学习资料都来自于UE4 官网。
- C++编程教程
属性说明符
C++变量公开
属性说明符描述了C++变量可以出现在UE4编译器。比如:
UPROPERTY(EditAnywhere, BlueprintReadWrite,Category = "Damage")
int32 TotalDamage;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Damage")
float DamageTimeInSeconds;
UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Transient, Category = "Damage")
float DamagePerSecond;
//在UE4编译器的细节面板中的Damage分类下可以看见Test属性
UPROPERTY(VisibleAnywhere,Category = "Damage")
float Test;
图解
- EditAnywhere: 说明此属性可通过属性窗口在原型和实例上进行编辑
- VisibleAnywhere:说明此属性在所有属性窗口中可见,但无法被编辑
- BlueprintWriteRead:可从蓝图读取或写入此属性,可以与蓝图交互
- Category:分类专栏
- 编辑:表示此属性可以被修改,如图上表示的白色背景框
- 无法被编辑:表示灰色的框
C++函数公开
- UFUNCTION宏负责处理将C++函数公开给反射系统
- BlueprintCallable: 函数公开给蓝图虚拟机,
UFUNCTION(BlueprintCallable, Category="Damage")
void CalculateValues();
图解
蓝图公开给C++
接下来探索一种更强大的C++/蓝图边界交叉调用方法,该方法让C++代码能够调用蓝图中定义的函数。
//蓝图实现事件
UFUNCTION(BlueprintImplementableEvent, Category="Damage")
void CalledFromCpp();
//蓝图覆盖本地C++代码实现函数,重写自己的蓝图事件
UFUNCTION(BlueprintNativeEvent, Category = "Damage")
void CalledFromCpp();
图解
C++类:AFloatingActor
基本来说,虚幻引擎4内置了需要有用的类,所以大多数情况下,我们不需要完全创建一个没有继承关系的类,原因是虚幻引擎4有虚函数,我们只需要重写虚函数就可以!
继承AActor
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "FloatingActor.generated.h"
UCLASS() //表明我是虚幻引擎4中的一个类
class FPSPROJECT_API AFloatingActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AFloatingActor(); //构造函数,可以初始化变量
UPROPERTY(EditAnywhere, BlueprintReadWrite,Category = "Damage")
int32 TotalDamage;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Damage")
float DamageTimeInSeconds;
UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Transient, Category = "Damage")
float DamagePerSecond;
//在UE4编译器的细节面板中的Damage分类下可以看见Test属性
UPROPERTY(VisibleAnywhere,Category = "Damage")
float Test;
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override; //物体实例被加载时候,是虚函数
public:
// Called every frame
virtual void Tick(float DeltaTime) override; //是虚函数:每帧更新
};
属性说明符变量:
- 如果没有默认值,UE4自动分配默认值。
- 前置初始化—选择构造函数
- 后置初始化—重载AActor虚函数PosInitProperties
后置初始化属性
void AFloatingActor::PostInitProperties()
{
Super::PostInitProperties();
DamagePerSecond = TotalDamage / DamagshishieTimeInSeconds;
}
后置编辑更改值
- 后置运行时更改属性-- 重载AActor虚函数PostEditChangeProperty
//UE4编译器中,如果想要实时反应更改的值,需要使用虚函数PostEditChangeProperty
//因为引擎会在编辑器中发生变化时通知目标对象
#if WITH_EDITOR
void AFloatingActor::PostEditChangeProperty(FPropertyChangedEvent & propertyChangedEvent)
{
DamagePerSecond = TotalDamage / DamagshishieTimeInSeconds;
Super::PostEditChangeProperty(propertyChangedEvent);
}
#endif
总结
- 最佳方法是使用C++构建基本Gameplay系统和性能关键代码,用蓝图自定义行为或从C++构建块创建组合式行为
参考资料
版权声明:本文为weixin_44200074原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。