Unity WebGL創建和加載 AssetBundle 場景
Unity中創建兩個場景
在Unity中創建一個主場景Main,一個測試場景CubeScene,在CubeScene場景中可隨意添加幾個物體,如下圖所示:
使用腳本創建AssetBundle
新建一個C#腳本,命名爲CreateAssetBundle.cs,代碼如下:
using UnityEngine;
using UnityEditor;
public class CreateAssetBundle : Editor
{
[MenuItem("Assets/Build AssetBundle Scene")]
static void BuildScene() {
string[] levels = {"Assets/Scenes/CubeScene.unity"};
BuildPipeline.BuildPlayer(levels, Application.dataPath+"/CubeScene.unity3d",
BuildTarget.WebGL, BuildOptions.BuildAdditionalStreamedScenes);
AssetDatabase.Refresh();
}
}
在 Unity 編輯器 Assets 根目錄下創建一個 Editor 文件夾,將這個腳本放進去。右鍵空白處,Build AssetBundle Scene,即可創建一個名爲 CubeScene.unity3d 的AssetBundle。
服務器設置
我申請的是阿里雲的ECS雲服務器,Web服務器使用的是Tomcat。我們的目的是:訪問服務器上的 .unity3d 文件時,能夠下載到本地。所以,修改tomcat/conf下的 web.xml 文件,添加MIME 處理方式,如下所示:
在 tomcat/webapps 下,創建一個AssetBundle文件夾,將上節創建的 CubeScene.unity3d 文件放到這個文件夾,如下所示:
使用腳本讀取服務器上的AssetBundle
創建一個 LoadWebAsset.cs 腳本,並將其掛載到主場景Main的相機上(或任意物體),注意將url中的DomianName替換成自己的網址。代碼如下:
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.Networking;
public class LoadWebAsset : MonoBehaviour
{
void Start ()
{
StartCoroutine(LoadSceneFromWeb());
}
IEnumerator LoadSceneFromWeb()
{
string url = "http://DomainName/AssetBundle/CubeScene.unity3d";
Debug.Log(url);
UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);
yield return request.SendWebRequest();
AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
string[] scenePath = ab.GetAllScenePaths();
SceneManager.LoadScene(scenePath[0]);
}
}
發佈並測試
發佈場景時,只選擇主場景 Main。
發佈完成後,將其放到服務器上,然後再訪問其網址即可。