你自己的拾取

不用 VRChat 的拾取,改用任何拾取系统握持笔,只需三个调用,在每个平台上照样书写。

更新于 2026-10-22

笔和板擦都不一定要用 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,其余一切不变:墨迹样式、白板、擦除,以及后来加入的玩家看到的墨迹都照常工作。

出了点问题 重新加载