你自己的拾取
不用 VRChat 的拾取,改用任何拾取系统握持笔,只需三个调用,在每个平台上照样书写。
笔和板擦都不一定要用 VRChat 的拾取。holding 字段决定由什么来握持:
holding |
由什么握持 |
|---|---|
VrcPickup |
同一物体上的 VRCPickup:拾起即握持,Use 书写,桌面的 R 和 VR 中握笔那只手的上方面键撤销。这是默认值 |
Custom |
你的代码。VRChat 的拾取事件会被忽略,所以 VRCPickup 留着或删掉都可以 |
三个调用
把 holding 设为 Custom 后,把你的系统已经知道的事告诉笔:
| 调用 | 时机 |
|---|---|
SetHeld(true) |
本地玩家拿起了它 |
SetUse(true) |
按下了 Use |
SetUse(false) |
松开了 Use |
Undo() |
想撤销最近一笔 |
SetHeld(false) |
放下了它 |
在握笔玩家的客户端上调用;其他客户端照常通过网络收到墨迹。SetHeld(true) 之前的按键不算数;如果拿起时 Use 已经按着,要先松开才会开始书写,所以抓起笔的那一下扳机不会顺带画出一笔。
书写位置仍由笔决定
握持交给你,墨迹去哪里仍由笔决定。在 VR 里它从 tip 书写,所以像你的拾取本来就会做的那样,让笔物体跟着手移动。在桌面和手机上它从玩家的视角书写,你的拾取完全不用去瞄准;如果你的拾取把笔拿在手里,把 desktopAim 设为 Tip,它就会像 VR 一样从 tip 书写。
适配器
大多数拾取系统都会发出事件。在笔旁边放一个小行为来转发:
public class PenGrip : UdoniteBehaviour
{
public Pen pen;
public void OnGrabbed() => pen.SetHeld(true);
public void OnReleased() => pen.SetHeld(false);
public void OnUseDown() => pen.SetUse(true);
public void OnUseUp() => pen.SetUse(false);
public void OnAlternate() => pen.Undo();
}
把这些接到你系统的事件上,把笔的 holding 设为 Custom,其余一切不变:墨迹样式、白板、擦除,以及后来加入的玩家看到的墨迹都照常工作。