Skip to main content

特殊操作

CyanTrigger 使用一系列特殊操作来控制逻辑流程和执行顺序。这些操作借鉴了其他编程语言的概念,初学者可能需要额外的时间理解。本文将详细解释这些特殊操作及其用法。

块 (Block)

Block 操作用于组织操作单元,提高代码可读性和可维护性。您可以将多个操作拖拽到 Block 中,这些操作将按照顺序执行。Block 可以最小化,隐藏其内部操作。在 Block 中声明的局部变量仅在该 Block 内有效。Block 支持嵌套,类似于编程语言中的大括号 {},定义代码作用域。

image.png

image.png

(图示:BlockExample 和 CollapsedBlockExample)

条件语句 (Condition)

Condition 操作是一种特殊的 Block 操作,它总是与 ConditionBody 操作配对出现。Condition 操作本身不能直接创建,而是由其他特殊操作(例如 IfElse IfWhile)生成。

Condition 操作的主要功能是定义一个局部布尔变量,该变量可以在界面中重命名。Condition Block 中的操作将按顺序执行,最终将该布尔变量设置为 True 或 False必须对该布尔变量赋值,否则其值将默认为 False。Condition Block 执行完毕后,将根据布尔变量的值决定是否执行后续的 ConditionBody:

  • False: ConditionBody 将被跳过。
  • True: ConditionBody 将被执行。默认情况下,Condition Block 中的所有操作都会执行。为了优化性能,您可以使用 ConditionPassIfTrue 和 ConditionFailIfFalse 操作提前结束 Condition 的执行。

image.png

在这种情况下,条件变量命名为 “countZero”。嵌套操作将 condition 变量设置为等于 0 的 _count 的结果。(图示:ConditionExample)

ConditionPassIfTrue

ConditionPassIfTrue 是必须在 Condition 中使用的特殊操作。此操作用于实现条件短路 (Condition Short Circuiting),类似于编程语言中的逻辑或 (Conditional Or)。它接收一个布尔值作为输入:

  • False: 后续 Condition 操作将继续执行。
  • True: Condition 中后续的操作将被跳过,Condition 的结果为 True,程序将直接执行 ConditionBody。ConditionPassIfTrue 尤其适用于构建复杂的条件检查,提高效率。如果条件的前半部分为 True,则无需再检查后半部分。

image.png

在此示例中,第一个操作将检查 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 有助于避免错误,例如在检查游戏对象有效性后,避免对无效对象进行操作。

image.png

在示例中,检查游戏对象是否有效,然后检查它是否处于活动状态。如果没有 FailIfFalse,当游戏对象无效 (null) 时,GameObject.Get activeSelf 操作将引发错误,因为无法对无效的游戏对象执行该操作。FailIfFalse 会提前跳出条件,确保下一个动作不被执行,也不会使乌冬面程序崩溃。(图示:FailIfFalseExample)

条件体 (ConditionBody)

ConditionBody 操作总是紧跟在 Condition 操作之后,它是一个特殊的 Block 操作。根据 Condition 操作的结果,ConditionBody 中的操作可能被执行,也可能被跳过。有关更多详细信息,请参阅 Condition

If 语句

If 操作用于创建 ConditionConditionBody 操作,实现条件分支。

image.png

如您所见,If 操作同时包含一个 Condition 和一个 ConditionBody。在此示例中,当 “This GameObject” 处于活动状态时,Condition 将传递。如果条件通过,则 ConditionBody 将执行,并向 “DoTheThing” 发送自定义事件。(图示:IfExample)

Else 语句

Else 操作是一个特殊的 Block 操作,必须紧跟在 If 或 Else If 操作之后。当之前的 If 或 Else If 条件为 False 时,将执行 Else 块中的操作。

image.png

在此示例中,检查 AudioSource 是否正在播放。如果它正在播放,则停止。如果它没有播放,则告诉它播放。(图示:ElseExample)

Else If 语句

Else If 操作结合了 Else 和 If 的功能,实现多条件分支。当之前的 If 或 Else If 条件为 False 时,将检查 Else If 条件。Else If 操作将创建 Condition 和 ConditionBody 操作,就像 If 操作一样。

image.png

检查值是否为 0、1、2 或其他。(图示:ElseIfExample)

While 循环

While 操作用于创建 Condition 和 ConditionBody 操作,实现条件循环。条件会在每次迭代前进行评估。请注意,While 循环尝试在单帧内完成所有迭代,因此必须确保每次迭代的值都会发生变化,避免无限循环导致程序卡死。 如果需要每帧执行操作,请使用 Update 事件。

image.png

在此示例中,while 将循环遍历对象的每个转换父级,直到它到达根。(图示:WhileExample)

For 循环

For 循环类似于 While 循环,但它迭代一个数值范围,而不是依赖于 Condition 的结果。For 操作接受三个输入:

  • Start: 循环起始值。
  • End: 循环结束值(不包含)。
  • Step: 每次迭代的增量值(可以为负数),但请确保 End 小于 Start!For 循环还提供一个 Index 变量,表示当前迭代次数。

image.png

在此示例中,有一个 int 数组,并且 for 循环用于迭代其中的每个元素。(图示:ForExample)

ForEach 循环

ForEach 操作是一个特殊操作,类似于 While 和 For 操作,因为它将循环访问项数组中的每个元素。ForEach 操作是 For 操作的扩展,但它会为您处理 start、end 和 step 值。ForEach 操作采用一个输入:

  • Array - 遍历所有元素的数组 ForEach 操作在循环时还提供两个变量输出。这些变量可以是新变量或现有变量。这些值将在循环的每次迭代中更新。
  • Index - 数组中的当前索引
  • Value - 数组中当前索引的值。

image.png

Break 语句

Break 操作是一个特殊操作,必须在 Loop 操作的主体中使用。当前循环操作包括 While 操作和 For 操作。使用 Break 操作将停止 Loop 的所有执行,并移至之后的下一个操作。

image.png

该示例遍历一个整数数组,并检查哪个 1 等于特殊值。如果找到该值,则循环将跳出循环并执行 Event 中的其余操作。(图示:BreakExample)

Continue 语句

Continue 操作是一个特殊操作,必须在 Loop 操作的主体中使用。当前循环操作包括 While 操作和 For 操作。使用 Continue 操作将直接跳转到循环的 Condition 以查看它是否应继续循环。

image.png

该示例获取所有玩家并遍历每个玩家。Continue 操作在检查当前播放器是否有效时使用。如果它无效,我们不想对它执行操作,因此我们继续循环到下一个玩家。(图示:ContinueExample)

Return 语句

Return 操作是一项特殊操作,它将停止当前事件的所有执行。Return 操作可以在任何位置使用,但通常在 If 操作中使用,以了解事件何时应提前结束。

image.png

ReturnIfDisabled

ReturnIfDisabled 操作类似于 Return 操作,但它会根据游戏对象和 UdonBehaviour 的启用状态有条件地返回。如果游戏对象或 UdonBehaviour 被禁用,则该操作将提前结束事件执行。这模拟了 SDK2 事件的行为。建议将其作为第一个操作,但并非强制要求。

image.png