UE4C++(1):C++与蓝图的交互

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;

图解

Damage

  • 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();

图解

Add Event

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++构建块创建组合式行为

参考资料

UE4C++学习文档


版权声明:本文为weixin_44200074原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。