Skip to main content

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

总所周知,按钮只能通过SendCustomEvent方法向UdonBahviour发送事件,但是在很多场景下我们其实需要按钮携带一定的参数,最简单的莫过于我们需要一堆相同性质的按钮的ID编号,来确定到第是哪个按钮触发了事件。还在傻乎乎给每一个按钮配一个Udon脚本来实现传参?邪修教你用Toggle替代Button来实现按钮传参

我个人选择的一个方案是,用Toggle和Udon代码结合,通过在触发Toggle的时候遍历所有Toggle的IsOn属性,此时改Toggle在数组中的位置就是其携带的参数。我们可以通过继续创建一个于Toggle等位的数组并使用Toggle在数组中的位置作为索引获取携带的参数,或者是通过Toggle.name之类的方法,实现按钮携带参数的实践众所周知,在 VRChat 的 Udon 开发中,按钮默认只能通过 SendCustomEvent 方法向 UdonBehaviour 发送无参事件。但实际开发中,我们常需按钮携带参数 —— 最典型的场景就是 “批量相同功能的按钮”(如道具选择、场景切换按钮),需要通过参数(如按钮 ID)确定具体是哪个按钮触发了事件。

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

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

1、降低管理难度

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

2、降低Udon虚拟机数量

常规的做法上需要我们为每一个按钮都安排一个Udon脚本进行转发参数或者在主脚本中添加单一独立的Public事件,让每一个按钮在脚本中都有对应的Public方法,才能实现按键传参的效果。本方案无需为每个按钮单独配备 Udon 脚本,能显著减少 Udon 脚本的总数量,进而降低 Udon 虚拟机的占用量。

我们这个方法可以通过可接受的性能消耗下,解决这个问题。且后期如果需要继续增加数量也只需要继续扩展数组,无需更加复杂的操作。极度方便复制粘贴人士。

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

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

2:降低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();
  
  }