以非侵入方式理解玩家体验: 一种用于玩家体验评估的 VRChat 世界遥测组件 —— UdonTelemetry
引言
作为地图创作者,为了持续优化地图内容并提升玩家体验,获取玩家反馈是一项重要工作。常见的做法包括建立群聊、社区,或发放调查问卷,以收集玩家在游玩后的意见与建议。
但这类方式通常依赖创作者主动维护反馈渠道,或依赖玩家主动填写问卷、提交反馈。当地图拥有较大的玩家规模时,这往往会带来额外且持续增长的维护成本,也难以稳定获得足够全面的反馈信息。
基于这一问题,我开始探索一种更被动、也更高效的玩家体验评估方式。受到游戏运营中数据分析方法的启发,我认为,对玩家行为数据进行采集与分析,可以作为传统反馈渠道的重要补充。它能够在不干扰玩家正常游玩的前提下,为创作者提供与游玩体验相关的辅助信息。同时,即使面对大量玩家,也依然能够将整体工作量控制在合理范围内。
例如,通过观测玩家在世界中的停留分布,创作者可以直观地了解玩家对不同内容区域的关注程度,判断玩家行为是否符合原本的设计预期,并据此发现潜在问题,为后续的内容迭代与体验优化提供参考。
本组件围绕这一目标设计,提供了一种在 VRChat 世界中匿名发送遥测数据的能力,用于追踪玩家在世界中的活动情况,并进一步生成玩家分布热力图 (如图 1 所示),帮助创作者以更直观、更低侵入性的方式理解玩家行为。
![]() |
|---|
| 图 1: 玩家热力图,明度越高表示玩家在此停留时间越长,颜色越红表示玩家在此处聚集密度越高 |
- 演示世界: https://vrchat.com/home/world/wrld_c71234c8-819d-4c44-b07d-8dc96ef671d5/info
- 演示仪表盘: https://status-vrc-telemetry.xuan25.com
方法
本组件的核心功能基于 UdonSharp 程序实现,其主要思路是按照固定时间间隔采样玩家位置,并将遥测数据传输到指定的服务器端点,从而完成玩家活动数据的收集。
在世界制作阶段,创作者需要先在场景中选定一个矩形的遥测区域。该区域会被均匀划分为 256 × 256 个单元格,每个单元格对应一个独立的遥测数据点。所有数据点会进一步编码为遥测端点上的 65536 个 URL,并预先生成到一个 VRCUrl 数组中,以供运行时直接索引和发送请求。
当玩家进入世界后,系统会先向玩家展示相关说明,并允许玩家自主选择是否同意遥测。当玩家明确允许后,组件会按照预设时间间隔自动采集其在遥测区域内的平面位置坐标,并将该坐标量化到对应的单元格中。随后,程序会根据该单元格索引获取对应的 URL,并通过 VRCStringDownloader.LoadUrl 向该地址发送一次 GET HTTP 请求,以完成一次遥测数据上传。
当端点服务器接收到请求后,会通过解析 URL 中的参数获取玩家所在的单元格坐标以及遥测区域标签,并将这些信息记录到日志中。之后,这些日志会由可观测化工具链进一步处理,包括使用 Grafana Alloy 进行收集、使用 Grafana Loki 进行存储和检索,并最终通过 Grafana 进行可视化展示。基于这些数据,系统可以生成玩家分布热力图,帮助创作者更直观地理解玩家在世界中的活动情况,并为后续内容优化提供依据。
安装和部署
需求
如果你要使用第三方部署的遥测端点服务器,你需要准备:
- VRChat 世界制作工具 (Unity + VRChat SDK3 + UdonSharp)
- UdonTelemetry 组件包 (包含 UdonSharp 组件和示例场景)
如果你要自行部署遥测端点服务器,还需要准备:
- 一个可用的服务器环境,用于部署遥测端点服务器软件
- Grafana Alloy、Grafana Loki 和 Grafana 用于数据收集、存储、检索和可视化
- Docker 和 Docker Compose 用于构建和部署遥测端点服务器
- 基本的服务器部署和维护能力,包括但不限于部署反向代理、配置 TLS 证书、监控服务器状态等
- 遥测端点服务器源代码
上述部分资源可以在以下链接中找到:
- UdonSharp 组件源代码: https://github.com/xuan25/Xuan25-VRC-Common-Utilities/tree/main/UdonTelemetry
- 遥测端点服务器源代码: https://github.com/xuan25/vrc-telemetry-collector
安装和配置 UdonTelemetry 到 VRChat 世界
导入遥测组件
- 下载
Xuan25-VRC-Common-Utilities组件包,并将其导入到你的 Unity 项目中。该组件包包含UdonTelemetry组件以及一系列相关依赖组件。你可以使用 Git 将其clone到项目的 Packages 目录下,或者直接下载压缩包并将其解压到该目录中。 - 在 Unity 项目中,找到
Packages/Xuan25 Common Utilities/UdonTelemetry/Prefab目录下的UdonTelemetry.prefab预制件 (如图 所示),并将该预制件放入场景中。
![]() |
|---|
图 2: 预制件资产位置,找到 UdonTelemetry.prefab 并将其放入场景中 |
配置遥测组件
- 启用
UdonTelemetry/TelemetryPlayerPosition物件,以调整范围和采样间隔设置。你可以在场景中看到一个红色矩形框,表示遥测数据采集的范围 (如图 3 所示)。通过范围参数(X Range Meter, Z Range Meter)调整该矩形框的范围并调整其位置,以覆盖你希望采集玩家位置数据的区域。同时,你还可以设置采样间隔(Report Interval Seconds),即每隔多少秒采集一次玩家位置数据。 - 然后重新禁用
UdonTelemetry/TelemetryPlayerPosition物件。 - 移动
UdonTelemetry/TelemetryPrompt和UdonTelemetry/TelemetryPromptTiny物件到合适的位置,以确保玩家在进入世界后能够看到遥测说明提示,并能够方便地与之交互 (如图 4 所示)。TelemetryPrompt物件用于在玩家初次进入世界或从未选择过遥测选项时显示遥测说明提示,而TelemetryPromptTiny物件则用于在玩家选择过遥测选项后显示一个较小的提示,允许玩家随时修改他们的选择。 - 修改
UdonTelemetry/TelemetryPrompt和UdonTelemetry/TelemetryPromptTiny物件中的文本组件,以提供适合你世界的遥测说明内容。确保说明内容能够清晰地告知玩家将会收集哪些数据、这些数据将如何被使用,以及玩家可以如何选择是否同意遥测。在新版本中,这些文本组件已进行了国际化处理。因此,预设文本模板上的 数据所有者 和 数据处理者 可以通过文本组件上的
TextMeshProUGUILocale组件的Variable字段修改。如果文本的其他部分也需要修改,则需要修改对应的本地化资源文件(如en.po.txt)中的文本条目内容。
![]() |
![]() |
|---|---|
| 图 3: 采样范围编辑视图,红色矩形表示采样范围 | 图 4: 遥测说明视图,玩家可自主选择是否同意遥测 |
本地测试遥测功能 (可选)
如果你想在正式部署之前先进行本地测试,可以按照以下步骤操作:
- 使用 Git
clone或直接下载的方式,将遥测端点服务器源代码获取到本地。 - 进入到遥测端点服务器源代码目录,找到
compose.yml文件。根据你的需求修改该文件中的配置,例如调整服务器参数或调整OTLP追踪配置。 - 运行
docker compose up命令来构建并启动遥测端点服务器。默认情况下,服务器将会监听3000端口。 - 回到 Unity 项目中,运行场景并进入游戏模式。你应该能够看到遥测说明提示。当你同意遥测后,系统会开始采集你的位置信息,并将其发送到本地的遥测端点服务器。你可以通过查看服务器的日志来验证数据是否正确发送和接收。
替换遥测端点
- 在 Unity 项目中,找到
Packages/Xuan25 Common Utilities/UdonTelemetry/Prefab目录下的TelemetryEndpoint-localtest.prefab预制件,并基于它创建一个名为TelemetryEndpoint-<your-endpoint>的副本 (如图 5 所示),其中<your-endpoint>是你选择的遥测端点服务器地址的标识(例如TelemetryEndpoint-myserver)。将该预制件拖拽到你的场景中。 - 将场景中的
TelemetryEndpoint-<your-endpoint>放到UdonTelemetry/TelemetryPlayerPosition组件下,并删除TelemetryEndpoint-localtest预制件。之后,在UdonTelemetry/TelemetryPlayerPosition物件的Telemetry Endpoint字段中,选择你刚刚创建的遥测端点预制件 (如图 6 所示)。 - 打开
TelemetryEndpoint-<your-endpoint>预制件以进行编辑。在 Unity 工具栏中选择Tools -> Xuan25 -> UdonTelemetry -> Endpoint Setup,打开遥测端点设置窗口。在该窗口中,将目标选择为TelemetryEndpoint-<your-endpoint>物件,并填写你的遥测端点服务器前缀(例如https://myserver)和路径(例如myworld/heat)。点击Setup按钮以完成端点预制件的配置 (如图 7 所示)。
![]() |
|---|
| 图 5: 遥测端点副本,复制一个新的预制件用于替换本地测试预制件 |
![]() |
![]() |
|---|---|
图 6: 替换遥测端点预制件,将新的预制件放到 TelemetryPlayerPosition 组件下,并删除原有的本地测试预制件 |
图 7: 遥测端点设置窗口,填写你的遥测端点服务器地址并点击 Setup 来完成配置 |
部署遥测端点服务器 (如果你选择自行部署)
- 由于服务架构各不相同,请参考遥测端点服务器源代码目录中的示例配置文件,并根据你的服务器环境进行相应的调整和配置。确保服务器能够正确接收来自 VRChat 世界的遥测数据,并将这些数据存储到 Grafana Loki 中,以供后续分析和可视化。
- compose.yml: Docker Compose 配置文件,用于定义和运行遥测端点服务器的服务。
- Dockerfile: 用于构建遥测端点服务器 Docker 镜像的定义文件。
- config.toml: 遥测端点服务器的配置文件,用于定义服务器的行为和参数设置。
- grafana/config.alloy: Grafana Alloy 的配置文件示例,用于获取 Docker 服务的日志并将其推送到 Loki 日志数据库。
- grafana/dashboard.json: Grafana 仪表盘配置文件示例,用于展示玩家分布热力图。







No comments to display
No comments to display