Zack.Zhang Game Developer

UE4学习笔记4——UMG和数据绑定

2021-10-07
zack.zhang

本笔记的记录了UMG的用法。入门示例成品

创建UI蓝图

文件夹里右键创建UI蓝图,命名为MainUI。

UE4-UMG1.png

拼UI

双击打开蓝图,编辑UI界面。

UE4-UMG2.png

UI蓝图和Unity的UGUI差不多,也是基于锚点去适配屏幕的,控件类型和UGUI也差不多。遮挡关系也结合了层级顺序和ZOrder排序,也就是画布面板上相同ZOrder的控件下面的挡住上面的(同UGUI),不同ZOrder的控件数值大的挡住小的(同NGUI)。不同的是只有特定组件才能有子节点,比如面板,层级调整目前看比较麻烦。

UE4-UMG3.png

数据绑定

控件上某些数据允许和游戏逻辑数据做一个绑定关系,游戏逻辑数据改变,UI上的该数据也跟着改变。

允许做数据绑定的UI数据都会如下图一样,带“绑定”字样的下拉框。

UE4-UMG4.png

点开下拉框,选择“创建绑定”,通过蓝图来绑定游戏逻辑数据。

示例里要把MainPlayer的HP值和HPBar这个进度条控件做一个绑定,HP下降,进度条进度跟着减少。

为了不用每次取MainPlayer身上的值获取一次玩家角色,再做一次类型转换,那么我们先在整个UI的蓝图里获取MainPlayer的引用,将引用提升为变量,方便UI的各个控件访问、使用。

UE4-UMG5.png

选择带“绑定”字样的下拉框创建出来的绑定蓝图,实现一个绑定方法。如下图所示,取出MainPlayer的Hp和Max Hp,做一个除法,将除法结果作为进度条的百分比输出给进度条使用。这样就完成了一个数据绑定。

UE4-UMG6.png

MainPlayer的属性数据如下所示。

UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Player Stats")
float Hp;

UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Player Stats")
float MaxHp;

UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Player Stats")
float Mp;

UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Player Stats")
float MaxMp;

UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Player Stats")
int32 Coins;

游戏逻辑数据改变

这里做了一个USphereComponent,当MainPlayer触碰到USphereComponent时,USphereComponent调用如下代码,对MainPlayer造成伤害。

Damage = 20.0f;
UGameplayStatics::ApplyDamage(MainPlayer, Damage, nullptr, this, DamageType);

// 触碰到就销毁触发器自己
Destroy();

MainPlayer作为一个ACharacter,是继承于APawn的,那么我们实现以下APawn::TakeDamage来响应上面调用的UGameplayStatics::ApplyDamage。

virtual float TakeDamage(float Damage, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) override;

float AMainPlayer::TakeDamage(float Damage, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser)
{
	Hp = FMath::Clamp(Hp - Damage, 0.0f, MaxHp);
	return Hp;
}

以上逻辑实现了玩家触碰到一个触发器,玩家掉血,并将掉血后的数值同步到UI上的过程。


Similar Posts

评论