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通信。
项目场景:
Unity的WebGL至今存在许多如视频无法播放,数据库难以连接等多种问题,此处记录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...