1.WebGL打包設(shè)置
1.1 壓縮包問(wèn)題
構(gòu)建完的包里是壓縮包,如果服務(wù)器里沒(méi)有解壓縮的工具,就會(huì)無(wú)法打開項(xiàng)目

勾上解壓縮回退,即可解決該問(wèn)題

一般選擇gzip壓縮
1.2 異常處理
直接關(guān)閉異常,提高性能
1.3 WebGL模板設(shè)置

我們經(jīng)常需要修改Unity默認(rèn)的加載界面,避免每次構(gòu)建后重新修改Html文件,可以做一個(gè)自己的模板

在Assets文件夾下創(chuàng)建文件夾 WebGLTemplates
首先選擇默認(rèn)模板Default構(gòu)建一次,然后找到Build里的文件,把TemplateData文件夾和index.html復(fù)制進(jìn)來(lái)(這個(gè)是官方默認(rèn)的模板)進(jìn)行修改即可
可以在script.onload函數(shù)里進(jìn)行添加邏輯

該行代碼可以強(qiáng)制瀏覽器保存緩沖區(qū),提高性能
2.資源處理問(wèn)題
2.1 中文字不顯示=默認(rèn)字體Arial
在WebGL項(xiàng)目構(gòu)建后,使用Arial字體的文本中,中文字符將無(wú)法顯示,所以我們需要手動(dòng)更改字體文件
以windows為例

在這個(gè)文件夾中有默認(rèn)的字體文件,我們選取一個(gè)放入項(xiàng)目中,用來(lái)顯示中文字即可
2.2 Video文件無(wú)法播放
Video文件會(huì)在構(gòu)建時(shí)被壓縮,導(dǎo)致無(wú)法使用
我們需要使用url方式去加載視頻播放(邊下邊播)
1.視頻文件放在cdn上直接加載
2.創(chuàng)建StreamingAssets文件夾(Assets目錄下)
在這個(gè)文件夾下的資源不會(huì)被unity處理,直接打包
//資源放在StreamingAssets的Video文件夾中
m_videoplayer.url = Application.streamingAssetsPath + "/Video/scene.mp4";
m_videoplayer.Play();
使用Application.streamingAssetsPath獲取目錄
在WebGL中,返回的是當(dāng)前目錄(".")
不同的平臺(tái)返回的路徑不同
3.場(chǎng)景光照不對(duì)
在多場(chǎng)景的情況下,構(gòu)建后會(huì)出現(xiàn) 跳轉(zhuǎn)到其他場(chǎng)景中時(shí),發(fā)現(xiàn)光照不對(duì)
(多半是構(gòu)建時(shí),打開的場(chǎng)景光照正確,沒(méi)有打開的場(chǎng)景光照錯(cuò)誤)
這個(gè)時(shí)候需要烘焙光照貼圖,即可解決該問(wèn)題
4.與瀏覽器js腳本進(jìn)行交互
4.1 C#調(diào)用js
在Assets目錄下創(chuàng)建文件夾Plugins
創(chuàng)建文件 js(name).jslib

mergeInto(LibraryManager.library, {
Hello: function (v) {
testFunc(Pointer_stringify(v));
},
startRecord : function() {
startRecord();
},
stopRecord : function() {
stopRecord();
},
});
基于最新的unity官方文檔
使用mergeInto聲明js腳本方法
在C#腳本中使用
//命名空間
using System.Runtime.InteropServices;
[DllImport("__Internal")]
private static extern void Hello();
使用[DllImport()] 聲明js里的hello方法,即可直接調(diào)用
注意的是字符串傳遞需要使用 Pointer_stringify(string v) 方法進(jìn)行一個(gè)轉(zhuǎn)換
4.2 js調(diào)用C#
如果要從嵌入在項(xiàng)目中的 JavaScript 插件執(zhí)行調(diào)用,可使用以下代碼
//__objectName__ 是場(chǎng)景中的對(duì)象名稱;__methodName__ 是當(dāng)前附加到該對(duì)象的腳本中的方法名稱;__value__ 可以是字符串、數(shù)字,也可為空。
unityInstance.SendMessage(objectName, methodName, value);
//e.g.
unityInstance.SendMessage('MyGameObject', 'MyFunction');
unityInstance.SendMessage('MyGameObject', 'MyFunction', 5);
unityInstance.SendMessage('MyGameObject', 'MyFunction', 'MyString');