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">
    <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>
    <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>
  </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项目出现问题的解决方法和本地网站部署

UnitySendMessage这个方法相信很少朋友注意到它的使用,因为根本就无法在unity编辑时使用,但是它有一个神奇的地方就是可以完成dllimport的方法回调时使用,这样说好像有些抽象,我可以举一个例子。 很多朋友开发ios客户端游戏,难免有人会用到付费啊,排行榜之类的功能,我这里先不讲使用什么第三方插件什么的,我这里就说明下是通过在xcode下编辑相关的调用代码,最后通过dl Unity 脚本间的参数传递 网上较为普遍的是用 SendMessage 来传递参数,但是都写的不太清楚。 SendMessage 是GameObject自带的一个函数,能够将同类参数传给 GameObject下的同类组件。脚本作为一个组件,参数也能传递。 因为是GameObject的函数,所以要先定义GameObject 的Instance,或者也可用GameObject.Find(“实例名称”) 来找到对应的实例。下图中的“DeviceStatus” 即是一个实例名称。 假设要在一个已触发的脚本中将参 一.老版方法 unity发布webplayer平台后会输出html和unity3d文件。我们的程序主要被打包在unity3d文件里,而html则是网页的界面显示。 1.Unity发送消息给JS unity想要和js交互,提供了一个函数:Application**.ExternalCall()**;此函数仅限于webplayer平台下。我们编辑发布的html文件,在里面加入我们的js脚本如下: fu... 在参考网上众多资料后,终于将Vue与Unity Webgl双向通信的功能完成。在此过程中遇到了很多问题,故记录下整体流程。1.unity端实现一个jslib文件预定义函数作为桥接。2.c#使用DllImport引入和调用预定义的函数。3.web端使用js定义被调用函数。1.Unity Webgl程序嵌入vue1.Unity -> vue通信2.vue -> Unity通信。 项目场景: UnityWebGL至今存在许多如视频无法播放,数据库难以连接等多种问题,此处记录Unity的数据库连接问题,并附上实现代码,代码一共分为两个部分,一部分为php代码,用于部署在服务器端直接连接数据库,作为Unity和数据库中间的桥梁,协助数据交换;另一部分则为C#代码,在Unity项目当中,与服务器上的php文件进行连接上传和获取数据。 php部分 需要注意的是,php7.0以上已经停用mysql_connect,而是改用mysqli_connect,后面多了一个i,其他mysql函数也有 官方文档:【传送门】 WEBGL平台下【调用JS上的方法】 最近开发WEBGL平台上的项目,很多时候我们需要在Unity调用网页端的方法而不是在Unity内部调用,比如场景中点击音效(为了减少打包包体大小采取了在网页上播放音效),点击按钮跳转新的场景等等等等应用场景。 首先创建一个后缀为`.jslib`的文件测试代码如下,放置在Assets文件夹下的Plugins文件夹下。 mergeInto(LibraryManager.library, { UnityToJs_Simple: function //2.发送给自身的所有脚本以及自身父物体,父物体的父物体等身上所有脚本 (发给自己和父物体,及父物体的父物体 往上调用SendMessageUpwards("方法名称"); //3.还有发给自己和子物体,及子物体的子物体,往下调用。 Broadcas...