本笔记的记录了UMG的用法。入门示例成品。
创建UI蓝图
文件夹里右键创建UI蓝图,命名为MainUI。
拼UI
双击打开蓝图,编辑UI界面。
UI蓝图和Unity的UGUI差不多,也是基于锚点去适配屏幕的,控件类型和UGUI也差不多。遮挡关系也结合了层级顺序和ZOrder排序,也就是画布面板上相同ZOrder的控件下面的挡住上面的(同UGUI),不同ZOrder的控件数值大的挡住小的(同NGUI)。不同的是只有特定组件才能有子节点,比如面板,层级调整目前看比较麻烦。
数据绑定
控件上某些数据允许和游戏逻辑数据做一个绑定关系,游戏逻辑数据改变,UI上的该数据也跟着改变。
允许做数据绑定的UI数据都会如下图一样,带“绑定”字样的下拉框。
点开下拉框,选择“创建绑定”,通过蓝图来绑定游戏逻辑数据。
示例里要把MainPlayer的HP值和HPBar这个进度条控件做一个绑定,HP下降,进度条进度跟着减少。
为了不用每次取MainPlayer身上的值获取一次玩家角色,再做一次类型转换,那么我们先在整个UI的蓝图里获取MainPlayer的引用,将引用提升为变量,方便UI的各个控件访问、使用。
选择带“绑定”字样的下拉框创建出来的绑定蓝图,实现一个绑定方法。如下图所示,取出MainPlayer的Hp和Max Hp,做一个除法,将除法结果作为进度条的百分比输出给进度条使用。这样就完成了一个数据绑定。
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上的过程。