DreamFXLang
语言参考

文件模型

每个 DreamFXLang 文件的形状:头、块、语句、注释、属性,以及八条 L 规则的索引。

DreamFXLang 只有一种文件形状。三种扩展名的区别在于顶层声明的是什么,不在于语法。

<Kind>(Name = <string>[, Root = <string>])
{
    <block> …
}
记号含义示例
<x>占位符——替换成实际内容,尖括号本身不写出来。Name = <string>
[ x ]可选——整段可以整体省略。[, Root = <string>]
{ a | b }多选一——从竖线分隔的写法里取其中一个。{ Node( … ) | Comment( … ) }
可重复——前一项可以出现任意多次。<property-declaration> …
Kind扩展名产物
System.dfs一个 UNiagaraSystem
Emitter.dfe无(由 .dfsfrom 拷入)
Module / DynamicInput.dfm一个 UNiagaraScript

Kind 与扩展名不一致是 DFX2021;一个文件只有一个顶层对象, 后面还有别的是 DFX2022Root 的取值见 目录与命名

块、语句、属性

Settings = {                       // 块:Name = { … }
    WarmupTime = 0.0;              // 语句以 ; 结尾
}

Properties = {
    int SparkCount = 24 [ Group="Burst"; SortPriority=10 ];   // 属性挂在声明后面的方括号里
}

// 行注释
/* 块注释 */
  • Name = { ... }
  • 语句; 结尾;
  • 属性是声明后面方括号里的 Key=Value,用 ; 分隔;
  • 注释///* */

#Region 只是注释

ParticleUpdate = {
    #Region "Forces"
    GravityForce(Gravity = (0, 0, -680));
    #EndRegion
}

#Region / #EndRegion 供人和编辑器折叠用,不会到达资产(这是 L5):外部编辑 API 没有给 栈加注记的函数。没闭合会警告(DFX2010), 多出来的 #EndRegion 是错(DFX2005)。

不是标识符的名字

Niagara 的名字来自一个不做任何限制的 UI。真实内容里有叫 PillarPower(0~1) 的 user 参数, 也有叫 Ring/DiscDistributionMode 的模块输入 —— 它们在任何语言里都不是标识符。反引号包住一个:

Properties = {
    float `PillarPower(0~1)`;
}

ParticleSpawn = {
    SphereLocation(
        `Ring/DiscDistributionMode` = Direct,
        Alpha                       = `User.PillarPower(0~1)`,
    );
}

反引号里的是一个 token,点号也包括在内 —— 写 `User.PillarPower(0~1)`, 不是 User.`PillarPower(0~1)` 。只在需要时用:`Speed` 合法,但不如 Speed 好读, 反编译器就是照这条规则输出的。名字里带反引号的没有书写形式,只能改名。 没闭合是 DFX1005

八条 L* 规则

语言的骨架是八条规则,文档里按名字引用它们:

规则
L1栈是有序语句块。六个:SystemSpawnSystemUpdateEmitterSpawnEmitterUpdateParticleSpawnParticleUpdate写的顺序就是模块顺序
L2语句只有两种:模块调用和赋值。连续的赋值折叠进同一个 Set Parameters 模块,一次模块调用打断这一串。新属性由第一次写入声明。
L3值有四种形态:字面量、linked、dynamic input、HLSL。
L4模块名通过 Settings.ModulePaths 解析;只有短名有歧义时才写长路径。
L5#Region 是注释,不到达资产。
L6内联表达式降到一条 HLSL 表达式,且只允许白名单里的函数。
L7数值转换只加宽不收窄。int -> float 隐式;float -> int 要写 int(...)
L8renderer 属性是 schema 驱动的通用赋值;每种 renderer 类型都被支持,没有逐类型语法。

L2、L3、L6、L7 的展开在值与规则,L1 在 .dfs,L8 在 .dfs 的 renderer 一节

三种文件各自的页

有意不在这里的东西

  • emitter 继承。 from 是拷贝不是继承。改 .dfe 不会反向影响已经拷过它的系统,直到重建。
  • MaterialParam 语法保留,未实现(DFX5093)。
  • 任何需要通用表达式编译器的东西。L6

本页目录