简单画笔系统由两个程序组成——一个用于画笔,一个用于每条将要绘制的线条。
画笔和线条如何协同工作
画笔
画笔具有 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 数据对所有人都是最新的。