跳到主要内容

配置并验证可视化条件树

TinyGiants
Unity Games & Tools Developer

先在 Action Condition 中比较事件伤害和阈值,让重击达到阈值时才播放受击动画,如果动作还受目标状态影响,把这些限制加入同一条件组,再在 Play Mode 分别验证通过和不通过的情况

配置条件树​

打开事件的 Game Event Behavior,在 Action Condition 勾选 Enable Conditions,点击 + Condition 添加比较,或用 + Group 将几项条件组合起来

条件树中的启用开关、分组和比较

AND 要求组内每项都成立,OR 在任一项成立后通过,组中可以继续添加子组,下面的结构要求目标是敌人、生命值低于一半,且这一击为暴击或火焰伤害

AND
├── TargetHealthRatio < 0.5
├── IsEnemy == true
└── OR
├── IsCritical == true
└── DamageType == Fire

在树中核对 OR 子组的缩进,两个伤害类型分支应位于同一组,生命值和阵营条件应留在外层 AND

AND 组内嵌 OR 组的条件树

事件窗口里的条件控制该事件的 Event Action 列表,Receiver Inspector 中的条件控制对应组件的回调,Flow Graph 连接上的条件则用于判断该连接是否执行

选择比较数据​

每个比较的两端各自选择数据来源,再按值类型选择运算符

比较节点提供的四种数据源

数据源读取内容
Event Argument当前事件参数,可沿成员路径选择字段或属性,带 Sender 的事件可从 Sender 或 Argument 开始
Scene Type当前保存的场景对象引用及其成员,适合读取角色生命值、难度或流程状态
Random从数值范围或配置的列表中取值
Constant固定值或用于 In List 的列表

将对象字段用于能在配置中引用的对象,若每次触发都来自不同运行时实例,可把所需字段放在事件参数中

随机触发​

将 Random 设为浮点范围 0 到 1,与 Constant 0.3 比较,使用 < 可得到约 30% 的通过概率

Random 数据源的范围输入

若条件还依赖固定类型或阈值,可继续在同一个 AND 组中添加比较

Constant 数据源的固定值输入

数值可使用 ==、!=、>、<、>= 和 <=,文本可使用 Contains、Starts With 或 Ends With,集合成员判断使用 In List,在 Inspector 中核对两端类型与可选运算符

在 Mono 和 IL2CPP 中验证​

Editor 与 Mono 路径可对未烘焙条件求值,部分路径会缓存编译后的表达式委托,场景成员读取、随机值和条件数量仍会影响运行成本

构建 IL2CPP Player 前,在 Game Event System > Tools & Utilities 中执行 Bake AOT Conditions,等待生成代码完成编译,修改场景、Prefab 或条件后重新烘焙

IL2CPP 中启用的条件缺少有效的生成记录时会输出错误并阻止对应条件通过,构建验证应同时触发通过和不通过的案例

将条件用到实际回调​

稀有掉落​

把敌人类型放入死亡事件参数,外层用 In List 匹配 Boss 或 Elite,再在 OR 子组中比较玩家幸运值和当前难度等级

AND
├── Event Argument: EnemyType In List [Boss, Elite]
└── OR
├── Scene Type: LuckModifier > 0.5
└── Scene Type: DifficultyRank >= 2

推进移动引导​

将当前步骤和完成状态放在引导组件,动作类型与持续时间由事件参数提供,将四项放在同一个 AND 组

AND
├── Scene Type: TutorialComplete == false
├── Scene Type: CurrentStep == Movement
├── Event Argument: ActionType == Move
└── Event Argument: Duration > 1.0

解锁计分成就​

两个成就监听同一计分事件,各自使用一个 Receiver,普通成就检查分数至少 10000 且自身未解锁,限时成就再检查计时器小于 300 秒,并使用自己的解锁状态

追加火焰伤害​

将事件参数、场景属性和随机值都放进 AND 组,火焰类型、低火抗、高难度和概率判定同时通过后,再执行绑定的火焰加成方法

AND
├── Event Argument: DamageType == Fire
├── Scene Type: FireResistance < 50
├── Scene Type: DifficultyRank >= 2
└── Random (0.0, 1.0) < 0.3

在随包的条件事件 Demo 中可用相同方法核对数据来源与分组结果

条件事件 Demo 中已经配置的条件树

查看条件树的配置和数据源