Skip to main content

CyanTrigger 事件和操作

CyanTrigger 扩展了 Udon 的功能,提供了一些独特的事件和动作。部分功能与 Udon 的实现有所不同,详见“特殊动作”部分。

CyanTrigger.SendCustomEvent

此操作已在 0.4 版本中移除,建议使用 UdonBehaviour.SendCustomEvent 代替。

CyanTrigger 的 UdonBehaviour.SendCustomEvent 版本与其他对象的行为一致。当目标对象为自身(“This CyanTrigger”变量)时,将通过汇编跳转进行优化。未来版本可能增加参数等选项,目前尚不支持。

image.png

自定义事件 (Custom Event)

image.png

自定义事件是一种仅在调用 UdonBehaviour.SendCustomEvent 系列操作时执行的特殊事件类型,包括:

  • SendCustomEvent
  • SendCustomNetworkedEvent
  • SendCustomEventDelayedSeconds
  • SendCustomEventDelayedFrames
  • SendCustomEventBase

image.png

这些操作可在 CyanTrigger、其他 UdonBehaviour 以及动画事件和 UI 事件中使用。对于动画事件,CyanTrigger 或 UdonBehaviour 需与 Animator 位于同一游戏对象上。

image.png

image.png

建议使用 “This UdonBehaviour” 变量调用同一 CyanTrigger 上的自定义事件,该变量会在创建时自动填充。

强烈建议在每个事件名称前添加下划线(_)前缀。 这可以防止事件通过问题客户端进行网络调用。对于非本地广播事件(例如“发送给所有者”或“发送给所有人”),CyanTrigger 将在后台处理广播。

自定义事件参数

当自定义事件设置为本地广播且延迟为 0 时,可使用参数定义输入和输出变量,实现事件与调用操作之间的数据传递。 通过点击参数列表上的“+”号按钮添加参数,并选择参数类型。 您可以编辑参数的名称、输入/输出类型以及顺序。“输入”表示调用操作将信息传递给事件;“输出”表示事件将设置输出变量的值,返回给调用操作。

image.png

image.png

带参数的自定义事件必须具有唯一的事件名称。事件参数只能通过 SendCustomEvent 调用,不支持网络版本或延迟版本调用。修改事件名称、参数名称、参数输入/输出类型或参数顺序,将中断所有调用它的 SendCustomEvent 操作。

如果 SendCustomEvent 调用带参数的事件时,检查器无法识别可用事件,则需手动添加参数。确保参数类型、名称和输入类型正确,否则可能无法按预期工作。

image.png

后台使用 UdonBehaviour.SetProgramVariable 和 UdonBehaviour.GetProgramVariable 实现参数传递。Udon 本身不支持参数,仅 CyanTrigger 支持。CyanTrigger 不支持使用参数和返回值调用 UdonSharp 事件,但 UdonSharp 可以使用参数调用 CyanTrigger 事件。

如果 CyanTrigger 中定义的自定义事件包含参数,则其他 Udon 程序(UdonGraph 或 UdonSharp)调用此事件时,必须使用 UdonBehaviour.SetProgramVariable 手动设置参数。参数名称格式为:_arg_<parameter name>_<event name>

例如,自定义事件 “MyEvent” 包含参数 “MyVar”,则编译后的变量名为 _arg_MyVar_MyEvent。 UdonSharp 调用示例:

udon.SetProgramVariable("_arg_MyVar_MyEvent", value);
udon.SendCustomEvent("MyEvent");

OnVariableChanged 事件

当全局变量的值发生变化时触发,无论改变方式是通过操作设置值、远程 UdonBehaviour 或 CyanTrigger 使用 SetProgramVariable,还是通过网络同步。 更改变量后立即调用此事件。 事件中可以访问变量的旧值。

image.png

注意:不要在 OnVariableChanged 事件中设置变量的值,以免造成无限循环。 

处理同步变量更新时,不要依赖其他同步变量的值,因为同步变量的更新顺序是任意的。 如果需要依赖多个同步变量,请使用 OnDeserialization 并手动检查值是否更改。

参考 VRChat 官方 OnVariableChange 文档

OnTimer 事件

此事件复现了 SDK2 VRC_Trigger 中的操作,需要四个输入参数:

  • 重复
  • 启用时重置
  • 低时段
  • 高时段时间

image.png

OnTimer 提供了一种可取消的延迟机制。启用 GameObject 或 UdonBehaviour 后,将在低时段和高时段之间生成一个随机持续时间,等待该持续时间(以秒为单位)后触发操作。如果在此期间禁用 GameObject 或 UdonBehaviour,则不会触发操作。 “启用时重置”选项决定每次启用计时器是否重新生成随机持续时间。“重复”选项决定是否在触发后重复计时器。如果与“延迟(秒)”属性一起使用,则延迟将在计时器触发后发生,且无法取消。

OnTimer 使用 Update 事件,性能并非最优,但延迟可接受。同一 CyanTrigger 上的多个 OnTimer 事件,如果输入完全相同,将合并触发,而不是分别生成随机时间。

GameObject.SetComponentActive

复现了 SDK2 VRC_Trigger 中的操作,需要三个输入参数:

  • 游戏对象
  • 组件名称
  • 启用状态

image.png

此操作遍历列表中的每个游戏对象,查找指定名称的组件并设置其启用状态。如果列出了有效的游戏对象,则 Component Name 字段将提供游戏对象上可供选择的可用组件的列表。

此操作效率低于直接使用组件的 set enabled 属性。

image.png

GameObject.SetComponentActiveToggle

复现了 SDK2 VRC_Trigger 中的操作,需要两个输入参数:

  • 游戏对象
  • 组件名称

image.png

此操作遍历列表中的每个游戏对象,查找指定名称的组件并切换其启用状态。效率低于直接使用组件的 enabled 属性进行切换。如果列出了有效的游戏对象,则 Component Name 字段将提供游戏对象上可供选择的可用组件的列表。

通常,与直接使用组件的 get 和 set enabled 操作来执行您自己的切换相比,此操作的效率较低。尽管这将是更多的行动,并且需要了解变量。

image.png

String.GetNewLine

此操作返回一个换行符字符串。该字符串只是一个换行符。在 CyanTrigger 中,所有字符串输入都只是单行。这意味着您不能直接添加新行。要向要显示的文本添加新行,您需要使用此操作来获取新行字符并将字符串连接在一起。

image.png

注释

此操作不执行任何操作,用于在操作列表中添加注释。您可以通过右键单击操作并选择 “Edit Comment” 来添加评论。选中后,您还可以按 shift + enter 开始编辑或完成编辑注释。请注意,任何操作都可以有注释,但此注释操作是添加注释的专用方法,不会改变 CyanTrigger 在游戏中的工作方式。

image.png

ClearReplay

ClearReplay 操作允许您清除给定事件的任何重播信息,就像它从未触发过一样。有关更多信息,请参阅 Event Replay 部分。

image.png

Set Variable

使用常量值或其他变量的值设置变量值。支持所有 Udon 支持的数据类型。 Set 操作通常用于为给定类型创建新变量。通过为输出选择 “+New” 并指定名称创建一个新的局部变量

image.png

14. 类型 (Type)

某些操作使用 Type 作为输入,用于指定数据类型,常用于 GetComponent 操作。 大多数操作也提供字符串替代选项,使用类型名称代替类型本身。

image.png