基于Photon Engine PUN的Hololens 2多用户凝视数据获取方案咨询
Hololens 2 + Photon PUN 多用户独立凝视数据获取方案
你这个把MRTK组件绑定到User预制体的思路完全找对了方向——默认MRTK的InputSystem是全局单例,多用户场景下必须给每个用户分配独立的输入上下文,才能区分开各自的凝视数据。下面是具体的落地步骤和避坑建议:
一、重构User预制体的MRTK组件结构
- 复制一份默认的MRTK配置文件(比如
DefaultMixedRealityToolkitConfigurationProfile),命名为UserMRTKProfile,然后在配置的Input System板块,取消勾选"Auto Initialize Input System",避免全局初始化冲突 - 在User预制体的根节点添加
MixedRealityToolkit组件,绑定刚才的UserMRTKProfile,并把"Runtime Mode"改成Per User Instance - 把原场景里的Toolkit、SceneContent、Playspace直接拖成User预制体的子对象,确保每个用户实例有自己独立的空间锚定和输入上下文
- 在User预制体上写个自定义脚本
UserGazeSync,用来采集本地用户的凝视数据并同步到Photon网络
二、凝视数据的采集与同步实现
- 本地采集:在
UserGazeSync里,通过当前用户实例的MRTK上下文获取凝视数据(这里的CoreServices是当前用户专属的,不是全局的):private MixedRealityToolkit _userMRTK; private IEyeGazeProvider _userGazeProvider; void Start() { _userMRTK = GetComponent<MixedRealityToolkit>(); _userGazeProvider = _userMRTK.Services.InputSystem.EyeGazeProvider; } void Update() { if (_userGazeProvider.IsEyeTrackingEnabledAndValid) { var gazeOrigin = _userGazeProvider.GazeOrigin; var gazeDir = _userGazeProvider.GazeDirection; // 用Photon RPC同步给其他客户端 photonView.RPC("SyncRemoteGaze", RpcTarget.Others, gazeOrigin, gazeDir); } } - 网络同步:在RPC接收端更新对应User实例的凝视可视化(比如射线、光标):
[PunRPC] void SyncRemoteGaze(Vector3 origin, Vector3 direction) { // 这里写更新凝视射线/光标的逻辑,比如调整射线的起点和方向 UpdateGazeVisual(origin, direction); }
三、必须注意的坑
- 关掉全局MRTK:原场景里的全局
MixedRealityToolkit组件一定要禁用,不然会和用户的独立实例抢资源 - 空间坐标对齐:给User预制体的Playspace加个
PhotonTransformView,同步头部位置,不然其他用户看到的凝视数据空间坐标会错位 - 性能控制:别每帧都发凝视数据,加个定时器(比如每0.1秒发一次),而且只在眼动追踪有效时才发送,避免占太多带宽
- 权限要加:Hololens 2上必须在
Package.appxmanifest里申请Gaze Input权限,不然眼动追踪根本用不了
内容的提问来源于stack exchange,提问作者Daniel Delgado
相关产品推荐
相关产品推荐

