UE4.27 HTML5版本调用JS方法(UE与JS交互)

将做什么

通过UE4.27 发布HTML5 版本后,每次进入无可厚非直接显示关卡首页。但是如果HTML页面需要与其他页面交互或者根据页面的传参显示隐藏指定物体又要如何操作?

所以实现的场景具体流程为:我在UE放两个物体圆柱体,并默认隐藏他们。当我打包发布后,根据页面的传参数,对他们进行显示和隐藏,当我请求URL里面包含Cylinder 就显示圆柱体,当我请求URL里面包含Sphere 就显示球。

先尝结果

UE4.27 HTML5 参数交互演示

环境

  • UE版本为 4.27 源码版本(可参考[UE4.27 源码版 可打包HTML5版本 (Windows)](https://blog.csdn.net/Xfuck/article/details/140259469)

  • Visual Studio Community 2019或2022(修改源码)

怎么做

修改源码

1、打开UE4.27 引擎源码(vs2019或2022)
在这里插入图片描述
2、打开文件“HTML5ToolChain.cs”,找到 “EXTRA_EXPORTED_RUNTIME_METHODS=\"['Pointer_stringify', 'writeAsciiToMemory', 'stackTrace']” ,这边是在466行,去掉前面的注释(双斜杠)“//”。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、打开文件HTML5JavaScriptFx.h 添加方法,我这边添加了两个方法

  • UE_GetHTML5Url - 获取浏览器URL全地址
  • UE_GetHTML5UrlParams - 获取浏览器URL后面带的参数并转为json字符串

		void UE_GetHTML5Url(const char* outdata);

		void UE_GetHTML5UrlParams(const char* outdata);

在这里插入图片描述
4、打开文件“HTML5JavaScriptFx.js” 实现刚刚添加的两个方法。

	// ****** 自定义方法 ***********
	UE_GetHTML5Url: function(outdata) {
		var h5Url = window.location.href;
		// Decode64的转码
		h5Url = decodeURI(h5Url, "utf-8");
		// 日志都会在浏览器控制台里显示
		console.log("BT MissJ UE Log:Local Url" + h5Url);
		// 进行编码,预防乱码
		var newUrl = window.btoa(h5Url);
		console.log("BT MissJ UE Log:Local NewUrl" + newUrl);
		// writeAsciiToMemory 就是第二步HTML5ToolChain.cs 里面放开使用的
		Module.writeAsciiToMemory(newUrl, outdata);
	},
	UE_GetHTML5UrlParams: function(outdata) {
		var searchParams = new URLSearchParams(window.location.search);
		var json = {};
		for (var [key, value] of searchParams.entries()) {
			json[key] = value;
		}
		var newJsonStr = window.btoa(JSON.stringify(json));
		Module.writeAsciiToMemory(newJsonStr, outdata);
	}

在这里插入图片描述
5、需要在UE引擎里能够获取到了。我这边是找的工具集的源码位置加进去的。看个人需要。打开文件KismetStringLibrary.h定义方法。
在这里插入图片描述

Category 里面的意思对应着蓝图类,右键显示的树形结构分组名称。可自行定义。
在这里插入图片描述

6.定义好了方法,就需要实现。打开文件“KismetStringLibrary.cpp”.调用 JS 实现的方法(“HTML5JavaScriptFx.js”),这个添加内容较多。

  • 在头部添加以下内容
#ifdef __EMSCRIPTEN__
	#include <emscripten/emscripten.h>
	#include <emscripten/html5.h>
	#include "HTML5JavaScriptFx.h"
#else
#define EMSCRIPTEN_KEEPALIVE
#endif

#include <string>
#include <cstring>

在这里插入图片描述

  • 实现方法,并调用js方法
FString UKismetStringLibrary::GetHtml5Url()
{
	char OutData[1024];

	#ifdef __EMSCRIPTEN__ 
		UE_GetHTML5Url(OutData);
	#endif

	//把数据转到FString
	FString ueStr = FString(StringCast<TCHAR>(OutData).Get());

	//解码
	FString SaveURL;
	FBase64::Decode(ueStr, SaveURL);
	return  SaveURL;
}


FString UKismetStringLibrary::GetHtml5UrlParamJson()
{
	char h5SearchParams[2048];

	#ifdef __EMSCRIPTEN__ 
		UE_GetHTML5UrlParams(h5SearchParams);
	#endif

	//把数据转到FString
	FString paramJson = FString(StringCast<TCHAR>(h5SearchParams).Get());

	//解码
	FString resData;
	FBase64::Decode(paramJson, resData);
	return  resData;
}

在这里插入图片描述

至此源码修改部分已经结束。

7、生成UE4, 生成时必须关掉打开的虚拟引擎。(生成:增量编译,速度快),几分钟就好
在这里插入图片描述

UE使用

项目demo:交互Demo7

上面编译好后,打开虚拟引擎
直接在蓝图类中就能搜索到方法名称。逻辑部分就自行发挥了。
在这里插入图片描述

打包部署测试

根据之前的文档[UE4.27 源码版 可打包HTML5版本 (Windows)](https://blog.csdn.net/Xfuck/article/details/140259469) 打包部署即可。在根据不同的url.验证效果

// demo7-HTML5-Shipping 就是自己打包后项目的名称
// 默认地址 
http://localhost:8000/demo7-HTML5-Shipping.html

// 加参数1 显示圆柱体
http://localhost:8000/demo7-HTML5-Shipping.html?param=Cylinder

// 修改参数2 显示圆
http://localhost:8000/demo7-HTML5-Shipping.html?param=Sphere

在这里插入图片描述

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Miss@J

蒙君厚爱,赐以嘉赏,感激不尽。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值