Unity3D用c#脚本调用前端javascript函数:H5获取unity - webgl 加载并初始化完成的消息

unity3d发布的Webgl 可以作为静态文件加载到H5页面中,并通过javascript 调用unity内置的C#脚本函数,详见Webgl调用unity api。而往往我们需要知道Webgl ready的消息。经实验发现Webgl存在load和initialize两个阶段,其中load可以通过编译出的webgl的index.html的函数得到,而initialize完成的消息则需要由unity内部发出。本文将给出unity内部调用javascript函数的方案加以解决。


原理分析

unity3d 发布了webgl项目后我们得到一个index.html页面,在一下的onload函数中加载了webgl的内容。当createUnityInstance()执行完后,我们的前端页面就成功加载了webgl。

      script.onload = () => {
        createUnityInstance(canvas, config, (progress) => {
          progressBarFull.style.width = 100 * progress + "%";
        }).then((unityInstance) => {
          loadingBar.style.display = "none";
          fullscreenButton.onclick = () => {
            unityInstance.SetFullscreen(1);
          };
        }).catch((message) => {
          alert(message);
        });
      };

于是,最初的方案我们在.then()中发出一条完成的消息即可,在之后就可以调用unity的api了。
然而事情并不如所愿,测试时我们发现,刚刚加载完成的一段时间里,unity并不能正常响应函数调用,通过查看console可以发现:浏览器console
在Input Manager initialize前用javascript 调用unity的Message全部失败了。通过打出一系列log得出,unity内部接收到了Message,却不能正常运转,报了c# 的一些错误,如 NullReference balabala…

通过推测,我们认为script.onload 加载完成是前端成功加载了webgl的静态文件,而unity本身还需要一点时间完成初始化。由于并没有找到unity ready的接口,我们无法通过javascript 拿到结果,只能间接获得初始化完成的消息。


解决方案:

我们可以推测,当unity初始化完成时,unity就可以正常的执行函数,于是我们在unity C#脚本中的start()函数第一时间发出消息。unity恰好有调用外界javascript函数的接口,这下就有了如下的解决方案。
在index.html中添加script用于接收unity的消息:

var OnAppReady=() =>{
	console.log('load_model')
    ···
     } 

在unity的脚本中添加:

    void Start()
    {
        Application.ExternalEval("OnAppReady()");
        Debug.Log("unity:Ready");
    }

其中的Application.ExternalEval(“function()”) 用于调用javascipt相应的function()

如此就可以在unity第一时间在start()调用OnAppReady(),向前端界面发出初始化完成的消息。

你可能感兴趣的:(unity,unity)