Unity2021發佈WebGL與網頁交互問題的解決
(一)首先說Unity調用頁面方法的辦法。
首先是需要在工程的Asset目錄裡面建一個Plugins文件夾,然後在文件夾裡面創建一個.txt文件,名字倒是無所謂,創建好後要把擴展名改成.jslib。文件要包含類似如下內容:
mergeInto(LibraryManager.library, { Hello: function () { window.alert("Hello, world!"); }, HelloString: function (str) { window.alert(Pointer_stringify(str)); }, PrintFloatArray: function (array, size) { for(var i = 0; i < size; i++) console.log(HEAPF32[(array >> 2) + i]); }, AddNumbers: function (x, y) { return x + y; }, StringReturnValueFunction: function () { var returnStr = "bla"; var bufferSize = lengthBytesUTF8(returnStr) + 1; var buffer = _malloc(bufferSize); stringToUTF8(returnStr, buffer, bufferSize); return buffer; }, BindWebGLTexture: function (texture) { GLctx.bindTexture(GLctx.TEXTURE_2D, GL.textures[texture]); }, });
這其中隻有mergeInto的第二個參數是可以修改的,第二個參數是一個對象,這個對象裡面包含瞭多個方法的引用,這些方法(例如:Hello()、BingdeWebGLTexture()等)都是在Unity編程中可以引入的。這些方法內調用的方法(例如:wiindow.alert()、GLctx.bindTexture()等)都是將來頁面中可以被調用的。
具體在Unity編程中引入方法的方式以C#為例:
首先需要引入命名空間:
using System.Runtime.InteropServices;
其次需要寫具體引入代碼:
[DllImport("__Internal")] private static extern void Hello();
參考以下代碼引入和使用示例
using UnityEngine; using System.Runtime.InteropServices; 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, myArray.Length); int result = AddNumbers(5, 7); Debug.Log(result); Debug.Log(StringReturnValueFunction()); var texture = new Texture2D(0, 0, TextureFormat.ARGB32, false); BindWebGLTexture(texture.GetNativeTextureID()); } }
(二)其次說說頁面方法調用Unity內方法的辦法。
簡單說就是使用unityInstance發消息就行瞭。具體方法定義如下:
unityInstance.SendMessage(objectName, methodName, value);
其中的參數objectName是Unity場景列表中的物體的名字,這裡註意要保證場景中隻有一個叫這個名字的物體,別出現重名的,否則亂套瞭。methodName是發消息的方法名,value是方法的參數,這個參數可以沒有,有的話可以是整數或者字符串。
具體使用方式參考如下:
unityInstance.SendMessage('MyGameObject', 'MyFunction'); unityInstance.SendMessage('MyGameObject', 'MyFunction', 5); unityInstance.SendMessage('MyGameObject', 'MyFunction', 'MyString');
不過這個unityInstance是內部對象(我不知道怎麼說這個話比較準確,暫時先這麼說吧。),如果要在外部引用這個對象,頁面代碼請參考如下:
var myGameInstance = null; createUnityInstance(canvas, config).then((unityInstance) => {myGameInstance = unityInstance;}); var SendCmd = function(funName){ myGameInstance.SendMessage("ZongCai", funName); }
這樣就是使用myGameInstance獲得瞭unityInstance的引用,可以用myGameInstance來發消息瞭。
官方參考:
WebGL:與瀏覽器腳本交互 – Unity 手冊
到此這篇關於Unity2021發佈WebGL與網頁交互問題的解決的文章就介紹到這瞭,更多相關Unity2021發佈WebGL與網頁交互內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Unity命令行打包WebGL的示例代碼
- 詳解Unity安卓共享紋理
- Unity UI實現循環播放序列圖
- Unity Sockect實現畫面實時傳輸案例原理解析
- 擎動賦能跨端遊戲創作力,Unity即將亮相2021年ChinaJoy BTOB展區