You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Unreal Engine中实现Web Browser内容的网络同步?

实现服务器端Web Browser内容同步到客户端3D Widget的方案

核心逻辑

以服务器作为唯一的状态源,所有Web页面的变更操作都由服务器捕获并同步至客户端,客户端仅负责渲染同步过来的状态,不允许独立发起Web交互操作。

具体实现步骤

1. 服务器端状态捕获

  • 监听Web Browser的关键状态变更事件:
    • URL加载/跳转(如页面load、navigate事件)
    • 媒体控制操作(视频播放/暂停、进度调整、音量变更)
    • 页面视图变更(滚动位置、缩放比例)
    • 表单输入、按钮点击等交互操作
  • 将捕获到的状态序列化为可传输的结构化数据(如JSON),示例:
    {
      "type": "media_control",
      "payload": {
        "action": "play",
        "currentTime": 120.5,
        "url": "https://www.youtube.com/watch?v=example"
      },
      "timestamp": 1700000000
    }
    

2. 实时同步机制

  • 采用WebSocket或Socket.IO建立服务器与客户端的长连接,保证低延迟的状态推送
  • 服务器维护全局状态池,每次状态变更时,向所有在线客户端广播序列化后的状态数据
  • 客户端接收数据后,触发本地3D Widget中Web Browser的对应操作:
    • 收到load_url指令时,调用Web组件的LoadURL()方法加载目标地址
    • 收到media_control指令时,调用页面内媒体元素的play()/pause()方法或设置currentTime属性

3. 客户端渲染限制

  • 将客户端Web Browser设置为只读模式,禁用本地地址栏输入、右键菜单、独立交互按钮,强制所有操作必须由服务器同步触发
  • 根据3D引擎(如Unity、Unreal)的Web组件配置,开启iframe嵌入权限,确保YouTube等第三方内容能正常渲染

4. 异常与状态对齐处理

  • 新客户端加入时,服务器主动推送当前Web Browser的完整状态(包括当前URL、媒体进度、页面视图参数),让新客户端直接同步到最新状态
  • 客户端断连重连后,自动请求服务器最新状态,避免数据不一致
  • 增加状态校验逻辑,客户端定期上报当前本地状态,服务器对比后补发差异数据

示例代码片段(伪代码)

服务器端(Node.js + WebSocket)

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

// 存储当前Web全局状态
let globalWebState = {
  currentUrl: "",
  media: {
    isPlaying: false,
    currentTime: 0
  }
};

// 监听Web Browser状态变更,触发广播
function broadcastWebState(newState) {
  globalWebState = { ...globalWebState, ...newState };
  wss.clients.forEach(client => {
    if (client.readyState === WebSocket.OPEN) {
      client.send(JSON.stringify(globalWebState));
    }
  });
}

// 处理新客户端连接
wss.on('connection', (ws) => {
  // 主动推送当前状态
  ws.send(JSON.stringify(globalWebState));
});

客户端(Unity C# 示例)

using UnityEngine;
using WebSocketSharp;

public class WebSyncHandler : MonoBehaviour
{
    public WebBrowser webBrowserComponent;
    private WebSocket ws;

    void Start()
    {
        ws = new WebSocket("ws://your-server-ip:8080");
        ws.OnMessage += (sender, e) => {
            var syncData = JsonUtility.FromJson<WebSyncData>(e.Data);
            ApplySyncData(syncData);
        };
        ws.Connect();
    }

    void ApplySyncData(WebSyncData data)
    {
        // 同步URL
        if (!string.IsNullOrEmpty(data.currentUrl) && webBrowserComponent.CurrentUrl != data.currentUrl)
        {
            webBrowserComponent.LoadUrl(data.currentUrl);
        }
        // 同步媒体状态
        var videoElement = webBrowserComponent.GetActiveVideoElement();
        if (videoElement != null)
        {
            videoElement.Play(data.media.isPlaying);
            videoElement.SetCurrentTime(data.media.currentTime);
        }
    }

    void OnDestroy()
    {
        ws.Close();
    }

    [System.Serializable]
    private class WebSyncData
    {
        public string currentUrl;
        public MediaSyncData media;
    }

    [System.Serializable]
    private class MediaSyncData
    {
        public bool isPlaying;
        public float currentTime;
    }
}

内容的提问来源于stack exchange,提问作者Golnaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:21:58