DUI6xxx · 编译
.dui 挂不到它的 Blueprint 上。
本页由 scripts/diagnostics/sync.py 从插件的码表(EDreamUIDiagnosticCode)生成,卡片里的枚举名就是测试断言用的那个名字。
DUI6001
错误枚举名SourceFileUnreadable
Blueprint 的 Source File 指向一个不存在或读不出来的文件。
怎么会出现:编译时按 Source File 找 .dui:相对路径依次在项目和各个插件的 DUI/ 根下查找,Plugin.Name: 前缀指定一个插件的 DUI/,绝对路径照原样使用。消息会写出你写的路径、实际查找的位置和搜索过的根;Plugin.Name: 指向的插件没有启用或没有 DUI/ 目录时也会单独说明。
怎么改:把文件放到某个 DUI/ 根下(不是 Content/),或者修正 Blueprint 的 Source File。
DUI6002
错误枚举名EmptyTree
一个解析通过、却没有产生任何树的文件。
怎么会出现:构建器没有交回控件树。原因(比如某个节点类型解析不到)在同一次编译里已经由更早的诊断说过了,这一条报的是结果:没有东西可以编译进这个类。
怎么改:先处理同一次编译里更早的那几条诊断。
DUI6003
警告枚举名ClassPathMismatch
一个指向了另一个 Blueprint、而不是正在编译的这个的 class 行(警告)。
怎么会出现:文件的 class 行写的资产不是当前正在编译的 Blueprint,比如复制了一个文件却没改 class 行。它只是警告:这一行的任务是提供稳定的本地化命名空间,写错只会让键漂移,不会破坏构建;本地化键仍然使用文件里写的名字。
class /Game/UI/WBP_Settings
Widget Root { }怎么改:把 class 行改成正在编译的 Blueprint 的路径;如果文件是有意在多个子类之间共享的,可以忽略这条警告。
DUI6004
错误枚举名EventHandlerNotFound
一个 -> Handler,而类里没有这个函数。
怎么会出现:处理函数在这次编译正在构建的类上,构建器没法提前查找,所以由编译器检查:这个 Blueprint 上找不到这个名字的函数。事件这一半出错报的是 DUI5010。
Widget Confirm {
+ UIButton { OnClick -> HandleConfrm }
}怎么改:修正函数名,或者在 Blueprint 里加上这个函数。
DUI6005
错误枚举名EventHandlerSignatureMismatch
一个参数与事件发出的参数不一致的处理函数。
怎么会出现:函数找到了,但它的参数不是事件发出的那些(个数或类型不对)。
怎么改:让函数的参数与事件的签名一致,或者换一个签名匹配的函数。
DUI6006
错误枚举名EachSourceNotFound
一个类里既没有同名函数、也没有同名变量的循环来源。
怎么会出现:in GetOptions() 需要这个类上有一个同名的无参函数,in Options 需要一个同名的数组变量。来源在这次编译正在构建的类上,所以这个检查在编译阶段做。
VerticalBox Options {
for Option in GetOptions() {
Text { Text <- Option.Label }
}
}怎么改:在 Blueprint 里声明这个函数或变量,或者修正名字。
DUI6007
错误枚举名EachSourceNotObjectArray
一个提供的不是对象数组的循环来源。
怎么会出现:来源存在,但它给出的不是对象数组。每一项的绑定通过反射读 Item.Member,元素必须有成员可读:TArray<UMyRow*> 可以,TArray<FMyRow> 和 TArray<int32> 不行。名字是对的,错的是类型,所以它不是 DUI6006。
怎么改:让来源返回对象数组,比如把每一行做成一个 UObject 子类。
DUI6008
错误枚举名PropTypeUnknown
一个没有对应 Blueprint 引脚类型的 props 或 events 类型。
怎么会出现:属性和事件参数的类型只能是 Text、String、Number、Integer、Bool、Color、Vector2、Asset、Class,或者 Enum 加枚举路径。拼错的类型名、Enum 后面没有路径、路径上没有枚举、枚举不是 BlueprintType,都报这个码。
props {
Float Speed = 1
}
Widget Root { }怎么改:换成上面列出的类型(这里是 Number);枚举要可以作为 Blueprint 类型使用。
DUI6009
错误枚举名PropNameTaken
一个已经被另一个类型不同的成员占用、或者与某个控件 id 相同的 props 名字。
怎么会出现:每个属性会变成类的一个变量,名字不能已经被占用:一个控件 id(每个控件都有同名的类变量)、一个资源条目、这个 Blueprint 自己声明的成员、父类的函数。C++ 父类上有同名同类型的属性时会直接用它,类型不同则报这个码。
props {
Text Title
}
VerticalBox Root {
Text Title { Text <- Title }
}怎么改:给其中一个改名;想用父类的属性,就按它的类型声明。
DUI6010
错误枚举名EmitUnknownEvent
一个 emit Name,而这个文件没有声明这个事件。
怎么会出现:emit 只能引发它自己文件的 events 块里声明的事件;块里没有这个名字,或者文件根本没有 events 块。
events {
Picked(Number Index)
}
Widget Row {
+ UIButton { OnClick -> emit Pickd(0) }
}怎么改:修正事件名,或者在 events 块里声明它。
DUI6011
错误枚举名EmitArgumentMismatch
一个实参与事件参数不一致的 emit。
怎么会出现:emit Name(…) 的实参个数要等于事件声明的参数个数,每个实参的类型也要能作为对应参数的类型。
events {
Picked(Number Index)
}
Widget Row {
+ UIButton { OnClick -> emit Picked() }
}怎么改:按事件的声明传实参,比如 emit Picked(ValueIndex)。
DUI6012
错误枚举名EmitRouteUnsupported
一个无法生成处理函数的 emit:在循环体里,或者事件的参数 Blueprint 无法承载。
怎么会出现:-> emit 会被编译成一个生成的处理函数。for / each 循环体里的控件是循环的副本而不是类的成员,那里放不下这样的函数;路由所在的事件如果发出的参数 Blueprint 函数接不住(比如一个 Blueprint 没有对应引脚的 FDreamUIEventDelegate),也生成不了。这里直接报出来,而不是让路由悄悄消失。
events {
Picked(Number Index)
}
VerticalBox Options {
for Option in GetOptions() {
Widget {
+ UIButton { OnClick -> emit Picked(0) }
}
}
}怎么改:把事件路由到类的一个函数,在那个函数里引发这个事件;或者换一个参数 Blueprint 能接住的事件。
DUI6013
错误枚举名PropDefaultInvalid
一个声明的类型容纳不了的 props 默认值。
怎么会出现:默认值要符合属性的类型:Text 和 String 是带引号的字符串,Integer 是整数,Bool 是 true 或 false,Color 是十六进制颜色,Vector2 是二元组,枚举要写它声明过的值,资产要真的存在,@Name 要指向一个资源条目。默认值被丢弃,否则这个变量会让读它的每个绑定和每一行宿主代码都失败。
props {
Integer Count = 1.5
}
Widget Root { }怎么改:按类型改正默认值,比如 Integer Count = 1。
DUI6014
错误枚举名EventNameTaken
一个已经被类的另一个成员占用的 events 名字。
怎么会出现:每个事件会变成一个事件分发器,名字不能已经属于:一个属性、一个控件、一个资源、这个 Blueprint 自己的变量或函数,或者父类上一个不是同参数分发器的成员。父类上同名同参数的分发器会直接拿来用。
events {
Title
}
VerticalBox Root {
Text Title { Text = "Settings" }
}怎么改:给事件或另一个成员改名。