特殊操作
CyanTrigger 使用一系列特殊操作来控制逻辑流程和执行顺序。这些操作借鉴了其他编程语言的概念,初学者可能需要额外的时间理解。本文将详细解释这些特殊操作及其用法。
块 (Block)
Block 操作用于组织操作单元,提高代码可读性和可维护性。您可以将多个操作拖拽到 Block 中,这些操作将按照顺序执行。Block 可以最小化,隐藏其内部操作。在 Block 中声明的局部变量仅在该 Block 内有效。Block 支持嵌套,类似于编程语言中的大括号 {}
,定义代码作用域。
(图示:BlockExample 和 CollapsedBlockExample)
条件语句 (Condition)
Condition 操作是一种特殊的 Block 操作,它总是与 ConditionBody 操作配对出现。Condition 操作本身不能直接创建,而是由其他特殊操作(例如 If
、Else If
、While
)生成。
Condition 操作的主要功能是定义一个局部布尔变量,该变量可以在界面中重命名。Condition Block 中的操作将按顺序执行,最终将该布尔变量设置为 True
或 False
。必须对该布尔变量赋值,否则其值将默认为 False
。Condition Block 执行完毕后,将根据布尔变量的值决定是否执行后续的 ConditionBody:
False
: ConditionBody 将被跳过。True
: ConditionBody 将被执行。默认情况下,Condition Block 中的所有操作都会执行。为了优化性能,您可以使用ConditionPassIfTrue
和ConditionFailIfFalse
操作提前结束 Condition 的执行。
在这种情况下,条件变量命名为 “countZero”。嵌套操作将 condition 变量设置为等于 0 的 _count 的结果。(图示:ConditionExample)
ConditionPassIfTrue
ConditionPassIfTrue
是必须在 Condition 中使用的特殊操作。此操作用于实现条件短路 (Condition Short Circuiting),类似于编程语言中的逻辑或 (Conditional Or)。它接收一个布尔值作为输入:
False
: 后续 Condition 操作将继续执行。True
: Condition 中后续的操作将被跳过,Condition 的结果为True
,程序将直接执行 ConditionBody。ConditionPassIfTrue
尤其适用于构建复杂的条件检查,提高效率。如果条件的前半部分为True
,则无需再检查后半部分。
在此示例中,第一个操作将检查 value 变量是否小于 0。PassIfTrue 将检查结果。如果为 true,则条件已完成,它将直接跳转到 condition body。如果条件为 false,则 int.然后,将执行 GreaterThan 操作,并继续执行 Condition。(图示:PassIfTrueExample)
ConditionFailIfFalse
ConditionFailIfFalse
是必须在 Condition 中使用的特殊操作(Condition Short Circuiting),此操作也用于实现条件短路,类似于编程语言中的逻辑与 (Conditional And)。它接收一个布尔值作为输入:
False
: Condition 中后续的操作将被跳过,Condition 的结果为False
,ConditionBody 也将被跳过。True
: 后续 Condition 操作将继续执行。ConditionFailIfFalse
有助于避免错误,例如在检查游戏对象有效性后,避免对无效对象进行操作。
在示例中,检查游戏对象是否有效,然后检查它是否处于活动状态。如果没有 FailIfFalse,当游戏对象无效 (null) 时,GameObject.Get activeSelf 操作将引发错误,因为无法对无效的游戏对象执行该操作。FailIfFalse 会提前跳出条件,确保下一个动作不被执行,也不会使乌冬面程序崩溃。(图示:FailIfFalseExample)
条件体 (ConditionBody)
ConditionBody 操作总是紧跟在 Condition 操作之后,它是一个特殊的 Block 操作。根据 Condition 操作的结果,ConditionBody 中的操作可能被执行,也可能被跳过。有关更多详细信息,请参阅 Condition。
If 语句
If
操作用于创建 Condition 和 ConditionBody 操作,实现条件分支。
如您所见,If 操作同时包含一个 Condition 和一个 ConditionBody。在此示例中,当 “This GameObject” 处于活动状态时,Condition 将传递。如果条件通过,则 ConditionBody 将执行,并向 “DoTheThing” 发送自定义事件。(图示:IfExample)
Else 语句
Else
操作是一个特殊的 Block 操作,必须紧跟在 If
或 Else If
操作之后。当之前的 If
或 Else If
条件为 False
时,将执行 Else
块中的操作。
在此示例中,检查 AudioSource 是否正在播放。如果它正在播放,则停止。如果它没有播放,则告诉它播放。(图示:ElseExample)
Else If 语句
Else If
操作结合了 Else
和 If
的功能,实现多条件分支。当之前的 If
或 Else If
条件为 False
时,将检查 Else If
条件。Else If 操作将创建 Condition 和 ConditionBody 操作,就像 If 操作一样。
检查值是否为 0、1、2 或其他。(图示:ElseIfExample)
While 循环
While
操作用于创建 Condition 和 ConditionBody 操作,实现条件循环。条件会在每次迭代前进行评估。请注意,While
循环尝试在单帧内完成所有迭代,因此必须确保每次迭代的值都会发生变化,避免无限循环导致程序卡死。 如果需要每帧执行操作,请使用 Update 事件。
在此示例中,while 将循环遍历对象的每个转换父级,直到它到达根。(图示:WhileExample)
For 循环
For
循环类似于 While
循环,但它迭代一个数值范围,而不是依赖于 Condition 的结果。For
操作接受三个输入:
- Start: 循环起始值。
- End: 循环结束值(不包含)。
- Step: 每次迭代的增量值(可以为负数),但请确保 End 小于 Start!
For
循环还提供一个Index
变量,表示当前迭代次数。
在此示例中,有一个 int 数组,并且 for 循环用于迭代其中的每个元素。(图示:ForExample)
ForEach 循环
ForEach
操作是一个特殊操作,类似于 While 和 For 操作,因为它将循环访问项数组中的每个元素。ForEach 操作是 For 操作的扩展,但它会为您处理 start、end 和 step 值。ForEach 操作采用一个输入:
- Array - 遍历所有元素的数组 ForEach 操作在循环时还提供两个变量输出。这些变量可以是新变量或现有变量。这些值将在循环的每次迭代中更新。
- Index - 数组中的当前索引
- Value - 数组中当前索引的值。
Break 语句
Break 操作是一个特殊操作,必须在 Loop 操作的主体中使用。当前循环操作包括 While 操作和 For 操作。使用 Break 操作将停止 Loop 的所有执行,并移至之后的下一个操作。
该示例遍历一个整数数组,并检查哪个 1 等于特殊值。如果找到该值,则循环将跳出循环并执行 Event 中的其余操作。(图示:BreakExample)
Continue 语句
Continue 操作是一个特殊操作,必须在 Loop 操作的主体中使用。当前循环操作包括 While 操作和 For 操作。使用 Continue 操作将直接跳转到循环的 Condition 以查看它是否应继续循环。
该示例获取所有玩家并遍历每个玩家。Continue 操作在检查当前播放器是否有效时使用。如果它无效,我们不想对它执行操作,因此我们继续循环到下一个玩家。(图示:ContinueExample)
Return 语句
Return 操作是一项特殊操作,它将停止当前事件的所有执行。Return 操作可以在任何位置使用,但通常在 If 操作中使用,以了解事件何时应提前结束。
ReturnIfDisabled
ReturnIfDisabled
操作类似于 Return
操作,但它会根据游戏对象和 UdonBehaviour 的启用状态有条件地返回。如果游戏对象或 UdonBehaviour 被禁用,则该操作将提前结束事件执行。这模拟了 SDK2 事件的行为。建议将其作为第一个操作,但并非强制要求。
No Comments