Unity——Js和Unity互相调用
时间:2021-12-04 作者:littleperilla
Unity项目可以打包成WebGl,打包后的项目文件:
Build中是打包后的Js代码;
域名是web项目的入口,里面可以调整web的自适应,也可以拿去嵌套;
TemplateData是打包时候选的webGl模板;
web端游戏可能Unity只负责做游戏部分,而官网由另外的团队制作,之间就需要Unity和Js代码之间的相互调用;
Unity调用JavaScript代码
声明一下,这里说的都是Unity和外部JS代码的互相调用,项目内调用有其他方法;
老版本提供一个过时的方法:
1.在WebGL项目中的域名中添加要调用的JS方法
function Unity2JavaScript() { alert("UnityToWeb") }
域名y中调用
域名rnalCall("Unity2JavaScript");
//可以有参数,没有返回值
//域名rnalCall("Unity2JavaScript",a,10,"aaaa");
Unity建议使用的方法:
1.在Plugins文件夹中,创建后缀为.jslib的文件,在其中写需要调用的js代码
mergeInto(域名ary, {
Hello: function () {
域名t("Hello, world!");
},
HelloString: function (str) {
域名t(Pointer_stringify(str));
},
PrintFloatArray: function (array, size) {
for(var i = 0; i < size; i++)
域名(HEAPF32[(array >> 2) + size]);
},
AddNumbers: function (x, y) {
return x + y;
},
StringReturnValueFunction: function () {
var returnStr = "bla";
var buffer = _malloc(lengthBytesUTF8(returnStr) + 1);
writeStringToMemory(returnStr, buffer);
return buffer;
},
BindWebGLTexture: function (texture) {
域名Texture(域名URE_2D, 域名ures[texture]);
},
});
域名y中调用——域名b
using UnityEngine;
using 域名ropServices;
public class NewBehaviourScript : MonoBehaviour {
[DllImport("__Internal")]
private static extern void Hello();
[DllImport("__Internal")]
private static extern void HelloString(string str);
[DllImport("__Internal")]
private static extern void PrintFloatArray(float[] array, int size);
[DllImport("__Internal")]
private static extern int AddNumbers(int x, int y);
[DllImport("__Internal")]
private static extern string StringReturnValueFunction();
[DllImport("__Internal")]
private static extern void BindWebGLTexture(int texture);
void Start() {
Hello();
HelloString("This is a string.");
float[] myArray = new float[10];
PrintFloatArray(myArray, 域名th);
int result = AddNumbers(5, 7);
域名(result);
域名(StringReturnValueFunction());
var texture = new Texture2D(0, 0, 域名32, false);
BindWebGLTexture(域名ativeTextureID());
}
}
JavaScript调用Unity
这里面有巨坑,天坑,人都坑傻了!!!
官方文档中有这几行字
恰好我用的2020版本的Unity;
主要使用这个API——
SendMessage("游戏对象名","方法名","参数"); 这个和参数和lua调用c#差不多了,但是怎么调用这个api就很玄学了;
首先如果你调用这个方法需要在Unity的资源已经加载完成才可以,这个好解决,js加个button;
<button Type="button" onclick="TestSend()">WebToUnity</button>
其次在调用这个方法前需要先实例化UnityInstance变量;
var gameInstance = null;
域名ad = () => {
gameInstance = createUnityInstance(域名ySelector("#unity-canvas"), {
dataUrl: "Build/域名",
frameworkUrl: "Build/域名",
codeUrl: "Build/域名",
streamingAssetsUrl: "StreamingAssets",
companyName: "DefaultCompany",
productName: "UnityToWeb",
productVersion: "0.1",
});
};
//以上的参数都可以在unity的playersetting界面找到;
最后调用时要在then中用lamda表达式
function TestSend() {
域名((unityInstance) => {
域名Message("Canvas","OnLogin","dqwreqweraf");
});
}
完整的域名
<!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 | UnityToWeb</title>
<link rel="shortcut icon" href="TemplateData/域名">
<link rel="stylesheet" href="TemplateData/域名">
</head>
<body>
<div id="unity-container" class="unity-desktop">
<button Type="button" onclick="TestSend()">WebToUnity</button>
<canvas id="unity-canvas" width=960 height=600></canvas>
<div id="unity-loading-bar">
<div id="unity-logo"></div>
<div id="unity-progress-bar-empty">
<div id="unity-progress-bar-full"></div>
</div>
</div>
<div id="unity-mobile-warning">
WebGL builds are not supported on mobile devices.
</div>
<div id="unity-footer">
<div id="unity-webgl-logo"></div>
<div id="unity-fullscreen-button"></div>
<div id="unity-build-title">UnityToWeb</div>
</div>
</div>
<script>
var buildUrl = "Build";
var loaderUrl = buildUrl + "/域名";
var config = {
dataUrl: buildUrl + "/域名",
frameworkUrl: buildUrl + "/域名",
codeUrl: buildUrl + "/域名",
streamingAssetsUrl: "StreamingAssets",
companyName: "DefaultCompany",
productName: "UnityToWeb",
productVersion: "0.1",
};
var container = 域名ySelector("#unity-container");
var canvas = 域名ySelector("#unity-canvas");
var loadingBar = 域名ySelector("#unity-loading-bar");
var progressBarFull = 域名ySelector("#unity-progress-bar-full");
var fullscreenButton = 域名ySelector("#unity-fullscreen-button");
var mobileWarning = 域名ySelector("#unity-mobile-warning");
// By default Unity keeps WebGL canvas render target size matched with
// the DOM size of the canvas element (scaled by 域名cePixelRatio)
// Set this to false if you want to decouple this synchronization from
// happening inside the engine, and you would instead like to size up
// the canvas DOM size and WebGL render target sizes yourself.
// 域名hWebGLToCanvasSize = false;
if (/iPhone|iPad|iPod|Android/域名(域名Agent)) {
域名sName = "unity-mobile";
// Avoid draining fillrate performance on mobile devices,
// and default/override low DPI mode on mobile browsers.
域名cePixelRatio = 1;
域名lay = "block";
setTimeout(() => {
域名lay = "none";
}, 5000);
} else {
域名h = "960px";
域名ht = "600px";
}
域名lay = "block";
var script = 域名teElement("script");
域名 = loaderUrl;
var gameInstance = null;
域名ad = () => {
gameInstance = createUnityInstance(域名ySelector("#unity-canvas"), {
dataUrl: "Build/域名",
frameworkUrl: "Build/域名",
codeUrl: "Build/域名",
streamingAssetsUrl: "StreamingAssets",
companyName: "DefaultCompany",
productName: "UnityToWeb",
productVersion: "0.1",
});
};
function TestSend() {
域名((unityInstance) => {
域名Message("Canvas","OnLogin","dqwreqweraf");
});
}
域名ndChild(script);
</script>
</body>
</html>