Unity2019与WebGl方法相互调用传值

一、前言 

Unity官方手册:

WebGL:与浏览器脚本交互 - Unity 手册

1.从 Unity 调用 JavaScript 代码的传统方法

注意:从 Unity 5.6 开始,从 Unity 调用 JavaScript 代码的建议方法是通过 .jslib 插件。下述方法受到支持仅出于兼容性原因,并可能在 Unity 的未来版本中被弃用。

可使用 Application.ExternalCall() 和 Application.ExternalEval() 函数在嵌入网页上调用 JavaScript 代码。

传统Application.ExternalEval()函数在Unity2017版本以下适用,从2018版本开始就只能使用.jslib 方式做中介进行信息调用,虽然在2018版以上中该方法没有彻底弃用,但是使用传统方法传值会失败。

打包后还需要对文件进行配置 请看第三条

二、Unity2017版以下方法使用

新建Demo.cs脚本,将脚本挂到Main Camera中

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class Demo : MonoBehaviour
{
    //public Button Btn;
    public Text showText;

    void Start()
    {
        //Btn.onClick.AddListener(BtnEvent);
        //调用外部函数(参数为方法名、参数)
        Application.ExternalCall("SayHello", "Hello World!");
    }

    public void BtnEvent(string value)
    {
        showText.text = value;
    }
}

 打包后修改index.html文件

Main Camera 挂载脚本的物体名,BtnEvent脚本方法名称 back2传递的内容

 function SayHello(arge) {
            alert(arge);
            gameInstance.SendMessage("Main Camera", "BtnEvent", "back2");
        }
<!DOCTYPE html>
<html lang="en-us">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Unity WebGL Player | WebglTest</title>
    <link rel="shortcut icon" href="TemplateData/favicon.ico">
    <link rel="stylesheet" href="TemplateData/style.css">
    <script src="TemplateData/UnityProgress.js"></script>  
    <script src="Build/UnityLoader.js"></script>
    <script>
        var gameInstance = UnityLoader.instantiate("gameContainer", "Build/AAA.json", { onProgress: UnityProgress });
        function SayHello(arge) {
            alert(arge);
            gameInstance.SendMessage("Main Camera", "BtnEvent", "back2");
        }
    </script>
  </head>
  <body>
    <div class="webgl-content">
      <div id="gameContainer" style="width: 960px; height: 600px"></div>
      <div class="footer">
        <div class="webgl-logo"></div>
        <div class="fullscreen" onclick="gameInstance.SetFullscreen(1)"></div>
        <div class="title">WebglTest</div>
      </div>
    </div>
  </body>
</html>

效果: 

注意:方法类型一定要是公开(public)的否则js无法获取报错

三、unity2018版本以上方法使用

__Internalplugins.jslib 内容 此文件放在Plugins文件夹下

mergeInto(LibraryManager.library, {
  Hello: function () {
    TestSend("Hello, world!");
  },

//如果传输字符串 必须要用Pointer_stringify()
  Hello: function (str) {
    TestSend(Pointer_stringify(str));
  }
});

场景脚本 WebCommunication.cs 挂载Main Camera(或任何物体,这里名字在打包后的js脚本中要用到)上。

using UnityEngine;
using UnityEngine.UI;
using System.Runtime.InteropServices;

public class WebCommunication : MonoBehaviour
{
    //引用jslib的Hello()方法
    [DllImport("__Internal")]
    private static extern void Hello();

    public Text MyText;

    void Start()
    {
        //开始时就调用jslib的方法Hello()
        Hello();
    }

    //测试 网页调用此方法
    public void TestMethod(string text)
    {
        MyText.text = text;
    }
}

打包webGl后修改index.html文件

“Main Camera” 挂载脚本的物体名称,TestMethod 脚本中要调用的方法。

 function TestSend(s) {
            unityInstance.SendMessage("Main Camera", "TestMethod", s);
        }

运行效果: 

四、打包后文件的配置

Webgl无法直接运行在网站中,需要在打包webgl中添加web.config文件

web.config内容:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <staticContent>
            <mimeMap fileExtension=".unity3d" mimeType="application/octet-stream" />
            <mimeMap fileExtension=".unityweb" mimeType="application/binary" />
        </staticContent>
        <directoryBrowse enabled="true" />
    </system.webServer>
</configuration>

如果不加会出现错误

2.在iis部署网站运行即可:

如果打包webgl运行出现问题 可以参考:

关于Unity发布的WebGL项目出现问题的解决方法和本地网站部署

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值