3.1 KiB
3.1 KiB
Application::RebuildScriptingAssemblies
重建当前项目的 managed 脚本程序集,并在构建成功后立即重载脚本运行时。
bool RebuildScriptingAssemblies();
前置条件
Application已经持有有效EditorContext- 当前项目路径非空
如果这两个条件不满足,当前实现直接返回 false。
当前行为
当前实现的顺序是:
- 读取当前 project path
- 在启用 Mono scripting 的构建里,先调用
ShutdownScriptingRuntime() - 调用
EditorScriptAssemblyBuilder::RebuildProjectAssemblies(projectPath) - 如果构建失败,写入
m_scriptRuntimeStatus.statusMessage并返回false - 如果构建成功,继续调用 ReloadScriptingRuntime
这意味着它的真实语义是:
- 不是“只生成 dll”
- 而是“先卸载当前 runtime 释放程序集锁,再构建,最后尝试切换到新 runtime”
返回值语义
返回值并不只代表“编译是否成功”。
当前它表示的是:
- 构建成功,且随后
ReloadScriptingRuntime()也成功时,返回true - 只要构建失败,或构建成功但 runtime 仍未成功装载,返回
false
这一点很关键。比如:
dotnet/csc构建成功了- 但生成后的程序集初始化 Mono runtime 失败了
这种情况下该方法仍会返回 false。
失败路径
构建失败
如果 EditorScriptAssemblyBuilder::RebuildProjectAssemblies(...) 返回失败:
- 会把构建器返回的
message写入m_scriptRuntimeStatus.statusMessage - 会记录 scripting error 日志
- 不会调用
ReloadScriptingRuntime()
但这里要注意一个和旧文档不同的点:
- 进入构建前已经执行过
ShutdownScriptingRuntime() - 因此失败后 editor 会处于“没有活动脚本 runtime,只保留失败状态消息”的状态
- 它不会继续保留旧 runtime
Mono 后端未启用
如果当前构建没有启用 XCENGINE_ENABLE_MONO_SCRIPTING:
- 会写入“不包含 Mono scripting support”的状态消息
- 直接返回
false
与 ReloadScriptingRuntime() 的区别
ReloadScriptingRuntime()只重扫并装载当前Library/ScriptAssembliesRebuildScriptingAssemblies()会先卸载当前 runtime 以释放GameScripts.dll这类项目本地程序集的锁,再尝试重新生成这些程序集,最后进入 reload
所以当 UI 上出现:
Reload ScriptsRebuild Scripts
它们并不是两个名字不同的同义按钮,而是两条不同的恢复链路。
当前调用方
当前这条 API 的直接上层主要是脚本相关 UI,例如:
ScriptComponentEditorProjectCommandsMainMenuActionRouter
它们通常会在“当前没有成功加载脚本程序集,但后端可用”时开放这个入口。