UE5.8 Chooser 喂饭级专题

UE5.8 Chooser 专题(五):Result、Fallback、多结果和对象/类/资产选择

讲清 ObjectResult、ClassResult、NoPrimaryResult、ObjectChooserBase、Asset/Class 结果、Nested Chooser、FallbackResult、EvaluateChooserMulti 和 IterateChooser。

总览

列只是把候选行筛出来。真正返回给项目的是每行的 Result。UE5.8 里 Result 基于 FObjectChooserBase,可以返回 UObject、软对象、类、嵌套 Chooser、多结果,或者不返回主结果只写输出参数。

UE5.8 Chooser 专题(五):Result、Fallback、多结果和对象/类/资产选择 配图
列决定哪一行通过,Result 决定这一行最终返回什么;Fallback 决定异常上下文怎么收尾。

Result Type 怎么选

UChooserSignature 里有三种 Result Type:

类型用途
Object Of Type返回某类 UObject 实例或资产,比如 Montage、DataAsset、CameraRig
SubClass Of返回某个 UClass,比如 Ability Class、Actor Class、Widget Class
NoPrimaryResult不关心主返回值,只通过 Output 列写参数

技能连招常见两种做法:

  1. Result 返回 TSubclassOf<UGameplayAbility>,输出列写动画和表现参数。
  2. Result 返回 UComboMoveData,数据资产里包含 Ability、Montage、Cue、说明和图标。

第二种更适合玩家编辑连招,因为 UI 可以显示同一个 MoveData 的名字、图标、描述和限制条件。

FallbackResult 必须认真填

FallbackResult 是“没有任何行成功时怎么办”。技能连招里可以:

  • 返回 GA_DefaultLightAttack
  • 返回空,然后 UI 播放失败提示。
  • 返回一个 UComboMoveData,里面标记为 Invalid
  • 只写 Output,例如 FailureReason=OutOfRange

不要把 Fallback 留空然后假设永远会命中。玩家配置、版本升级、网络延迟、目标消失、Tag 不同步,都会让上下文出现你没想到的组合。

多结果什么时候用

EvaluateChooserMultiChooseMulti 会返回所有符合条件的结果,直到回调停止。适合:

  • 掉落候选列表,再由外部抽取。
  • 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 只存 MoveTagMoveId。战斗中真正按键时,再用单结果 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 提供 ChooseObjectChooseMulti、软对象版本和 IterateObjectsUChooserTableFallbackResult;运行时如果没有行成功,会执行 Fallback 并触发输出列的 fallback/default 写入。FEvaluateChooserFNestedChooser 都是 FObjectChooserBase 实现。

源码路径索引

  • Engine/Plugins/Chooser/Source/Chooser/Public/ChooserSignature.h
  • Engine/Plugins/Chooser/Source/Chooser/Public/IObjectChooser.h
  • Engine/Plugins/Chooser/Source/Chooser/Public/Chooser.h
  • Engine/Plugins/Chooser/Source/Chooser/Internal/ObjectChooser_Asset.h
  • Engine/Plugins/Chooser/Source/Chooser/Internal/ObjectChooser_Class.h
  • Engine/Plugins/Chooser/Source/Chooser/Internal/OutputObjectColumn.h
  • Engine/Plugins/Chooser/Source/Chooser/Private/Chooser.cpp