我今天发现一个问题
UE的UMG控件的构造事件似乎和我以前理解和c++构造函数概念不一样
我以前理解的是 创建对象时就开始调用构造事件了 和 C++上面的构造函数 一样的用法
我们先创建一个地图 一个玩家控制器 一个游戏模式 三个UMG控件蓝图类
然后看看三个UMG蓝图类
text 顶层父类 需要里面的一个事件
我们主要是这个 setPr的事件 这个事件是拿来给子类实现的
tetxcld
看在这个重写了SetPr事件 注意下面的父类继承
main
这里我们镶嵌了 tetxcld
一样重写了SetPr事件 注意下方继承
行了看完了 我们来梳理一下继承树
NewPlayeController
给地图上模式
场景中放了个摄像机并设置了玩家0启动
行了 现在我们看
这个节点
创建控件 运行完这里我们就已经创建了一个main UMG蓝图的实例对象了
由于main里面又镶嵌了一个 tetxcld 所以我们实例了两个对象
main的实例对象 里面 包含了一个 tetxcld的实例对象
按原来的想法我们创建对象时就要调用构造事件了
现在我们断点试试
现在点击小三角运行
我们发现并没有触发构造事件的断点
现在我们连上添加到视口节点运行
我们发现进入刹车点了 触发断点了 一下是触发顺序 早到 晚
注意左上角的激活的窗口
我们发现 调用添加到视口函数 才开始调用构造事件 而且并没有去触发过他们的父类
text 蓝图里面的构造事件 这和c++有点不同
c++是 先父母 后客人 再自己 的顺序调用构造函数的 析构函数调用顺序是反过来的
当执行流认知错误 这就会导致有些问题
比如
这里我们在创建这个UI对象时调用了SetPr事件
想要 去将进度条 滑动到50%且滑动颜色是粉红的
效果
现在我加了个东西
我们在这个构造事件里添加了 滑动条为蓝色且为80%
效果
我们发现我们的滑动条使用了构造事件里面的设定了
为什么会如此 这就是执行流的问题
在此处断点 以下我发的图片是执行流的路线
我们发现执行了SetPr以后 又执行了构造事件 所以发生了执行流的错误认知 导致的bug
总结
UMG构造事件 不是创建对象时触发的(调用创建控件节点)
而是 调用 添加到视口节点 触发的
触发时的构造事件顺序
客人预构造 -》 客人构造 -》自己预构造 -》自己构造
父母并没有进行构造事件的触发
UE:触发构造时的顺序
无父母 先客人 后自己
C++:构造函数的顺序
先父母 后客人 再自己
有错误 请大佬指正