Unity打包到Webgl平臺以及遇到的問題
參考網站
Unity打包WebGL的全過程及在打包和使用過程中會遇到的問題(本地測試)-CSDN博客
unity打包到Webgl 并配置能正常運行
這里我用的是Unity2022.3.3f1c1版本
有兩種方法
1、配置本地web服務
2、安裝vsCode>添加插件LiveServer>把工程托到vsCode里在index.html上右鍵Open with Live Server 即可運行webgl
首先安裝webGL模塊
新建一個空工程
切到WebGL平臺
PlayerSettings設置
Resolution and Presentation設置分辨率 : 將會在瀏覽器顯示的默認大小
Other Settings
有的版本會有一個警告:
Unity Other Settings的默認設置在打開后會看到有警告,其大致意思就是在提醒我們要在 Unity WebGL 構建中啟用高質量的光照貼圖編碼并確保 WebGL 2 兼容性,解決這個警告只需要將Auto Graphics API 自動圖形接口關閉后在Graphics APIs選擇WebGL2就可以解決這個警告
我們這里也用WebGL2的渲染方式
Publishing Settings 發布設置
分兩種情況介紹 選擇壓縮的 選擇不壓縮的
Compression Format是打包后的Build包的壓縮格式
壓縮和不壓縮出來的包展示:
沒有壓縮的
選擇Gzip壓縮的
選擇Gzip壓縮 沒勾壓縮回退的 這種的webgl運行加載會出錯
!
到這里打包以前的所有配置就都已經完了
接下來就是配置本地的服務器測試環境
先介紹第一種 發布時 不壓縮的情況
打包后我們會發現在我們的文件夾里會有一個網址html,
這代表我們的Web包已經打成功了,
那么直接點擊這個html文件運行我們的項目會發現一個報錯
提示我們沒有web服務
這個問題是因為我們Web包必須在有服務器支持的環境下才能夠正常運行,
所以接下來我們要配置我們的包體在本地也就是127.0.0的環境下的服務器托管狀態
配置包體在本地也就是127.0.0的環境下的服務器托管狀態
分兩步
1、啟用我們的電腦的Windows功能
2、創建一個新的網絡(映射到我們自己的包體)
首先要配置(啟用)我們的電腦的Windows功能
控制面板>程序>啟用或關閉windows功能
Internet Information Services左邊的箭頭全選后點擊 確定就可以
接下來就是創建一個新的網絡
我的電腦(右鍵)>管理>服務和應用管理>Internet Information Services>
網站(右鍵 添加一個新的網站)
!
!
點擊確定后就會創建出一個我們的本地路徑的web服務
然后在我們的網頁上輸入127.0.0.1:8080(設置的端口號)
運行后發現還是進不去F12打開調試看一下
還是報錯
我們在網絡里發現我們的.data文件出現了報錯我們雙擊他就會進入這樣的界面
.data的解析出錯
這是因為我們的網站MIME類型不支持解析.data類型文件
需要我們自己在網站的MIME里添加一個.data類型
我們再次回到我們的網站配置界面 點擊我們添加的網站
找到MIME類型雙擊它 雙擊
然后點擊添加
application/octet-stream
點擊確定就添加上了我們的類型
然后再回去我們的網站就可以正常運行了
至此所有環境配置完成
第二種壓縮的發布設置
壓縮后需要在壓縮回退這里勾上
否則web運行時會出錯
然后點擊添加 在把這兩個文件擴展名添加上
!
.unity3d
.unityweb
application/octet-stream
.json (一般情況下在配置好IIS后會有該類型,若沒有就添加)
application/json
然后壓縮的也可以正常運行了
第二種運行Unity打包出web的辦法
1、安裝VSCode
vsCode下載慢的話 可以百度vsCode下載慢 會有辦法的
VSCode下載和安裝教程(超詳細)以及解決VSCode下載速度特別慢的問題_vscode下載太慢-CSDN博客
2、安裝LiveServer插件
這個插件是用來啟動本地服務的 所以可以順利運行webgl工程
3、vscode打開unity發布的webgl
可以直接把文件夾拖到vsCode里 會提示信任 點擊信任就行
4、選擇index,在文本編輯位置,右鍵選擇 Open with Live Server 即可運行webgl
Unity webgl讀取streamingAssetsPath文件夾txt
參考網站
里面有讀取音頻 texture 等都有參考價值
Unity webgl讀取streamingAssetsPath文件夾txt_unitywebgl讀取steamasset-CSDN博客
在StreamingAssets文件夾下新建一個txt 里面隨便寫點東西
也可以寫json一些配置文件用于游戲的配置設置
把這個腳本掛到場景的物體上 在腳本上拖一個Text
這里只演示了一下讀取
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Networking;
using UnityEngine.UI;public class ReadConfig : MonoBehaviour
{public Text ReadText;// Start is called before the first frame updatevoid Start(){StartCoroutine(ReadTxt("ConfigData.txt", ReadTxtCallBack));}private void ReadTxtCallBack(string str){ReadText.text = str;}private IEnumerator ReadTxt(string configName, UnityAction<string> action = null){string path;//手機路徑 需要加file://
#if UNITY_WIN_STANDALONE || UNITY_IPHONE &&!UNITY_EDITORpath ="file://"+ Application.streamingAssetsPath + configName;
#else path = Application.streamingAssetsPath + "/" + configName;
#endifUnityWebRequest unityWebRequest = UnityWebRequest.Get(path);yield return unityWebRequest.SendWebRequest();if (unityWebRequest.error != null)Debug.Log(unityWebRequest.error);else{string content = unityWebRequest.downloadHandler.text;if (action != null)action(content);}}// Update is called once per framevoid Update(){}
}
unity中C#調用js
參考網站
Interaction with browser scripting - Unity 手冊 (unity3d.com)
Unity2021發布WebGL與網頁交互問題的解決 - 自由資訊 (558idc.com)
在項目中使用瀏覽器 JavaScript 的建議方法是將 JavaScript 源代碼添加到項目中,
然后直接從腳本代碼中調用這些函數。
首先是需要在工程的Asset目錄里面建一個Plugins文件夾,
然后在文件夾里面創建一個.txt文件,名字倒是無所謂,
創建好后要把擴展名改成.jslib。
文件需要有如下所示的語法:
這其中只有mergeInto的第二個參數是可以修改的,
第二個參數是一個對象,這個對象里面包含了多個方法的引用,
這些方法(例如:Hello()、BingdeWebGLTexture()等)都是在Unity編程中可以引入的。
這些方法內調用的方法(例如:wiindow.alert()、GLctx.bindTexture()等)都是將來頁面中可以被調用的。
mergeInto(LibraryManager.library, {Hello: function () {window.alert("Hello, world!");},HelloString: function (str) {window.alert(UTF8ToString(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]);},});
具體在Unity編程中引入方法的方式以C#為例
首先需要引入命名空間:
using System.Runtime.InteropServices;
其次需要寫具體引入代碼:
[DllImport("__Internal")] private static extern void Hello();using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;public class CShapCallJs : 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);public bool CanRotate;public float angle = 45;void Start(){Hello();//在js里寫了 出先一個彈窗tipHelloString("這是一個字符串");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());}void Update(){if (CanRotate){this.transform.Rotate(Vector3.up, Time.deltaTime * angle, Space.World);}}public void OnSetStart(){CanRotate = true;}public void OnSetEnd(){CanRotate = false;}
}
js調用unity中C#的代碼
(頁面方法調用Unity內方法的辦法)
有時需要從瀏覽器的 JavaScript 向 Unity 腳本發送一些數據或通知。
建議的做法是調用內容中的游戲對象上的方法。
如果要從嵌入在項目中的 JavaScript 插件執行調用,
可使用以下代碼:
MyGameInstance.SendMessage(objectName, methodName, value);
其中,objectName 是場景中的對象名稱;methodName 是當前附加到該對象的腳本中的方法名稱;value 可以是字符串、數字,也可為空。
很空虛具體怎么用呢
看看打出包來的官方index.html程序 怎么調用
官方用了一個全屏的功能 unityInstance.SetFullscreen(1);
如果是我們自己怎么用呢 ,這個是被定義在了拉姆達表達式里 我們用一個對象給接收出來
就可以用這個Unity實例對象了
具體怎么用呢
我們先創建兩個按鈕測試一下
在 unity打好的webgl包里 的 index.html中 body下創建兩個button
在這里可以看到這兩個按鈕
接下來給這兩個按鈕 用js添加點擊事件
myUnityInstance.SendMessage(“Cube”, “OnSetStart”);
這個SendMessage 對應到了 unity里的方法
接下來看看打印出來的myUnityInstance
這兩個都是熟悉的方法了 打印出來也有個好處是 能看到里面能用到的方法