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!

推薦閱讀: