dwgx@blog:~$dwgx
> cd ../posts

在 VRChat 世界里操控真浏览器(VRCBrowserBridgeWorld)

// created

VRCBrowserBridgeWorld 是个在 VRChat 世界里操控真浏览器的实验。人站在 world 里对着一块屏幕点划、敲键盘, 另一头一台真浏览器跟着动, 画面再推回世界里, 相当于拿 VRChat 当远程桌面的输入端。

这仓库只是 world 端, 也就是 UdonSharp 这一半。真正驱动浏览器、把 RTSP 流推回来的外部网关不在这, 得单独跑。边界一开始就划清楚了: world 只负责把玩家操作变成事件发出去, 脏活全丢外面。

核心是一条自定义协议。每次交互序列化成一行 JSON, 打上 VRCBRIDGE 前缀写进日志, 外面网关 tail 日志加抓 Udon 同步变量, 就能把事件捞出去。事件长这样:

{"v":1,"sessionId":"demo","seq":1,"playerId":"1","playerName":"ExampleUser","source":"gateway","type":"pointer_down","x":0.5,"y":0.5,"button":"left"}

坐标 x/y 是归一化 UV, 0 到 1, 外面不用管屏幕在世界里多大、朝哪, 按比例往真实窗口一映射就行。事件类型基本全覆盖: 指针移动/按下/抬起、滚轮、文本、URL、按键、视口、流配置, 还有前进后退刷新。发事件都走 BridgeRouter, 拼 JSON、走 Udon 手动同步变量、顺手写日志。

VRChat 里没鼠标, 点屏幕靠射线做。BridgeInputSurface 从玩家头部打一条射线到那块四边形, 命中点换成 UV, 再按坐标发指针或滚轮——你头朝哪, 那点就是光标。指针移动加了节流, 不然一转头就一串 move 刷爆日志。上层 BridgeCommandButton 各映射一个动作, BridgeControlPanel 再封一层做成一键。视频回流走 AVPro RTSP, 默认指 rtsp://127.0.0.1:8554/browser

Udon 手搓场景太痛苦, 所以配了套编辑器工具挂在菜单 VRC Browser Bridge/ 下, 一键 Build Bridge Console 把材质、控制台屏幕、命令面板全生成好。UdonSharp 的 program asset 老出问题, 就加了个 Repair 一键修。另有两个测试项不进 world 也能验协议对不对。项目还很 WIP, 基于 Unity 2022.3.22f1 和 UdonSharp, 仓库里没放 license。