Skip to main content

简单画笔系统由两个程序组成——一个用于画笔,一个用于每条将要绘制的线条。

画笔和线条如何协同工作

画笔​

画笔具有 VRCPickup 和 VRCObjectSync 组件,提供基本的拾取和同步功能。程序本身使用连续同步,因为这与此类组件配合良好。

线条​

每个线条对象都有自己的 LineRenderer 和手动同步程序,因为它不需要像画笔那样频繁更新。线条有一个 points 变量,是一个 Vector3 数组。这个变量是线条数据在实例中为所有人同步的主要方式。

开始绘制​

当有人使用画笔时,会在画笔上调用 OnPickupUseDown。这将导致程序中发生以下事情:

  • 从池中检索新线条并保存在变量中
  • 持有画笔的玩家成为线条的所有者
  • isDrawing 设置为 true
  • 线条重置为两个点,位置在笔尖处
  • 变量递增以跟踪接下来使用哪条线

持续绘制​

每帧在画笔上调用 Update 事件,并运行以下逻辑:

  • 如果 isDrawing 为 true,继续:
  • 如果画笔移动超过 minMoveDistance,继续:
  • 在 penTip 位置向 LineRenderer 添加一个新点
  • 通过比较 currentIndex 与 pointsPerUpdate 检查是否已排队足够的点来发送
  • 如果准备好更新数据,我们在目标线条的 UdonBehaviour 上调用 OnUpdate

当在线条上调用 OnUpdate 方法时,程序检索线条中点的当前位置,更新同步的 points 变量,并调用 RequestSerialization,这是手动同步的 UdonBehaviour 告诉 VRChat 发送排队数据的方式。此方法仅在线条的所有者上调用。其他所有人接收数据,然后调用其 OnDeserialization 方法。当此方法在线条上触发时,线条程序从 points 数组读取位置,并用它们更新自己线条中的位置。

绘制完成​

当用户释放使用按钮时,在画笔上调用 OnPickupUseUp 事件。该事件简单地将 isDrawing 设为 false,并在目标线条的 UdonBehaviour 上调用 OnFinish。这将再发送一次 OnUpdate 方法,确保 points 数据对所有人都是最新的。