ue4像素流推送(Vue3 + UE4+ 像素流 + 交互 的开发构建流程)
Vue3 + UE4+ 像素流 + 交互 的开发构建流程
一 、像素流
1 、将对应 UE 4.27 版本的 webRtcPlayer.js 复制到项目的 public/ue 文件夹下(作为静态资源) 2 、根目录下的 index.html 中引入 ue/webRtcPlayer.jsindex.html 中引入 webRtcPlayer.js
3 、将对应 UE 4.27 版本的 app.js 复制到项目的 main.ts 同级目录下 ,可以改名为 ueapp.js 4 、修改 ueapp.js 中的内容 ,用于解决开发中的报错问题 1 、新增导出(webrtc 对象可以将 ueapp.js 中定义的 function 都导出 ,这里只初步导出了五个函数/对象)这里目前只初步导出了 ueapp.js 中的 load 、resizePlayerStyle 、emitUIInteraction 等方法 。有需要的话 ,还可以继续导出所需要的方法 。
var temp = new window.webRtcPlayer({}) var webrtc = { load: load, webRtcPlayer: temp, resizePlayerStyle: resizePlayerStyle, emitUIInteraction: emitUIInteraction, onConfig: onConfig } export default { webrtc } 2 、添加初始变量定义ueapp.js 中 ,有些变量没有定义就直接在函数中使用了 ,这将导致在运行使用时的报错 ,需要增加定义:
// 新增 let unquantizeAndDenormalizeUnsigned = null let receivedBytesMeasurement = null let receivedBytes = null let Data = null let gamepad = null 3 、修改 websocket 地址(要和启动的 打包后的 ue 的 exe 的云渲染的网络地址一致)本地启动打包后的云渲染的 run.bat 后 ,在本机浏览器上输入的地址是:localhost ,也就是 http://127.0.0.1
那么 需要修改 ueapp.js 中 websocket 中对应的地址:
// ws = new WebSocket( // window.location.href // .replace("http://", "ws://") // .replace("https://", "wss://") // ) ws = new WebSocket("ws://127.0.0.1") 4 、修复引用 play.png 问题将 showPlayOverlay 中的 createElement(“img ”) 屏蔽掉 。
5 、main.ts 中引入 ueapp.js引入 ueapp.js ,并使用 vue3 的语法:app.provide ,注册 WebRtc 的全局属性 ,用于方便在 vue 文件中直接调用使用 。
6、webRtcPlayer.js 中修改视频为静音,实现数据流直接播放效果云渲染/像素流推送的本质是视频播放 。
在最新版的 Chrome浏览器(以及所有以 Chromium 为内核的浏览器)中 ,已不再允许自动播放音频和视频 。就算为 video 或audi o标签设置了 autoplay 属性也一样不能自动播放 。
因此想要视频流在网页加载时自动播放 ,就需要设置 video 的 muted 属性为 true 。即声音为静音模式 。
如果本身游戏引擎是有音效的,可以在网页加载后的一定时间内 ,再将 video 的 muted 设置为 false ,之后用户可以调整系统音量 ,实现音效的展示 。
7 、修改 ueapp.js ,实现支持自动播放(不用再手动点击) 8 、复制 player.html 中的 完整 div 到 vue 文件中 ,并修改 id=“overlay ” 的 div 的 display 为 collapse 9、vue 文件中调用像素流方法 10 、至此 ,就可以看到启动 vue 项目时 ,页面展示游戏引擎的界面了注意:需要首先启动打包后的 UE 游戏引擎 exe 和 run.bat 开启像素流送 。
效果如下:
二 、游戏引擎 实时交互
以上的验证过程 ,是基于打包后的游戏引擎的 。对于正在开发中的 UE4 项目 ,以及实现 vue 和 游戏引擎的相互发消息的交互机制 ,还尚未实现。下面 ,就介绍如何实现与项目的实时交互 。
1 、游戏引擎以 Standalone Game 的方式启动 2 、找到对应的 UE 4.27 的版本的 SignallingWebServer ,将其复制到无特殊字符 、中文名称等的路径下以保证 SignallingWebServer 的像素流服务可以正常启动 。
3 、找到复制后的路径下:SignallingWebServer/platform_scripts/cmd/run_local.bat,以管理员身份运行 run_local.bat注意:run_local.bat 默认以 80 端口 ,若有其他程序占用了 80 端口 ,则 run_local.bat 将会运行错误或失败,需要移除占用的端口的软件 ,再重新以管理员身份运行 run_local.bat。
运行成功 ,将会如下所示:
此时当 以 Standalone Game 方式运行了游戏引擎 ,且运行了 run_local.bat ,那么将可以在网页中输入 localhost:80 ,在线访问游戏引擎界面:
4 、运行 vue 项目此时可以看到 ,运行后 ,vue 项目也可以正常访问到游戏引擎界面 。只不过界面并不是全屏的 ,需要在代码中做一些样式调整 ,使游戏引擎界面铺满全屏 。
这里 vue 项目可以访问游戏引擎界面的原因在于 ,我们在 ueapp.js 中修改了对应的 WebSocket 地址 。
1 、调整游戏引擎界面占满全屏修改 webRtcPlayer.js 中的 video 的 style 。
var video = document.createElement("video") video.id = "streamingVideo" video.playsInline = true video.disablepictureinpicture = true video.muted = true // self.startVideoMuted video.style.width = "100vw" video.style.height = "100vh" video.style.objectFit = "fill"这样就有占满全屏的效果了 。
5 、游戏引擎 和 Vue 的通信机制 1 、消息通信的原理Vue 和 UE 相互通信的原理是借助于 WebSocket ,利用像素流启动服务(run_local.bat) ,Vue 和 UE 同时监听像素流服务的地址 、端口,通过 WebSocket 相互发送 、监听消息 ,再利用各自的对于消息的处理方法 ,进行消息的处理与响应 。
而具体的方法就是 调用 emitUIInteraction 方法 和 addResponseEventListener 方法,前者用于从 JS/Vue 向 UE 发消息 ,后者用于接收、处理 从 UE 向 JS/Vue 发的消息 。
完整蓝图事件:
至此就完成了 ,Vue 和 UE 相互通信以及通信消息的响应处理 。
效果如下:GIF3
三 、参考资料
【UE4】一个实现Web穿透 ,用HTML开发UI的方式——WebUI的用法
[Vue3] TS7016: Could not find a declaration file for module ‘…/assets/js/util.js‘
jQuery报错 Uncaught (in promise) DOMException: play() failed because the user didn‘t interact
Vue框架中页面和UE4交互的方法
Vue.js集成UE4像素流自定义网页的实现方式
VUE与UE5 像素流送
vue项目与ue交互
ue4之WebUI与引擎之间的通信
UE4.27 UE5 像素流送新人向教程 ,手把手带你避坑
UE4与前端通信方式
【数字孪生】UE4虚幻引擎与前端Web页面的结合
ue4之mesh点击事件触发切换材质
开源篇-WebSocket搭建UE5通信桥梁
徒手搭建VUE3项目(四):开启全局websocket
UE4使用websocket建立通信 ,获取实时数据
UE像素流送 、 交互
UE4.27 UE5 像素流送新人向教程 ,手把手带你避坑
UE4 PixelStreaming与UE4之间的通讯笔记
PixelStreaming数据通信
Unreal——像素流送播放器页面与 UE 通信
自定义播放器网页 5.0
在 UE4 蓝图中如何使用委托作为参数
自定义播放器网页 4.27
UE4像素流送PixelStreaming_ue4像素流到移动端可以吗_WindRushToNight的博客-CSDN博客
VUE与UE5 像素流送
UE4-PixelStreaming(虚幻引擎4-像素流)笔记
【自制】UE4蓝图中使用Json的插件
UE5的像素流程序打包
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!