Skip to content

fix(unreal): 修正 PIE 退出时序与 LatentInfo 默认参数生成 - #2350

Merged
chexiongsheng merged 2 commits into
Tencent:masterfrom
ZhiruiLi:fix/unreal-pie-teardown-latent-defaults
Jul 29, 2026
Merged

chexiongsheng merged 2 commits into
Tencent:masterfrom
ZhiruiLi:fix/unreal-pie-teardown-latent-defaults

Conversation

@ZhiruiLi

Copy link
Copy Markdown
Contributor

本 PR 修复 Unreal 侧的两个问题:

  1. Puerts 在 FEditorDelegates::EndPIE 阶段过早销毁模块级 JavaScript 环境,导致 World 和 GameInstance 的脚本清理可能在 JsEnv 已失效后执行;
  2. C# UHT 默认参数生成器将 LatentInfo="LatentInfo" 元数据误识别为 FLatentActionInfo 的默认值,运行时因此出现 ImportText 错误。

两个问题分别放在独立提交中,便于审查和按需合入。

问题说明

PIE World 清理前 JsEnv 已被销毁

FEditorDelegates::EndPIE 的广播时机早于 UEditorEngine::TeardownPlaySession 完成 Play World 清理。

原有实现会在收到 EndPIE 后立即执行 JsEnv.Reset(),并清理 TypeScript Generated Class 的重定向和动态调用器。但此时以下退出逻辑仍可能继续执行:

  • World Subsystem 反初始化;
  • GameInstance Subsystem 反初始化;
  • UI、输入和委托解绑;
  • JavaScript 侧资源释放。

这会导致脚本清理阶段访问已经销毁的运行环境。

原有 EndPIE 路径还有一个疏漏:只释放了 JsEnv,没有同步释放 JsEnvGroup。

LatentInfo 元数据被当作默认参数

对于 Blueprint latent 函数,Unreal 使用如下元数据指定 latent 参数:

LatentInfo="LatentInfo"

这里的值表示 latent 参数名称,不是 FLatentActionInfo 的序列化默认值。

C# 默认参数生成器会先按参数源码名称查询函数元数据。当参数名为 LatentInfo 时,该查询会错误命中上述元数据,并生成:

__PF->Add(TEXT("LatentInfo"), TEXT("LatentInfo"));

FFunctionTranslator 随后将字符串传给 ImportText,产生错误:

ImportText (LatentInfo): Missing opening parenthesis: LatentInfo

修改内容

调整 PIE 生命周期

  • EndPIE 只更新 PIE 状态,不再销毁 JavaScript 环境;
  • 将 JsEnv、JsEnvGroup 和 TypeScript Generated Class 重定向清理移动到 FGameDelegates::GetEndPlayMapDelegate();
  • 在模块关闭时对称解绑新增的 EndPlayMap 回调。

调整后的退出顺序为:

EndPIE
→ World / GameInstance 退出及脚本清理
→ EndPlayMap
→ JsEnv、JsEnvGroup 和 Generated Class 清理

修正 latent 参数元数据

  • C# UHT 生成器根据函数的 LatentInfo 元数据识别真实 latent 参数;
  • 从默认参数生成结果中排除该参数;
  • 在 FFunctionTranslator 中保留运行时兼容保护,跳过旧生成产物中的非法 LatentInfo="LatentInfo" 默认值。

两处改动各管一段:生成端修复保证新产物正确;运行时保护处理旧产物,修复前生成的 InitParamDefaultMetas.inl 在重新生成前不会再触发 ImportText 错误。

兼容性

  • JsEnv 生命周期调整仅影响编辑器 PIE;
  • 非编辑器环境的创建和关闭路径保持不变;
  • JsEnvGroup 现在与单 JsEnv 使用相同的 PIE 回收时机;
  • 运行时兼容保护可处理修复前生成的默认参数文件;
  • 未增加项目定制接口,也未改变现有公开 API。

@chexiongsheng
chexiongsheng merged commit 5fc9dae into Tencent:master Jul 29, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants