JS向UE4发送事件
该app.js
文件提供了两个JavaScript函数,您可以在HTML播放器页面中调用它们,以允许用户将事件和命令从浏览器发送到Unreal Engine应用程序:
-
emitCommand
可以向游戏发送预设的命令列表,以更改分辨率,执行控制台命令或降低编码器的比特率。请参阅下面的使用emitCommand函数。 -
emitUIInteraction
将任意字符串或JavaScript对象发送到游戏。使用此功能可以从玩家UI发送自己的自定义命令,您可以在游戏逻辑中进行响应以在应用程序中产生所需的任何效果。请参阅下面的使用emitUIInteraction函数。
使用emitCommand函数
调用该emitCommand
函数时,必须向其传递一个JavaScript对象。该对象必须包含与以下字符串之一匹配的键:
-
ConsoleCommand
-使用此键在远程虚幻引擎应用程序上执行控制台命令。该键的值应该是一个字符串,其中包含要运行的命令以及所需的任何参数。例如: -
let descriptor = { ConsoleCommand: 'stat fps' } emitCommand(descriptor);
-
Resolution
-使用此键重置虚幻引擎应用程序的渲染分辨率。该键的值应该是包含Width
和Height
属性的对象。例如: -
let descriptor = { Resolution: { Width: 1024, Height: 768 } } emitCommand(descriptor);
-
Encoder
-使用此键将命令发送到编码器以控制媒体流的质量。当前,它支持一个命令:BitrateReduction
。此值指定应将测量的可用带宽的百分比分配给视频编码器的比特率。将此值设置得太高可能会导致网络拥塞和数据包丢失,进而导致增加的延迟和客户端上的视频失真。默认情况下,此值设置为50%。如果发现部署中的延迟和视频失真问题,则可以尝试进一步降低该值。例如: -
let descriptor = { Encoder: { BitrateReduction: 20 } } emitCommand(descriptor);
使用emitUIInteraction函数
调用该emitUIInteraction
函数时,可以向其传递单个字符串或JavaScript对象。例如:
emitUIInteraction("MyCustomCommand");
或者
let descriptor = {
LoadLevel: "/Game/Maps/Level_2"
PlayerCharacter: {
Name: "Shinbi"
Skin: "Dynasty"
}
}
emitUIInteraction(descriptor);
UE4接收并解析JS发送的蓝图:
您需要绑定一次此事件,通常是在游戏开始时。每当连接到您的虚幻引擎应用程序实例的任何播放器HTML页面调用该emitUIInteraction
函数时,无论传递到的输入如何,都会自动调用您的自定义事件emitUIInteraction
。
您分配的自定义事件(例如,上图中的UI Interaction节点)具有一个名为Descriptor的输出,您可以使用该输出检索该emitUIInteraction
函数发送给您的Unreal Engine应用程序的字符串。您可以使用该值来确定每次emitUIInteraction
调用游戏代码时需要如何响应。
例如,以下蓝图测试以查看给定的输入是否emitUIInteraction
包含字符串“ MyCustomCommand”,并调用自定义函数来处理事件:
Get Json String Value节点中,Filed Name参数可以获取对象中的对象值;
UE4向JS发送事件
蓝图
JS中增加方法:
function myHandleResponseFunction(data) {
console.warn("Response received!");
switch (data) {
case "MyCustomEvent":
... // handle one type of event
case "AnotherEvent":
... // handle another event
}
}
通过调用addResponseEventListener
提供的函数来注册您的侦听器函数app.js
。您为该函数传递事件侦听器和函数的唯一名称。例如:
addResponseEventListener("handle_responses", myHandleResponseFunction);
如果您需要删除事件监听器,请调用removeResponseEventListener
并传递相同的名称。例如:
removeResponseEventListener("handle_responses");
如果要传递更复杂的数据,可以将传递给“ 发送像素流响应”节点的字符串格式化为JSON。例如:
然后,在JavaScript事件处理程序函数中,使用 JSON.parse(data)
将该字符串解码回JavaScript对象。