总览
列只是把候选行筛出来。真正返回给项目的是每行的 Result。UE5.8 里 Result 基于 FObjectChooserBase,可以返回 UObject、软对象、类、嵌套 Chooser、多结果,或者不返回主结果只写输出参数。
Result Type 怎么选
UChooserSignature 里有三种 Result Type:
| 类型 | 用途 |
|---|---|
| Object Of Type | 返回某类 UObject 实例或资产,比如 Montage、DataAsset、CameraRig |
| SubClass Of | 返回某个 UClass,比如 Ability Class、Actor Class、Widget Class |
| NoPrimaryResult | 不关心主返回值,只通过 Output 列写参数 |
技能连招常见两种做法:
- Result 返回
TSubclassOf<UGameplayAbility>,输出列写动画和表现参数。 - Result 返回
UComboMoveData,数据资产里包含 Ability、Montage、Cue、说明和图标。
第二种更适合玩家编辑连招,因为 UI 可以显示同一个 MoveData 的名字、图标、描述和限制条件。
FallbackResult 必须认真填
FallbackResult 是“没有任何行成功时怎么办”。技能连招里可以:
- 返回
GA_DefaultLightAttack。 - 返回空,然后 UI 播放失败提示。
- 返回一个
UComboMoveData,里面标记为Invalid。 - 只写 Output,例如
FailureReason=OutOfRange。
不要把 Fallback 留空然后假设永远会命中。玩家配置、版本升级、网络延迟、目标消失、Tag 不同步,都会让上下文出现你没想到的组合。
多结果什么时候用
EvaluateChooserMulti 或 ChooseMulti 会返回所有符合条件的结果,直到回调停止。适合:
- 掉落候选列表,再由外部抽取。
- UI 展示当前可用技能列表。
- AI 在多个可用动作里再按其它系统排序。
- 动画 Pose Search 先收集候选资产,再做姿态匹配。
技能连招常用单结果;玩家编辑 UI 常用多结果,例如列出“当前武器和已解锁状态下,可以放进轻攻击第二槽的所有 MoveData”。
NoPrimaryResult 的用法
如果你只想用表写参数,不想返回对象,可以设置 NoPrimaryResult,然后用 Output 列写 FComboChooserOutput。比如:
- 根据武器和连段,写 Montage Section、播放速度、消耗倍率。
- 根据目标距离,写相机强度和震屏强度。
- 根据角色状态,写 UI 提示文本 Key。
这类表更像“上下文到参数”的映射,比返回资产更轻。
Nested Chooser 和 Evaluate Chooser
FNestedChooser 引用同一个 Chooser 资产内部嵌入的子表;FEvaluateChooser 引用另一个 Chooser Table 资产。它们都实现 FObjectChooserBase,所以可以作为 Result 或 OutputObject 的值。
建议:
- 同一资产内部强相关的小分支,用 Nested Chooser。
- 多个系统共享的选择逻辑,用独立 Chooser + Evaluate Chooser。
- 不要嵌套太深,超过两层就要重新审视表拆分。
使用案例:玩家编辑 UI 的候选列表
玩家在 Common UI 面板里编辑“轻攻击第二段”。系统可以构造一个 Context:
InputTag = Input.Attack.Light
PreviousSkillTag = Skill.Combo.Light.01
WeaponTag = Weapon.Sword
PlayerTags = 已解锁技能、职业、天赋
然后用多结果收集所有合法 UComboMoveData,显示给玩家。玩家选择后,SaveGame 只存 MoveTag 或 MoveId。战斗中真正按键时,再用单结果 Chooser 选择并由 GAS 执行。
架构分析
Result 应该是项目后续系统容易消费的形态。GAS 更喜欢 Ability Class 或 MoveData;动画更喜欢 AnimationAsset 或 Montage;UI 更喜欢 DataAsset;模块化内容更喜欢 ProxyAsset。不要为了让 Chooser 表好填,返回一个执行系统很难理解的类型。
常见坑
- ClassResult 返回 UClass,但调用侧按普通 UObject 处理。
- Fallback 空着,线上遇到异常 Context 后直接静默失败。
- 多结果返回多个候选,但输出参数只读了最后一次写入。
- Nested Chooser 嵌套过深,调试时不知道哪张子表命中。
- Result 硬引用大量动画资产,导致打开表或加载包时变重。
源码依据
EObjectChooserResultType 定义 ObjectResult、ClassResult 和 NoPrimaryResult。FObjectChooserBase 提供 ChooseObject、ChooseMulti、软对象版本和 IterateObjects。UChooserTable 有 FallbackResult;运行时如果没有行成功,会执行 Fallback 并触发输出列的 fallback/default 写入。FEvaluateChooser 和 FNestedChooser 都是 FObjectChooserBase 实现。
源码路径索引
Engine/Plugins/Chooser/Source/Chooser/Public/ChooserSignature.hEngine/Plugins/Chooser/Source/Chooser/Public/IObjectChooser.hEngine/Plugins/Chooser/Source/Chooser/Public/Chooser.hEngine/Plugins/Chooser/Source/Chooser/Internal/ObjectChooser_Asset.hEngine/Plugins/Chooser/Source/Chooser/Internal/ObjectChooser_Class.hEngine/Plugins/Chooser/Source/Chooser/Internal/OutputObjectColumn.hEngine/Plugins/Chooser/Source/Chooser/Private/Chooser.cpp