项目场景:
网页打开WebGL带参数传入的解决方案。然而本人并没有系统的学习过JavaScript,导致踩得坑有点多,特记录一下。
问题分析
在index.html中获取的参数,传入到unity当中去使用,试了网上的很多种办法,有用xxx.jslib的,但此方法仅限于网页打开的index.html就为最终需要打开的位置,我这边的情况有点特殊,是在index.html中通过iframe跳入到另外的game.html中,等打开unity的界面其实是game.html的内容了,所以用xxx.jslib只能获取到game.html的参数,并不能获取到index.html的参数。
<iframe id="Frame" style="Frame" src="game.html"></iframe>
解决方案:
最后的解决方案是通过index.html传入参数,然后传给game.html,最后再传给unity里面。
我这边程序的打开逻辑如下:
外部带参数传入—》index.html获取参数 —》 传入到game.html —》 unity中
以下是index.html的代码部分:
<iframe id="Frame" style="Frame" src="game.html"></iframe>
<script>
var Frame = document.getElementById("Frame");
Frame.onload = function () {
//获取url的问号之后的部分:https://1.1.1.1/index.html?a=b&b=c
// returnStr =”a=b&b=c“;
var returnStr = window.location.search;
var param1 = returnStr;
//再通过iframe的属性将内容传入到game.html;
Frame.contentWindow.postMessage({ param1 }, "*");
};
</script>
以下为game.html的代码部分:
//定义unity实例
var gameInstance;
var script = document.createElement("script");
script.src = loaderUrl;
script.onload = () => {
createUnityInstance(canvas, config, (progress) => {
progressBarFull.style.width = 100 * progress + "%";
}).then((unityInstance) => {
//在有实例后进行赋值
gameInstance = unityInstance;
loadingBar.style.display = "none";
}).catch((message) => {
alert(message);
});
};
//这里去调用传回到unity中
function CallUnity() {
console.log(gameInstance == null);
//参数分别是,游戏场景里挂载脚本的物体,脚本要被调用的方法名称,
//需要传输的参数(得看接收到方法带不带参数);
gameInstance.SendMessage("GameAppExtral", "Test03", param1);
//这是不带参数的示例
gameInstance.SendMessage("GameAppExtral", "Test02");
}
//此方法为unity端调用
function Test01() {
CallUnity();
}
再接下来就是unity部分的代码:
public class TestURLPara : MonoBehaviour
{
void Start()
{
//该方法会显示已过时
Application.ExternalCall("Test01");
}
public void Test02()
{
Debug.Log("invole");
}
public void Test03(string str)
{
Debug.Log(str);
}
}
成功在html端获取到调用。
unity场景内的格式如下:
game.html里调用的 gameInstance.SendMessage(“GameAppExtral”, “Test02”);
第一个参数则为系统场景里的没有父物体的gameobject,第二个参数则是挂载在当前物体里所包含的方法名称。
如果是只有单单一层的index.html,启动即可打开游戏本体,那么只需要在index.html里获取参数传入到unity中即可。