DFX5xxx — 生成与资产写入
DFX5xxx 段的全部诊断码,每条带严重级别、逐字消息、成因与修法。
DFX5xxx --- 生成与资产写入
生成标记之间的块由
.skill/gen-diagnostics.ps1写入。 标记以下的所有内容均为手工编写,并在重新生成后保留。
DFX5001
严重级别 错误
消息
Stack '%s' has no Niagara script usage mapping.触发位置 Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:1355
原因。 一种栈类型背后没有对应的 Niagara 脚本 usage。解析器能产出的每一种栈类型今天都有映射——
六个固定栈、OnEvent 和 Stage——所以走到这里意味着有人往枚举里加了新的栈类型,
却没有同时扩展 ScriptUsageForStack。
修复。 使用有映射的那些栈;如果你正在添加一种新的栈类型,请把适配器的这对映射
(ScriptUsageForStack、StackForScriptName)一起扩展。
DFX5002
严重级别 警告
消息
This system declares no emitters, so it will produce nothing.触发位置 Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:2479
原因。 没有发射器的系统能编译,但什么都不产生。
修复。 添加一个 Emitter 块。
DFX5003
严重级别 提示
消息
'%s' is not declared in this source, so its existing modules are left as-is: %s触发位置 Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:4064
原因。 声明一个栈意味着接管它;这份源码从未提及的栈会保留它原有的内容。CreateNiagaraSystem 会把一个 SystemState 放入 SystemUpdate,如果将其整体清除,会让每一个没有显式 SystemUpdate 的 .dfs 产出一个永远不运行的系统。设为提示级别,是为了让这种差异可见而不是悄无声息。
修复。 通常什么都不用做。要接管这个栈就声明它——空的 SystemUpdate = { } 会将其清除。
DFX5004
严重级别 提示
消息
No Material was set, so the engine default was applied: %s. Write 'Material = \"...\";' to choose your own.触发位置 Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:4323
原因。 没有 Material 的渲染器会拿到引擎默认值,这也是为什么一个没有贴图的特效仍然能绘制出来。
修复。 写入 Material = "..."; 来选择你自己的。
DFX5015
严重级别 错误
消息
Emitter '%s' has no record in the last build's plan.触发位置 Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:4106
原因。 尚未编写。
修复。 尚未编写。
DFX5020
严重级别 错误
消息
The last build of this stack recorded %d module node(s) for %d module(s), so its nodes cannot be addressed.触发位置 Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:2919
原因。 尚未编写。
修复。 尚未编写。
DFX5027
严重级别 错误
消息
Could not read native parent defaults: %s.触发位置 Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:2255、Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:2334
原因。 显式默认值改变了原生父级的参数类型,或者 Niagara 无法应用发射器声明或继承的默认值。
修复。 保留继承的参数类型并修正值、绑定或图条件——它们由随附的适配器错误指出——然后重新构建。
DFX5030
严重级别 错误
消息
SavePackage failed for '%s'.触发位置 Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1436
原因。 写入包失败——文件只读、源码管理锁定,或者进程无法写入该路径。
修复。 检查文件权限;如果它在源码管理下,请先签出。
DFX5031
严重级别 错误
消息
Emitter '%s' declares more than one OnEvent block. Only one event handler per emitter is representable; split the extra handlers into their own emitters.触发位置 Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:2404
原因。 一个发射器块声明了两个或更多 OnEvent 块。
DreamFX 通过外部编辑 API 的普通栈轨道访问事件栈,而那些轨道只能寻址 usage id 为零 guid 的事件脚本—— 也就是每个发射器恰好一个可寻址的处理器。第二个处理器会存在于资产上,但对之后的每一次读写都不可见, 所以生成器在前面就拒绝它,而不是构建一个它永远无法往返还原的东西。
修复。 每个发射器保留一个 OnEvent 块。如果一个发射器确实需要响应两条事件流,
就把它拆成两个发射器、各带一个处理器——栈保持完全相同,两边都针对同一批源事件生成。
DFX5032
严重级别 错误
消息
Emitter '%s' declares two Stage blocks named '%s'. Stages are identified by name; rename one.触发位置 Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:2382
原因。 一个发射器声明了两个同名的 Stage 块。写入侧按名字「创建或复用」stage
(这也是引擎 UI 自己对 stage 的身份认定),所以两个块会落到同一个 stage 上,
而它会静默地只保留最后写入的那个栈。同一段代码也承载构建期由适配器报告的 stage 失败——
一个从未闭合的切片、资产上某个类不是引擎通用 stage 的 stage。
修复。 给其中一个块改名。一个发射器内的 stage 按名字标识,所以每个都需要有自己的名字。
DFX5033
严重级别 错误
消息
Emitter '%s' declares Stage blocks but simulates on the CPU. Simulation stages are a GPU feature: set `SimTarget = GPU` in the emitter's Settings.触发位置 Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:4495
原因。 一个发射器声明了 Stage 块,却在 CPU 上模拟。模拟阶段是
GPU 计算特性;CPU 发射器无法运行它,而 Niagara 自己的抱怨会晚一步以一条不指向任何源码行的
编译错误出现。这项检查读取的是活动发射器而不是本文件的
Settings,因为一个 from 发射器可能是 GPU 的,而 .dfs 里并没有写。
修复。 在发射器的 Settings 块中设置 SimTarget = GPU(连同 FixedBounds,
GPU 发射器无法自行计算它),或者删除 Stage 块。
DFX5034
严重级别 错误
消息
Emitter '%s' uses 'as %s' on two module calls. Node names are unique per emitter; rename one.触发位置 Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:2459
原因。 一个发射器中的两次模块调用带有相同的 as <name> 后缀。这个后缀命名的是函数调用
节点,Output.<node>.<value> 链接按这个名字解析,而节点名在一个发射器图内是唯一的——两个占用者
会让所有这类链接解析到遍历时最先遇到的任意一个节点。
修复。 给其中一个改名。反编译器只会用原资产的节点名来写出 as,
那些名字天然唯一,所以这条只会在手工编辑过的源码上触发。
DFX5035
严重级别 错误
消息
'%s' is still open in the Niagara script editor. The rebuild was cancelled to protect its editable copy. Close the editor, then rebuild again.触发位置 Source/DreamFXEditor/Private/UI/DreamFXEditorGeneration.cpp:46
原因。 目标 Niagara 脚本编辑器无法关闭,例如其关闭确认被取消了。如果继续重建, 它的可编辑副本可能会覆盖生成的图。
修复。 处理编辑器中挂起的更改并关闭它,然后重建。成功关闭的编辑器会在生成完成后重新打开。
DFX5036
严重级别 警告
消息
OnEvent source '%s' is an id no emitter in this system answers to, so this handler never fires. Point it at the emitter that raises the event, or delete the handler.触发位置 Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:4404
原因. 某个 OnEvent 头的 Source 是一个本系统中没有任何 emitter 响应的 id,它被写成了反编译器写无法解析的 id 的那种形式:`<unresolved GUID>`。有两种情况会产生它。把一个 handler 带进复制的系统时,它会保留在原系统中的 id —— 复制时没有任何东西会重新映射它,于是多个系统最终共用一个过期的 id。或者源 emitter 被删掉了,而 handler 留了下来。
该 handler 会带着这个 id 被写回,所以往返是忠实的,但它永远不会触发:运行时会根据 id 的字符串形式构建事件处理器查找表,然后按名字找到事件集(NiagaraEmitterInstanceImpl.cpp:418-419,查找位于 :1307),而没有任何 emitter 会响应一个 guid。资产正处于完全相同的状态 —— 这是关于资产的事实,而不是关于文本的。
修复. 判断这个系统中哪个 emitter 本来应该触发 Event,并在 Source 中写出它的名字。源可以出现在文档中接收者之前或之后:handler 是在所有 emitter 都存在之后才添加的。如果已经没有东西再触发那个事件,就删除该 handler 以及它的栈所携带的模块 —— 这会让资产丢掉一些事实,所以必须告诉构建安全门(-Force),它的报告会列出丢掉了什么。之后重新构建:警告会一直存在,直到 Source 指向一个活着的 emitter。
DFX5093
严重级别: 错误 (error)
消息:
'MaterialParam' is reserved syntax and is not implemented in v1 (plan section 7).触发位置: Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:1777
原因. MaterialParam 是保留语法(L8),v1 没有实现。
修复. 用不了。改成在材质实例上设材质参数。
DFX5097
严重级别: 错误 (error)
消息:
Only System documents can be generated right now; this file declares a %s.触发位置: Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:5192
原因. 只有 .dfs 和 .dfm 产资产。.dfe 按拷贝合并进它的宿主(R3),自身没有可生成的东西。
修复. 在某个 .dfs 中用 from 引用这个 .dfe。
DFX5098
严重级别: 错误 (error)
消息:
Data interface parameter '%s' takes its configuration as a quoted JSON object, the form the decompiler writes.触发位置: Source/DreamFXEditor/Private/Generation/DreamFXGenerator.cpp:2037
原因. DI<T> user 参数的配置是一个带引号的 JSON 对象 —— 与模块的数据接口输入是同一种逐字形式,也是导出器写出来的形式。这里放别的东西,应用器读不了。配置格式正确但引擎拒绝应用时也会在 DFX5098 下报告,那通常意味着 blob 里的某个属性名在那个接口类上已经不存在了。
修复. 把配置写成带引号的 JSON 对象,或者干脆让参数保持裸的 —— 没有值的声明是一个留给运行时填的槽,合法且不会有任何提示。对一个已经把接口按你想要的方式配好的系统跑 dfx decompile,它会打印出那个 blob 的确切内容。
2026-08-12 变更。 这条以前是警告,意思是「只声明,v1 不应用默认值」(计划 3.5)。现在配置会被应用。那次范围削减在付出真实的行为代价:
NS_Spawn_Ninja_Root上的碰撞源和属性读取器全是 user 数据接口,每一个镜像都把它们 default-construct 了 —— 特效画出来了,但不对任何东西产生交互。
DFX5100
严重级别: 错误 (error)
消息:
'%s' is a %s with no generated asset at '%s', and %s触发位置: Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:834
原因. 没有找到以前生成的资产,而这次构建也没有可用的图后端去造一个。这比以前罕见得多:不导出那五个声明的引擎仍然能拿到反射后端,所以走到这里意味着它的启动自检没过,消息里点名的就是哪一项检查。三种结果见 dfm.md。
修复. 读那条被点名的检查 —— 它说的是后端期待、但没找到的那个引擎形状,那才是真正要修或要上报的东西。在此之前,去一台后端跑得起来的引擎上生成这个模块并提交资产;任何引擎都能正常加载、引用和 cook 它。或者直接绕开这个模块:用内联 hlsl { } 表达式,或者一个已有的 dynamic input 资产。
DFX5101
严重级别: 错误 (error)
消息:
(built at runtime)触发位置: Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:716
原因. .dfm 上的 Root="..." 没有指向一个已挂载的内容根。
修复. Root 取 Game、空串或 Plugin.<PluginName>。
DFX5102
严重级别: 提示 (info)
消息:
Input '%s' is marked [StaticSwitch]. Tier-one generation (plan 3.3) lowers the whole Body to a single custom HLSL node, which has no branch for a switch to select, so it is written as an ordinary input instead. The body reads it the same way; only the compile-time folding is lost.触发位置: Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1068
原因. 一级生成(计划 3.3)把整个 body 放进一个 custom HLSL 节点,那里没有给开关选择的分支,所以一个 [StaticSwitch] 输入被写成了普通输入。这件事要说出来,因为把一个声明过的编译期开关静默降级成运行时值,正是那种日后以「性能问题但谁也说不清来源」形式浮现的差别。
修复. 什么都不用做 —— body 读它的方式完全一样,丢掉的只是编译期折叠。
DFX5103
严重级别: 错误 (error)
消息:
Package '%s' exists on disk but could not be loaded.触发位置: Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:746
原因. 包在磁盘上存在但加载不了。通常是写了一半的文件,或者被另一个进程占着。
修复. 检查那个文件。编辑器开着它的话,关掉资产再重建。
DFX5104
严重级别: 错误 (error)
消息:
Package '%s' exists but holds no Niagara script named '%s'. Refusing to overwrite it.触发位置: Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:755
原因. 目标包存在,但里面装的不是期待的那个脚本。DreamFX 拒绝覆盖它,而不是替掉一个无关资产。
修复. 改 Name="...",或者那个资产确实过时了就删掉它。
DFX5105
严重级别: 错误 (error)
消息:
Could not create package '%s'.触发位置: Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1117
原因. 包创建不出来 —— 通常是根没挂载,或者名字非法。
修复. 检查 Root 和 Name。
DFX5106
严重级别: 错误 (error)
消息:
Could not wire the module graph. The Niagara schema rejected a parameter map connection.触发位置: Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1216, Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1241, Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1250, Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1264, Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1341, Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1350, Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1367, Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1379, Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:1387
原因. 建模块图时 Niagara 的 schema 拒绝了一条连接。最常见的原因是输入的声明类型与它要喂的引脚类型不匹配。
修复. 检查输入的类型。如果那是 Niagara 没有对应引脚的类型,模块就接不了它。
DFX5107
严重级别: 错误 (error)
消息:
'%s' no longer matches the module asset at '%s', and this build cannot regenerate it. Rebuild it where a graph backend runs and commit the updated asset; %s触发位置: Source/DreamFXEditor/Private/Generation/DreamFXModuleGenerator.cpp:851
原因. .dfm 源码与它提交进来的资产已经不一致,而这次构建没有图后端可以重新生成。与 DFX5100 分开,是因为补救办法不同:资产是有的,只是过期了。
修复. 去一台后端跑得起来的引擎上重建这个模块,并提交更新后的资产。消息后半段点名的是没通过的那项检查 —— 如果你本来预期这台引擎能生成,那就是要修的地方。
DFX5099
历史诊断。 当前源码树已不再发出此信息性代码。本节仅为旧诊断链接保留,不属于生成的活动代码列表。
先前的消息为:
[Group] and [SortPriority] are kept in source only: the external edit API's user variable struct has no metadata fields to write them to.该限制已被移除。Group 和 SortPriority 现在可通过系统的用户参数层级 UNiagaraSystemEditorData::UserParameterHierarchy 到达资产。重建会应用源码中的分组和顺序;在编辑器中手工调整的排列不会在重建后保留。当前行为请参见系统参考中的用户参数。
DFX5015
此兼容性标题用于保留较早文档快照中的链接。DFX5015 现在属于已发布的增量构建诊断:发射器在上次构建的计划中没有记录。有关其原因和修复方法,请参阅当前的DFX5015 参考。
DFX5020
此兼容性标题用于保留较早文档快照中的链接。DFX5020 现在属于已发布的增量构建诊断:存储的模块节点数量与堆栈的模块数量不匹配,因此无法对其节点进行寻址。有关其原因和修复方法,请参阅当前的DFX5020 参考。