Skip to main content

一、用 Toggle 替代 Button 来实现按钮传参

还在傻乎乎给每一个按钮配一个Udon脚本来实现传参?邪修教你用Toggle替代Button来实现按钮传参

众所周知,在 VRChat 的 Udon 开发中,按钮默认只能通过 SendCustomEvent 方法向 UdonBehaviour 发送无参事件。但实际开发中,我们常需按钮携带参数 —— 最典型的场景就是 “批量相同功能的按钮”(如道具选择、场景切换按钮),需要通过参数(如按钮 ID)确定具体是哪个按钮触发了事件。

我个人选择的方案是,结合 Toggle 组件与 Udon 代码:在 Toggle 被触发时,遍历所有 Toggle 的 IsOn 属性,此时该 Toggle 在数组中的位置就是其携带的基础参数。若需更复杂的参数,我们可额外创建一个与 Toggle 数组索引对应的参数数组,以 Toggle 在数组中的位置为索引获取参数;也可通过解析 Toggle.name(如在名称中嵌入 ID 或标识),实现按钮携带参数的需求。

使用这个方案会有以下的优点:

1、降低管理难度

常规做法需要为每一个按钮挂载独立的 Udon 脚本转发参数,或在主脚本中添加多个独立的 Public 事件与对应方法,才能实现按钮传参。这个方法能在可接受的性能消耗下解决该问题,后期若需增加按钮数量,只需扩展数组即可,无需复杂操作,对需要批量复制按钮的场景格外友好。

2、降低Udon虚拟机数量

本方案无需为每个按钮单独配备 Udon 脚本,能显著减少 Udon 脚本的总数量,进而降低 Udon 虚拟机的占用量。

使用这个方法需要注意以下几点:

  1. 若场景中 Toggle 数量过多,仍会出现管理困难的问题,可通过按功能分区(如将按钮分为 “场景切换组”“道具选择组”)的方式解决。
  2. 性能损耗会随 Toggle 数量增加而上升,实际使用时需关注性能损耗,可通过额外脚本按功能分区,实现性能与便捷性的平衡。

以下为示例代码:

//第0事件——初始化
public Toggle[] Toggles;
private start()
  {
  for (int i = 0; i < Toggles.Length; i++)
            {
                Toggles[i].SetIsOnWithoutNotify(false);
            }
  }

  //计算是哪个按钮被按下
private int CheackToggleIndex()
  {
  int ToggleIndex = 0;
  for (int i = 0; i < DishesToggle.Length; i++)
            {
                if (DishesToggle[i].isOn)
                {
                    ToggleIndex = i;
                    Toggles[i].SetIsOnWithoutNotify(false);
                  break;
                }
            }
  }

  //按钮触发
public void OnToggleUse()
  {
  int ToggleIndex = CheackToggleIndex();
  
  }