UE 像素流与 Web 协同开发

UE 像素流与 Web 协同开发

  • 创建Web端应用
  • Web向UE发送消息
    • emitCommand
    • emitConsoleCommand
    • emitUIInteraction
  • UE接收Web的消息
  • UE向Web发送消息
  • Web接收UE的消息
  • UE 冻结帧

与Web交互主要涉及两个方面,一个是UE向Web发送消息,另一个就是Web端向UE程序发送消息,UE程序中需要启用像素流插件,Web端需要安装@epicgames-ps/lib-pixelstreamingfrontend-ue5.x依赖包。
在这里插入图片描述

创建Web端应用

Web端需要通过npm i @epicgames-ps/lib-pixelstreamingfrontend-ue5.x @epicgames-ps/lib-pixelstreamingfrontend-ui-ue5.2’安装对应版本的依赖npm包,然后就可以在代码中调用 UE Web 封装好的api来与UE程序进行交互了,更详细的API可以参考git上的文档,或者直接阅读Typescript类型定义文档。


// 导入需要的依赖
import { Config, PixelStreaming } from '@epicgames-ps/lib-pixelstreamingfrontend-ue5.3';
import { Application, UIOptions, PanelConfiguration, UIElementCreationMode } from '@epicgames-ps/lib-pixelstreamingfrontend-ui-ue5.3'

// 创建像素流
const config = new Config({
  useUrlParams: true,
  initialSettings: {
    ss: 'ws://192.168.1.58:8080', // 像素流的 WS 地址,默认端口是8080
    AutoConnect: true,
    AutoPlayVideo: true,
    MinQP: 30,
    XRControllerInput: false,
    GamepadInput: false,
    TouchInput: false,
    HoveringMouse: true,
  }
});
const stream = new PixelStreaming(config);

// 创建像素流播放界面
const application = new Application({
  stream: stream,
  onColorModeChanged: (isLightMode) => PixelStreamingApplicationStyles.setColorMode(isLightMode),
  settingsPanelConfig: { 
    isEnabled : false,
    visibilityButtonConfig : { creationMode : UIElementCreationMode.Disable }
  },
  fullScreenControlsConfig: {
    creationMode: UIElementCreationMode.UseCustomElement,
    customElement: document.getElementById('myCustomFullscreenButton')
  }
});

// 将 UI 添加到 Web 页面 DOM 节点上
document.getElementById('ue_container')?.appendChild(application.rootElement);

// 监听创建后播放流的事件,还有其它事件,可以阅读 *.d.ts 类型定义文件了解
stream.addEventListener('playStream', () => {
  getCurrentWaterLevel();
});

Web向UE发送消息

UE 像素流 Web API 提供了emitCommand、emitConsoleCommand、emitUIInteraction三个函数来向UE发送消息。

emitCommand

可以用 JSON 对象的形式向UE发送任意命令。

let descriptor = {
  ConsoleCommand: 'stat fps'// ConsoleCommand 是 UE 的保留的关键字
  Name:'asdad' // 自定义的消息
}
this.stream.emitCommand(descriptor);

emitConsoleCommand

可以向UE发送控制台命令。例如, stat fps 显示帧速率。

注意: 由于虚幻引擎控制台命令的强大功能,该 emitConsoleCommand 功能可能会带来安全风险,所以UE程序默认没有启用这个功能。如需启用,需要在UE程序的快捷方式里添加启动参数 -AllowPixelStreamingCommands ,或者使用“独立游戏”选项从虚幻编辑器启动它。

this.stream.emitConsoleCommand('stat fps');  // 显示帧速率

emitUIInteraction

将任意字符串或JSON对象发送到游戏。使用这个方法从 Web 发送消息到UE程序,在UE程序中可以接收并进行处理。

this.stream.emitUIInteraction("MyCustomCommand");
// 或
const descriptor = {
  LoadLevel: "/Game/Maps/Level_2",
  PlayerCharacter: {
    Name: "Shinobi",
    Skin: "Dynasty",
  },
};
this.stream.emitUIInteraction(descriptor);

UE接收Web的消息

当在Web端用emitUIInteraction 发送了消息之后,在UE程序中使用 Pixel Streaming Input > Bind Event to On Input Event 节点来绑定事件,每当有新的消息进来,就会执行该事件。这个事件上的Descriptor字符串里存放的就是Web端传过来的消息。
在这里插入图片描述
这个蓝图节点还具有处理读取JSON的功能,如果传过来的是JSON对象,则可以用 Pixel Streaming > Get Json String Value 节点来读取对应类型的字段值。取值的时候支持用 . 符号直接下钻获取,例如:class.student.name
在这里插入图片描述

UE向Web发送消息

UE程序可以向Web页面发送消息,Web端可以通过JavaScript来接收消息并作出相应的处理。使用 Pixel Streaming -> Send Pixel Streaming Response 节点向Web端发送消息。该节点可以传入一个字符串作为参数,字符串也可以是JSON内容,用以表明需要发送给Web端的事件内容。
在这里插入图片描述

Web接收UE的消息

Web端通过 addResponseEventListener 来监听UE程序传来的消息,用 removeResponseEventListener 来移除监听,这两个方法的第一个参数是字符串类型,只是用来做标识的,如果注册多个监听,每一个监听事件都会收到消息,因此为了避免重复执行建议只注册一个监听消息事件,在这个事件回调函数中自己写逻辑来处理不同的消息Data。
如果需要传递复杂消息,可以封装成一个JSON字符串,Web端收到之后使用 JSON.parse(data) 来解析。

this.stream.addResponseEventListener("handle_responses", (data)=>{
  console.log(`接收到了UE传来的消息:${data}`);
});

this.stream.removeResponseEventListener("handle_responses");

UE 冻结帧

在像素流推流的过程中,有时候并不需要一直实时推流,如果用户长期视角未动,可以使用“冻结帧”实现暂停的效果。暂停之后浏览器会显示暂停时候的画面,UE客户端也会停止实时渲染、像素流推送也会停止,此时可以节约 GPU和网络占用率
暂停的时候可以使用当前画面,或者指定一个纹理作为展厅画面。想要恢复每帧流送时,使用 Unfreeze Frame 节点可以手动恢复渲染和推流。
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/701613.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

功率 MOSFET、其电气特性定义

本应用笔记介绍了功率 MOSFET、其电气特性定义和使用说明。介绍了功率MOSFET的破坏机制和对策及其应用和电机驱动应用。 电气特性定义及使用说明 功率 MOSFET 额定值 导通电阻R_DS(on)与耐压V_DSS的关系 图2表示耐压VDSS20~100V额定元件与导通电阻R_DS(on)之间的…

如何理解质量

早年写过一篇未发表的论文《质量的相对性》,就是为了寻求到底什么才是质量这个问题的答案。现在,在准备了诸多超越以往的认知的概念之后,关于质量是什么的想法,也逐渐有了眉目。 质量有两种,一种叫做惯性质量&#xff…

使用OpenLLM在AMD GPU上的分步指南

Step-by-Step Guide to Use OpenLLM on AMD GPUs — ROCm Blogs 引言 OpenLLM是一个开源平台,旨在促进大型语言模型(LLMs)的部署和使用,支持多种模型,适应不同的应用,无论是在云环境还是本地环境中。在本教…

再开源一个小玩意儿,帮你找到电路板上的热点

ADLib上线 也半个多月了,这段时间做了一个全流程使用ADLib的小玩意儿,跟大家分享下过程。 这是一个利用红外测温传感器寻找电路板上的热点的工具,当然了,它也可以用来测量其他物体的温度,比如地暖水管铺设位置&#x…

【重拾数学知识】导数、极值和最值

前言 在深度学习中,梯度下降法是一种常用的优化算法,用于更新模型参数以最小化损失函数。这梯度下降法中涉及到数学中的导数、极值等相关知识,因此我们重新回顾相关内容,以便加深理解。 相关概念 导数 一个问题 如何求得一个…

帮企三级分销商城10合一小程序源码系统 附带完整安装代码包以及搭建教程

系统概述 “帮企三级分销商城10合一小程序源码系统”是一款专为中小企业设计的一站式电商解决方案。该系统基于成熟的小程序开发框架构建,集商品展示、在线交易、订单管理、会员系统、营销工具、数据分析、以及独特的三级分销功能于一体,旨在帮助商家快…

优思学院|汽车行业的六西格玛案例

汽车行业正在经历前所未有的变革。市场变化、新商业模式和新的价值链不断涌现。面对这些变化,我们需要持续改进的方法。因此,优思学院今天想分享一个最近关注到的汽车行业六西格玛案例。这是一家位于葡萄牙的轮胎制造公司,通过这个案例研究&a…

机器学习-聚类算法

1.有监督学习与无监督学习 有监督:在训练集中给的数据中有X和Y,根据这些数据训练出一组参数对预测集进行预测 无监督:在训练集中给的数据只有X没有Y,根据X数据找相似度参数来对预测集进行预测 2.数据间的相似度 2.1距离相似度…

.NET C# 读写Excel及转换DataTable

目录 .NET C# 读写Excel及转换DataTable1. 依赖库2. Nuget包与版本3. ExcelUtil3.1 Excel sheet 转 DataTable3.2 Excel sheet 转 DataSet3.3 DataTable 转 Excel sheet3.4 DataSet 转 Excel3.5 私有方法 .NET C# 读写Excel及转换DataTable 1. 依赖库 using NPOI.HSSF.UserMo…

自动驾驶#芯片-1

概述 汽车是芯片应用场景之一,汽车芯片需要具备车规级。  车规级芯片对加工工艺要求不高,但对质量要求高。需要经过的认证过程,包括质量管理标准ISO/TS 16949、可靠性标准 AEC-Q100、功能安全标准ISO26262等。  汽车内不同用途的芯片要求…

肾合养生秘诀:告别手心热出汗的困扰

如果将我们的身体比作一支精心编排的交响乐团,那么各个器官便是乐团中不可或缺的乐器和乐手,而气血则如同乐团中的乐谱和指挥棒,引领着整个乐团的演奏。当乐谱缺失,指挥棒失灵,或者乐团的协作出现问题,某些…

【启明智显方案分享】ESP32-S3与GPT AI融合的智能问答嵌入式设备应用解决方案

一、引言 随着物联网(IoT)和人工智能(AI)技术的飞速发展,嵌入式设备正逐渐变得智能化。本解决方案是启明智显通过结合ESP32-S3的低功耗、高性能特性和GPT(Generative Pre-trained Transformer)…

仅需一款免费工具,就可以打造真实人设,无限生成虚拟AI网红

嘿,大家好,向阳。 很多粉丝问我,用AI做了这么多漂亮的美女,该如何用AI进行变现呢?今天我就教大家一个方法!曝光AI网红最好的平台就是小某书,在小某书上打造一个虚拟人物可以快速获取粉丝 。达到…

Mybatis Log Free

安装后重启 在 application.yml 配置 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 选择效果

【一步一步了解Java系列】:探索抽象类与接口的秘密

看到这句话的时候证明:此刻你我都在努力 加油陌生人 个人主页:Gu Gu Study专栏:一步一步了解Java 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者:小闭…

为什么看了那么多资料还是无法理解Transformer啊???

要理解和熟悉一个新的技术/新模型,比较好的方式是通过以下框架结构来熟悉: 为什么:一个新模型的诞生,一般是解决了现有的模型不能解决的一些问题。因此需了解该技术提出的背景和创新点。 是什么:熟悉这个模型的内容和架构、训练…

pip 配置缓存路径

在windows操作平台,默认情况,pip下使用的系统目录 C:\Users\用名名称\AppData\Local\pip C盘是系统盘,如果常常使用pip安装会占用大量的空间很快就满,这时候就有必要变更一下缓存保存路径了。 pip 配置缓存路径: Win…

10 -每台机器的进程平均运行时间(高频 SQL 50 题基础版)

10 - 每台机器的进程平均运行时间 -- sum(if(activity_type end,timestamp ,-timestamp )) -- 如果activity_type为“end”,值为timestamp,为“start” 为-timestamp,所有数相加end-start -- count(distinct process_id),获取同一机器有几个进行id -- r…

详解 Flink Table API 和 Flink SQL 之流处理中的表

一、关系型表和流处理表对比 关系型表/SQL流处理表处理的数据对象字段元组的有界集合字段元组的无限序列查询(Query)对数据的访问可以访问到完整的数据输入无法访问所有数据,必须持续“等待”流式输入查询终止条件生成固定大小的结果集后终止…

内网环境MySQL操作非正常耗时问题排查小结

写在文章开头 早起笔者进行数据库操作实验时,会习惯性通过内网虚拟机安装MySQL,在完成部署并进行操作过程中发现MySQL操作无论是连接还是操作都非常耗时,结合之前SSH连接慢大抵推测MySQL连接操作耗时也是卡在DNS反向解析上,遂以此…