DreamFXLang
诊断码

DFX4xxx — 值、类型与表达式

DFX4xxx 段的全部诊断码,每条带严重级别、逐字消息、成因与修法。

本族共 32 条(32 错误)。消息是编译器持有的格式串:%s%d%c 在运行时被替换掉。

DFX4001

错误抛出位置Generation/DreamFXValueLowering.cpp:520Generation/DreamFXValueLowering.cpp:530Generation/DreamFXValueLowering.cpp:545Generation/DreamFXValueLowering.cpp:621

Input '%s' expects %s, but a number was written.

原因. 输入要的是向量、颜色或别的结构化类型,写进去的却是一个裸数字。

修复. 把分量都写出来:(0, 0, -980)

DFX4002

错误抛出位置Generation/DreamFXExpressions.cpp:119Generation/DreamFXGenerator.cpp:331Generation/DreamFXValueLowering.cpp:444Generation/DreamFXValueLowering.cpp:514Generation/DreamFXValueLowering.cpp:553

Expression for '%s': a vector literal must have 2 to 4 components.

原因. Niagara 的向量类型是 2、3 或 4 个分量。

修复. 数一下分量个数。

DFX4003

错误抛出位置Generation/DreamFXValueLowering.cpp:501

Input '%s' is an integer, but %s was written. Narrowing is not implicit -- write int(%s) if truncation is intended.

原因. L7:float -> int 永远不隐式。一个被静默截断的 spawn count 属于最难找的那类特效 bug。

修复. 真的要截断就写 int(...),否则把源头改成 int。

DFX4004

错误抛出位置Generation/DreamFXValueLowering.cpp:463Generation/DreamFXValueLowering.cpp:580

Input '%s' has no resolvable Niagara type.

原因. 从模块 schema 里解析不出这个输入的类型。

修复. 通常是这个输入藏在一个还没写的静态开关后面 —— 先写开关;源码顺序就是写入顺序。

DFX4005

错误抛出位置Generation/DreamFXGenerator.cpp:1122Generation/DreamFXGenerator.cpp:1443Generation/DreamFXGenerator.cpp:345Generation/DreamFXGenerator.cpp:372Generation/DreamFXValueLowering.cpp:567Generation/DreamFXValueLowering.cpp:669

Property '%s': component %d is not a number.

原因. 向量或 box() 的某个分量不是数字。

修复. 分量只能是字面量,参数引用不能出现在里面。

DFX4006

错误抛出位置Generation/DreamFXValueLowering.cpp:643

Input '%s' is a %s, which has no entry named '%s'. Valid entries: %s

原因. 这个枚举没有叫这个名字的条目。Niagara 的用户自定义枚举内部存的是 NewEnumerator0, 真名留在显示文本里,所以这些名字从资产上是猜不出来的 —— 它们是实时读的。

修复. 用列出来的条目之一。空格和连字符会被归一化掉,所以 Direct Set 写成 DirectSet

DFX4007

错误抛出位置Generation/DreamFXValueLowering.cpp:652

Input '%s' expects %s. '%s' is neither a literal of that type nor a parameter reference -- parameter references start with a namespace such as User., Particles., Emitter., System. or Engine.

原因. 这个值既不是期待类型的字面量,也不是带命名空间的参数。

修复. 给参数加上命名空间(User.SpeedParticles.Velocity),或者写一个字面量。

DFX4010

错误抛出位置Generation/DreamFXGenerator.cpp:1032Generation/DreamFXGenerator.cpp:1433

Input '%s' is set more than once on dynamic input '%s'.

原因. 同一次 dynamic input 调用里,同一个输入被给了两次。

修复. 删掉一个。

DFX4020

错误抛出位置Generation/DreamFXValueLowering.cpp:328Generation/DreamFXValueLowering.cpp:373

Parameter '%s': 'Object' needs an inner type, e.g. Object<Texture>.

原因. DI 自己不指任何类。

修复. 把内层类型写出来:DI<SkeletalMesh>

DFX4021

错误抛出位置Generation/DreamFXValueLowering.cpp:361Generation/DreamFXValueLowering.cpp:407

Parameter '%s': no UObject class named '%s'. Object<> takes a class name such as Object<Texture> or Object<StaticMesh>.

原因. 声明的类型不是 DreamFX 认识的那些。

修复. 用消息里列出来的类型之一。

DFX4022

错误抛出位置Generation/DreamFXValueLowering.cpp:451

Cannot infer the type of '%s' from its value. A first assignment to a new attribute must use a literal, so its type is unambiguous.

原因. L2 用第一个值给新属性定类型,而这个值自己不带类型 —— hlsl 块、dynamic input 和内联表达式都没有自己的类型。

修复. 把类型写上:Color Particles.Moon.Tint = hlsl { ... };

DFX4023

错误抛出位置Generation/DreamFXGenerator.cpp:457Generation/DreamFXGenerator.cpp:469

Property '%s': box() takes 6 numbers -- minX, minY, minZ, maxX, maxY, maxZ.

原因. box() 是 minX、minY、minZ、maxX、maxY、maxZ。

修复. 写六个数。

DFX4024

错误抛出位置Generation/DreamFXGenerator.cpp:735

Cannot type '%s = %s': the type of '%s' is not known here. Declare it in Properties, or assign a literal first so the type is explicit.

原因. 右边引用了一个此处还不知道类型的参数。

修复.Properties 里声明它,或者在同一个栈里更早的位置先赋一个字面量 —— L2 的第一次写入才是声明属性的那一次。

DFX4025

错误抛出位置Generation/DreamFXGenerator.cpp:1113Generation/DreamFXGenerator.cpp:1938

'%s' is not a valid assignment target. Parameter names are namespace-qualified, e.g. Particles.MyValue or Emitter.MyCounter.

原因. 不带命名空间的赋值目标没有落脚的地方,而猜一个出来会把值放到一个从没被点名的位置。

修复. 加上命名空间:Particles.MyValueEmitter.MyValueSystem.MyValue

DFX4026

错误抛出位置Generation/DreamFXGenerator.cpp:1497

'Bind %s -> %s': the target must be a qualified parameter -- either a namespace such as Particles.SpriteSize, or an emitter's own alias such as MyEmitter.Velocity.

原因. renderer 绑定的目标是一个参数,不是一个裸名字。

修复.Bind Color -> Particles.Color;

DFX4027

错误抛出位置Generation/DreamFXGenerator.cpp:782

'%s' is %s, but '%s' is %s. Linking binds a parameter directly -- there is no conversion. Declare '%s' as %s, or drive the input another way.

原因. 跨链接的 L7。链接是直接绑定参数 —— 中间没有可以截断或加宽的转换步骤 —— 所以两边类型必须严格一致。

修复. 把源参数声明成目标的类型。这是 L7 里唯一一个显式 cast 也救不了的情况,因为没有地方放那个 cast。

DFX4028

错误抛出位置Generation/DreamFXGenerator.cpp:1946

Default for '%s' needs a declared type. A default has no module signature to infer one from, so write it: `float %s = …`.

原因. 一条 Defaults 条目没写类型。在别处类型可以来自值、或来自输入所属的模块签名; 而默认值不属于任何模块,它的值又可能是 hlsl 块或链接,于是没有可推断的来源。

修复. 把类型写上:float Particles.MySize = 1.0;

DFX4029

错误抛出位置Generation/DreamFXGenerator.cpp:1983

Default for '%s' must be a literal, an enum or another parameter. A dynamic input computes a value per particle, which a default cannot do.

原因. 一条 Defaults 条目被喂了 dynamic input。默认值是存在参数上的一个值, 而 dynamic input 是一张逐粒子运行的图 —— 没有地方运行它。

修复. 用字面量、枚举,或者链接到另一个参数。真的需要计算,就在 ParticleSpawn 里写成赋值 —— 那里是会运行的。

DFX4030

错误抛出位置Generation/DreamFXExpressions.cpp:340

The hlsl block for '%s' must be a single expression: no statements, no local variables, no return. Move multi-statement logic into a .dfm DynamicInput and call it here.

原因. 栈输入的 hlsl 块会降成一个只有一个类型化输出引脚、没有函数体的节点,所以装不下语句。

修复. 折成一个表达式,或者把逻辑挪进 .dfm Module —— 它的 body 逐字输出。.dfm 生成的存在就是为了补上这个缺口。

DFX4031

错误抛出位置Generation/DreamFXExpressions.cpp:158

'%s' is not an allowed inline function. Allowed: %s. Anything else belongs in a .dfm dynamic input or an hlsl { } block.

原因. L6 的白名单。放宽它就是滑向重新实现一个上万行的表达式后端,所以它故意很短。

修复. 用列出来的函数、一个 .dfm dynamic input,或者一个 hlsl { } 块 —— 那里面任何 HLSL 都合法。

DFX4032

错误抛出位置Generation/DreamFXExpressions.cpp:100

'%s' in the expression for '%s' is not a parameter. Only namespace-qualified parameters (User.X, Particles.X, Engine.X, ...) can be read from an expression.

原因. 内联表达式看得见参数,看不见局部变量。裸名字没有可绑定的东西。

修复. 加上命名空间,或者把表达式挪进有局部变量的 hlsl { } 块。

DFX4033

错误抛出位置Generation/DreamFXExpressions.cpp:166

Builtin '%s' takes positional arguments, not named ones.

原因. L6 的内置函数是位置参数。具名参数读起来像一次 dynamic input 调用,会静默地解析成别的东西。

修复.saturate(x),不是 saturate(Value = x)

DFX4034

错误抛出位置Generation/DreamFXExpressions.cpp:174

Builtin '%s' takes %d argument(s), but %d were written.

原因. 参数个数是区分 lerp(a, b)lerp(a, b, t) 的唯一线索。

修复. 数一下实参个数。

DFX4035

错误抛出位置Generation/DreamFXExpressions.cpp:205

Expression for '%s' contains a value that has no HLSL form.

原因. 表达式里有一部分没有 HLSL 形式 —— 比如算术里出现了曲线字面量或者数据接口。

修复. 把那一部分挪到它自己的输入上。

DFX4036

错误抛出位置Generation/DreamFXExpressions.cpp:330

The hlsl block for '%s' is empty.

原因. 空的 hlsl 块会降成一个里面没有文本的表达式。

修复. 把表达式写了,或者把块删了。

DFX4037

错误抛出位置Generation/DreamFXExpressions.cpp:356

'%s' is %s; a curve { } literal only fits a curve data interface input.

原因. curve { } 字面量填的是曲线数据接口,而这个输入不是。

修复. 把曲线喂给真正接受它的那个输入 —— 通常是 FloatFromCurve(FloatCurve = curve { ... }) 这类 dynamic input。

DFX4038

错误抛出位置Generation/DreamFXExpressions.cpp:364

The curve for '%s' has no keys.

原因. 空曲线求值出不来任何东西,运行时读起来就是一个卡在零的值。

修复. 加上键。

DFX4039

错误抛出位置Generation/DreamFXExpressions.cpp:378

Unknown curve interpolation '%s'. Expected Auto, Cubic, Linear or Constant.

原因. 曲线切线是数据;一个不认识的模式如果回退成 Auto,就会不吭声地丢掉一条手调过的形状。

修复.AutoCubicLinearConstant

DFX4040

错误抛出位置Generation/DreamFXValueLowering.cpp:601

Parameter '%s': no asset at '%s'.

原因. 一个 Object<T> 参数拿到了一个资产路径,而那个路径上什么都没有。通常是源码写完之后资产被移动或改名了, 或者写的是 Content Browser 的显示名而不是对象路径。

修复. 用资产右键 Copy Reference 复制出来的路径,整条粘进去: Object<Texture> _Tex = "/Game/FX/T_Spark.T_Spark";。点号后面那一半是包内的对象名,不能省。

DFX4041

错误抛出位置Generation/DreamFXValueLowering.cpp:610

Parameter '%s': '%s' is a %s, which is not a %s.

原因. 那个路径上的资产存在,但不是参数声明的那个类。Object<Texture> = ".../M_Fire" 指的是一个材质, 而 Niagara 会在运行时而不是构建时拒绝这次绑定。

修复. 要么指向声明类的资产,要么把声明放宽到你真正指的那个类 —— Object<Texture>Object<StaticMesh>Object<MaterialInterface> 等等,与模块输入期待的一致。

DFX4042

错误抛出位置Generation/DreamFXExpressions.cpp:388

Unknown curve tangent mode '%s'. Expected Auto, User, Break or None.

原因. 曲线键的 Tangent= 属性写了一个不属于 Unreal 四种切线模式的名字。这里拒绝而不是回退, 理由和 DFX4039 一样:回退成 Auto 会静默丢掉写在旁边的切线,而一条折角被磨圆了的曲线是另一条曲线。

修复.AutoUserBreakNone —— 或者干脆不写 Tangent: 那样带切线的键视为 User,不带的视为 Auto,这也是这个属性存在之前所有源码的含义。

DFX4091

错误抛出位置Generation/DreamFXValueLowering.cpp:663

Input '%s': dynamic inputs, hlsl blocks, curves and inline expressions are not available yet (planned for Phase 3).

原因. 一个 Phase 2 的构建撞上了 Phase 3 的值形态。历史遗留 —— 在当前版本上不应该出现。

修复. 重新编译插件。还在出现,说明这份源码是被一个旧二进制编译的。

本页目录