162 actor components: creating our own components
设置自动导入时都使用/
163 widget components: creating a health bar for enemy
c++实现
space选中world 玩家直到跑到角色面前才能够看见血条;而选中screen 玩家在viewport中看不到widget样式,但在游玩过程中是能够实时不限角度看到血条的
164 user widget class: a c++ class for our health bar widget
We'll save everything and we're going to compile and launch the editor from here in Visual Studio. 我们将保存所有内容,然后我们将在 Visual Studio 中编译并启动编辑器。
So I'm going to hit Control F five. 所以我要按下 Control F 5。
Now, just to side note, sometimes if you close the editor and hit Control F five, you'll get an error 现在,顺便说一下,有时如果你关闭编辑器并按 Ctrl F 五,你会收到一个错误
that says cannot compile while live coding is active. 也就是说,当 Live Coding 处于活动状态时,无法编译。
That means you need to let the editor close down and wait a few seconds so it's completely closed before 这意味着您需要让编辑器关闭并等待几秒钟,以便它在此之前完全关闭
UPROPERTY(meta = (BindWidget))
在 UE(Unreal Engine)中,
meta = (BindWidget)
是UPROPERTY
宏的一个元数据标记,主要用于在 C++ 代码与蓝图中的 UI 元素(Widget)之间建立绑定关系 ,方便在 C++ 中直接访问和操作蓝图创建的 UI 控件。具体作用如下实现 C++ 与蓝图 UI 控件绑定
在基于
UUserWidget
的子类中,当在 C++ 代码里声明一个 UI 控件指针(如UButton*
、UTextBlock*
等 ),同时使用UPROPERTY(meta = (BindWidget))
修饰该指针变量时,只要在蓝图中创建同名的 UI 控件,UE 运行时会自动将蓝图中的 UI 控件实例与 C++ 中的指针变量进行绑定。例如,C++ 代码里声明UPROPERTY(meta = (BindWidget)) UButton* MyButton;
,在蓝图中创建名为MyButton
的按钮控件,运行时就能实现二者关联,无需手动查找。简化 UI 控件访问流程
若不使用
meta = (BindWidget)
,要在 C++ 中访问蓝图里的 UI 控件,需通过类似GetWidgetFromName
等函数手动查找并初始化控件。而使用该标记后,UE 自动完成绑定和初始化,可直接在 C++ 代码中通过绑定的指针操作控件,比如为按钮绑定点击事件等,大大简化了开发流程。便于 UI 逻辑分离与协作
借助
meta = (BindWidget)
,可在蓝图中专注设计 UI 的样式、布局等外观内容,在 C++ 中编写 UI 相关的逻辑功能(如事件响应、数据交互等 ),实现设计与逻辑的分离,便于团队协作开发。比如 UI 设计师可在蓝图中调整 UI 元素,程序员在 C++ 中实现对应交互逻辑,且不用担心二者连接问题。 另外,还有meta = (BindWidgetOptional)
变体,若蓝图中不存在同名窗口小部件,不会显示错误 ;若蓝图存在同名且标记为BindWidget
的属性,需在其UPROPERTY()
标签中添加BlueprintReadOnly
或BlueprintReadWrite
才能在蓝图中访问 。
修改Widget蓝图所继承的父类
变量要同名
165 setting the health percent : accessing the healthbar userwidget in c++
流程是emeny设置healthbarcomponent的widget为WBP_HealthBar, HealthBarComponent中有HealthBar(父类为widget)的c++成员变量; HealthBar.h(WBP_HealthBar)中有healthbar(UProgressBar)类型(注意其中四者的包含关系,并且是由最外层enemy来指定中层的widget class)
WidgetComponent中UMG_API UUserWidget* GetUserWidgetObject() const;与TSubclassOf<UUserWidget> GetWidgetClass() const { return WidgetClass; }的区别
1.
GetUserWidgetObject()
作用
返回当前已实例化的 UMG 控件对象(
UUserWidget*
类型)。如果
WidgetComponent
尚未创建控件实例,则返回nullptr
。关键特性
运行时获取:只能在控件被实际创建后调用(通常在
BeginPlay
之后)。操作具体实例:可以直接修改控件属性或调用其函数:
2.
GetWidgetClass()
作用
返回控件组件的蓝图类定义(
TSubclassOf<UUserWidget>
类型)。仅提供类信息,不涉及实例化。
关键特性
设计时/运行时均可调用:即使控件未实例化也能获取。
仅获取元数据:无法直接操作控件逻辑,但可用于:
检查预期的控件类型。
动态创建其他实例:
166 Damage : unreal engine's built-in damage system
167 custom health bar: spicing up the HUD
设置状态栏的压缩
168 enemy death animations: animations for enemy death
169 enemy death: deading some fools
在代码中设置变量之后,如果是资产变量,一般需要在蓝图选择资产
170 death poses: making the enemy stay down
选中当前最后一帧作为动画资产
方法一
方法二 unreal 多线程
修改blender时间
171 polishing enemy death: finishing touches on enemy death
添加对血条的可视化或者隐藏;当角色死亡之后去除角色的胶囊体阻挡;