UE4.27.2蓝图中Object值在Set节点执行前被异常修改问题
UE4.27.2蓝图Text值提前修改、Branch分支逻辑失效问题
问题现象
在Unreal Engine 4.27.2开发中做Text对象值校验逻辑时遇到异常:原逻辑设计为通过branch(分支)节点做条件校验,校验通过后才执行Text值的Set设置操作,但实际运行时目标值在Set节点执行前就已经被修改。
目前已完成问题场景隔离,在简化测试蓝图中可稳定复现问题:测试蓝图前序逻辑仅为BeginPlay事件挂载调试接口后直接接入问题逻辑节点,观测到的现象如下:
- 基础复现场景下,用于查询值的调试函数Direction Trace输出始终为"Up",Actual Content显示值为"New Value"
- 删除末尾设置"Short Difficulty Name"的节点后,Direction输出变为"Down",Actual Content可正确显示原始值"Hazard 3"
- 将原始值与随机整数做比较的对照测试中,Direction输出为"Down",但Actual Content仍显示为"New Value"
已尝试排查手段
以下方案均未定位到问题根因:
- 复制Text值规避指针引用导致的误修改
- 查阅资料确认Branch节点、蓝图纯函数是否存在执行延迟
- 跳过String转换步骤,直接比较Text类型做判断
问题根因
该问题是UE4.27.2版本蓝图编译器的已知优化缺陷:编译器在生成字节码时,会错误地将分支执行流内的Text类型Set操作做提前传播优化,跳过Branch节点的条件判断,直接把赋值逻辑插到了分支判断之前执行,属于字节码生成顺序错误,和逻辑写法本身无关。
修复方案
可按优先级选择以下方案解决:
- 在Branch节点之前,将待判断的原始Text值通过
Copy Text节点拷贝到一个临时局部变量中,所有分支判断逻辑都基于该临时变量执行,不要直接引用原Text变量参与判断,即可打断编译器的错误优化传播 - 若上述方案仍未生效,可在Branch节点的True执行引脚和后续Set节点之间插入一个任意非纯执行节点(比如临时加一个
Print String节点、或者Delay时长为0的节点),强制编译器按照节点摆放顺序生成字节码 - 升级引擎到UE4.27.3热修复版本或UE5.0及以上正式版本,官方已在后续迭代中修复了该类Text类型变量的编译顺序错误问题
内容的提问来源于stack exchange,提问作者NaturalBornCamper
相关产品推荐
相关产品推荐

