多人协作 (Professional, 已弃用)

已弃用 — 正在迁移到 realvirtual WEB。 基于 Unity 的多人协作 (Netcode for GameObjects / Unity Relay) 已弃用。实时多用户协作现在通过 realvirtual WEB 中基于浏览器的 MultiplayerWEB 中继运行:共享虚拟形象、相机位置和实时机器状态,跨 Unity 和任何浏览器客户端,无需网络设置和端口转发。

ℹ️

多人协作功能仅在 Professional 版本中可用,需要 Unity Netcode for GameObjects 和 Unity Services。

实时协作工业自动化仿真,支持多用户和 VR/AR 集成。

概述

realvirtual Professional 多人协作系统支持多个用户同时与相同的虚拟调试场景交互。基于 Unity Netcode for GameObjectsUnity Relay Service 构建,提供同步的自动化组件、实时物料流和协作设计评审能力。

核心功能

  • 多用户协作:同一仿真中可扩展的并发用户
  • 实时同步:所有自动化组件(驱动、传感器、MU、Source)跨客户端同步
  • VR/AR 支持:完整的 XR 控制器跟踪和虚拟形象表示
  • 工业集成:PLC 信号同步和自动化逻辑共享
  • 云端连接:使用 Unity Relay Service 进行安全的点对点连接

系统要求

Unity 包

设置

1. Unity Services 配置

  1. 在 Project Settings → Services 中启用 Unity Services
  2. 创建 Unity Project ID 或链接到现有项目
  3. 在 Unity Dashboard → Multiplayer → Relay 中启用 Relay Service
  4. 为匿名用户会话启用 Authentication

2. 场景设置

  1. 从 realvirtual Professional 包中将 Multiplayer 预制体添加到场景
    • 该预制体包含所有必要的组件:NetworkManager、RelayConnectionManager、NetworkInitializer 和 MultiuserWindow
    • 所有网络预制体已预配置并自动注册
    • NetworkManager 配置,显示 Unity Transport 设置、中继连接管理器和网络预制体注册

3. 自动化组件设置

系统自动创建以下组件的网络化版本:

  • 驱动:位置和速度同步
  • 传感器:占用状态同步
  • MU(可移动单元):变换和标识同步
  • Source:物料生成事件
  • 信号:PLC 信号值和状态

使用方法

启动主机会话

  1. 通过 realvirtual → UI 工具栏打开 Multiuser 窗口
  2. 输入玩家名称(本地存储)
  3. 点击"Host"创建会话
  4. 与其他用户分享加入代码

作为客户端加入

  1. 打开 Multiuser 窗口
  2. 输入玩家名称
  3. 输入从主机收到的加入代码
  4. 点击"Client"加入会话
Multiuser 窗口,显示 Code 输入字段、Name 字段以及带状态显示的 Host/Client 连接按钮

连接状态

  • Connected:已成功连接到多人协作会话
  • No Connection:未连接或连接失败

同步组件

NetworkDrive

  • 位置值:当前驱动位置
  • 速度值:当前驱动速度
  • 权限:主机控制驱动,客户端接收更新
  • 覆盖模式:客户端使用 PositionOverwrite 和 SpeedOverwrite

NetworkMU(可移动单元)

  • 变换:位置和旋转
  • 标识:LocalID、GlobalID、Name
  • 物理:主机维护物理权威,客户端使用运动学模式
  • Source 跟踪:对创建 Source 组件的引用
⚠️

客户端机器上的物理对象必须设置为运动学 (kinematic) 模式,以防止与主机的权威物理仿真冲突。

NetworkSensor

  • 占用状态:布尔占用/空闲状态
  • 网络模式:客户端自动切换到网络控制模式
  • 实时更新:即时的传感器状态传播

NetworkSignal

  • 信号值:所有 PLC 信号类型 (PLCInputBool, PLCOutputFloat 等)
  • 双向:主机到客户端的信号同步
  • 基于字符串:通用值表示

NetworkPlayer

  • 玩家名称:持久化的玩家标识
  • XR 控制器:左右控制器的位置/旋转同步
  • 虚拟形象可见性:第一人称视角(自己的虚拟形象隐藏)
  • 相机跟踪:远程用户视角同步

VR/AR 集成

XR 设置

  1. 安装 XR Interaction Toolkit
  2. 配置 XR 控制器为 "LeftController" 和 "RightController" 组
  3. 在 realvirtual-XR 包中启用 XR 支持
  4. 在多人协作会话前测试控制器跟踪

支持的 VR 系统

  • Meta Quest 2/3:已与 Touch 控制器完全测试
  • 其他 OpenXR 设备:通过 Unity XR 系统兼容
  • 混合现实:VR 用户与桌面用户混合使用

性能注意事项

网络优化

  • 变化检测:仅在值发生变化时同步数据
  • 更新频率:FixedUpdate (50Hz) 确保平滑同步
  • 插值:客户端控制器平滑移动
  • 权威模型:主机维护物理,客户端仅显示

最佳实践

  • 监控同时 MU 数量:高 MU 数量可能影响网络性能,具体取决于带宽
  • 使用适当的更新速率:平衡响应性和带宽(默认 50Hz)
  • 测试网络条件:在真实网络延迟下验证性能
  • 监控连接质量:使用 Unity Profiler 进行网络分析
  • Unity Transport 配置:使用默认设置以获得最佳 Relay 性能

故障排除

连接问题

  • Unity Services 认证:验证 Project Settings → Services 中是否启用了匿名认证
  • Relay 分配:检查 Unity Dashboard 中的 Relay 服务状态和 CCU 限制
  • 防火墙设置:确保允许 UDP 流量(Unity Transport 使用 UDP)
  • 加入代码有效性:加入代码在超时后过期(通常 10 分钟)
  • 包安装:验证 Unity Netcode for GameObjects 是否正确安装
ℹ️

使用 Unity Profiler → Networking 标签页监控多人协作会话期间的连接质量和带宽使用。详见 Unity Netcode Profiler 文档 进行详细分析。

同步问题

  • 网络预制体:验证所有自动化组件是否有对应的网络预制体
  • 场景路径解析:检查 GameObject 层级在客户端之间是否匹配
  • 权限冲突:确保仅主机修改权威数据
  • 物理冲突:验证客户端 MU 使用运动学刚体

性能问题

  • 带宽使用:在 Unity Profiler 中监控网络流量
  • 更新频率:如有需要,降低 FixedUpdate 速率
  • 对象数量:限制同步对象的数量
  • 连接稳定性:在真实网络条件下测试

API 集成

自定义组件同步

要同步自定义自动化组件:


public class CustomNetworkComponent : NetworkBehaviour
{
    [SerializeField] private NetworkVariable<float> customValue = new NetworkVariable<float>();
    
    public override void OnNetworkSpawn()
    {
        if (IsHost)
        {
            // 初始化主机控制的值
            customValue.Value = GetComponentValue();
        }
    }
    
    private void FixedUpdate()
    {
        if (IsHost)
        {
            // 值变化时更新网络变量
            float newValue = GetComponentValue();
            if (Math.Abs(customValue.Value - newValue) > 0.001f)
            {
                customValue.Value = newValue;
            }
        }
        else
        {
            // 在客户端应用接收到的值
            ApplyNetworkValue(customValue.Value);
        }
    }
}

另请参见