DreamFXLang
更新日志

更新日志

DreamFX 每个版本覆盖了什么,以及 1.0.0 的发布验证快照与已知问题。

版本号跟着插件走(DreamFX.upluginVersionName)。本站与插件仓库的 CHANGELOG.md 同源。

未发布

修复

  • 5.6 / 5.7:静态开关暴露的条件输入现在看得见了#1)。没有外部编辑 API 的引擎走 Compat/ 那一层,而它枚举模块输入时在第一个 UNiagaraStackFunctionInput 就停手。 模块输入是一棵层级:开关揭示的输入是该开关的子节点,不是它的兄弟 —— InitializeParticleLifetime 挂在 LifetimeMode 下,UniformSpriteSize 挂在 SpriteSizeMode 下。于是探测只看得到 13 个顶层输入,写开关像是没生效, 它揭示的每个实参都被当成拼写错误(DFX3003)。 改成引擎自己那两条规则:进入输入的子节点,在 Dynamic 输入处停下。写入路径同一个解析器, 所以条件输入现在也能寻址。5.8 与 MoonEngine 用引擎自带 API,从来不走这条路,不受影响。
  • 5.6 / 5.7:输入的可见 / 可编辑改用引擎的三条门。 GetIsHidden + VisibleCondition + EditCondition,与 GetStackInputTopology 逐字一致。原先的 GetShouldShowInStack / GetIsEnabled 在这两个引擎上分别只回答「只显示已修改」过滤器和宿主节点的启用状态,一律报 true —— 顶层输入没有东西会隐藏它们,所以此前无害;一旦开始收集条件子节点就不再无害, 未被选中的分支也是存在且隐藏的子节点。反编译器按 !bVisible || !bEditable 跳过输入,是会被骗到的那个读者。
  • 保存失败不再让编辑器崩溃。 四处 UPackage::SavePackage(adapter 落盘、模块生成、模块库、 Phase0 commandlet)都用了 FSavePackageArgs 的默认 Error = GError —— GError 上的任何一条消息都是 fatal,于是「另一个程序正在使用此文件」(两个编辑器的源码监视器同时重建同一个 .dfs、只读文件、 杀软占用)直接把编辑器杀掉,DFX5030 那条错误路径从来到不了。 改为 SaveArgs.Error = GWarn,失败回到构建错误。
  • DFX7102 不再把 SpawnParticlesInGrid 当作按速率生成: 它和 SpawnBurst 一样是每循环一次的 burst(X·Y·Z),上限由循环决定。 列表只留 SpawnRate / SpawnPerUnit / SpawnPerFrame

文档

  • .dfm Body 里调用 DI<X> 输入的函数(Wind.SampleWind(Particles.Position, V, G))时, out 实参必须是未初始化的局部变量float G = 1.0; 会让 CPU VM 编译报 out/inout parameters must be lvaluesDFX6006)—— hlslcc 先把带初值的局部常量折叠进实参再查 out 形参。GPU 两种写法都过;按未初始化写, 一份 Body 两端通。见 .dfm。首个外部插件 DI(DreamWind 的 UNiagaraDataInterfaceDreamWind)经 DI<DreamWind> 反射解析、模块输入接线、.dfsUser.Wind 传参全线打通,无需 DreamFX 改动。

1.0.0 — 2026-08-13

首个正式版本。文本源码(.dfs / .dfe / .dfm)→ 标准 Niagara 资产 (UNiagaraSystem / UNiagaraEmitter / UNiagaraScript),反方向的完整反编译, 以及一套把「每个声明都带测量」当作纪律的验证体系。

语言与生成

  • .dfs 全量系统定义:user 参数(含 DI 参数带 JSON 配置)、system/emitter 六固定栈、 OnEvent 事件处理器具名 Simulation Stage(迭代源 / 绑定 / ExecuteBehavior / NumIterations·Enabled 值或参数双形态)、renderer 通用属性赋值与 Bind、 Settings(含 bFixedTickDelta、系统级 FixedBounds)。
  • 全部值模式:字面量 / linked / enum / 嵌套 dynamic input / hlsl { } / curve { }(带 InterpTangent=Auto|User|Break|None;可读形式表达不了的曲线 DI 自动退回逐字 JSON —— 便利没有资格丢数据)。
  • 静态开关走 override pin(引擎 stack UI 的同一条路),两个引擎都覆盖; 链接形态按模块自身 DefaultBinding 解析 —— 相等即无操作,不等即拒绝,调用点没有链接机制。
  • .dfe 可复用 emitter 拷入;.dfm 模块 / 动态输入生成,stock 引擎经反射后端同样可用
  • @版本 真实选中;R7 溯源戳(源 hash + 生成器版本 + 模块版本 GUID)。

反编译与镜像

  • 任意 UNiagaraSystem.dfs,逐字节幂等;表达不了的东西逐条写进文件头缺口注释,绝不静默。
  • Decompiled/<原目录> 命名空间:导出即一等源码,存盘即重编,结构上碰不到原资产。
  • 编辑器集成:菜单 / 右键 / 工具栏 / VSCode workspace / Adopt 接管(有丢失就拒绝)。

验证体系(四层)

  • L1 mirror-diff 文本逐行;L2 镜像编译;L3 运行时等价(SimCache 固定步长逐帧粒子数, A-vs-A 自对照裁决可判定性);资产级事实对比 asset-diff(不经导出器的反射走查, 含 compiled 事实族,两侧先强制编译)。corpus 55 条同时比「夹具建的资产」与 「其导出重建的资产」—— 对称丢失自 2026-08-12 起不再隐形。
  • CI 四步 lint → build → verify → corpus;gen-diagnostics.ps1 -Check 防文档漂移; 143 个诊断码全带文件 / 行 / 列

双引擎

  • MoonEngine(源码 5.8.1)与 stock installed 5.8.1 同一份源码零 #if 分叉
  • 1.0.0 发布轮在 stock 上根治四个长进程缺陷:UObject 计数 GC 门、收集与活编辑面的时序安全、 无默认值 user 参数被引擎静默丢弃的兜底、迭代中创建对象的致命修改; 外加宿主项目内容插件对齐要求(见能力边界)。

发布验证快照(2026-08-13,commit 4e23c55

Moon(源码 5.8.1)stock(installed 5.8.1)
ci(lint→build→verify→corpus)OK,55 verified / corpus 55corpus 55/55(单跑)
decompile-all45/4524/24
build -All -Force55/0/030/0/0(连续两跑)
mirror-diffL1 45/45,L2 45/45L1 24/24,L2 24/24
asset-diff6 same / 39 different(全部为已宣告族)
L3 运行时等价45 对:7 exact / 0 phased / 0 differ / 38 undecidable
诊断文档 -Check绿

已知问题

能力边界

本页目录