AssetBundle的加载方式有以下四种:
AssetBundle.LoadFromFile 从本地加载
AssetBundle.LoadFromMemory 从内存加载
WWW.LoadFromCacheOrDownload 加载后放在缓存备用
UnityWebRequest 从服务器加载。
本教程以UnityWebRequest 从服务器加载为例,适用于PC和WebGL运行,具体步骤如下:
1.配置WebGL本地运行环境。
参考主页《WebGL本地运行环境配置》教程。
2.把资源打成AssetBundle包。
参考主页《AssetBundle打包流程》教程,将资源后缀设为.unity3d。
3.将生成的AssetBundles文件夹放在WebGL包所在同级目录下。
4.编写AssetBundle加载资源脚本LoadBundles.cs,挂载到场景。
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
public class LoadBundles : MonoBehaviour
{
string url = "http://196.168.66.251:8011/AssetBundles/";//(本地ip:步骤1中设置的端口号)
AssetBundle assetBundle;
void Start()
{
StartCoroutine(Load("pt101"));
}
IEnumerator Load(string name)
{
//从远程服务器上进行下载
UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url+ name+".unity3d");
//等待文件下载完毕
yield return request.SendWebRequest();
if (!unityWebRequest.isDone)
{
Debug.Log("加载失败");
}
else
{
//加载AssetBundle资源
AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
//根据资源生成文件
//1.图片资源
//Sprite img = bundle.LoadAsset<Sprite>(name);
//2.天空盒材质球资源
//Material mat = bundle.LoadAsset<Material>(name);
//mat.shader = Shader.Find(mat.shader.name);//加载天空盒材质球时必加,否则材质会丢失!
//RenderSettings.skybox = mat;
//3.模型资源
GameObject go = Instantiate(bundle.LoadAsset<GameObject>(name));
//初始化
go.transform.position = new Vector3(0, 0, 0);
//释放资源
request.Dispose();
Debug.Log("加载完成");
yield return new WaitForSeconds(1f);
//卸载资源 包含所有Load创建出来的对象
//bundle.Unload(true);
//卸载资源 除了Load创建出来的对象
bundle.Unload(false);
//释放已加载的资源Object
//Resources.UnloadAsset(go);
//卸载所有没有被场景引用的资源对象
//Resources.UnloadUnusedAssets();
Debug.Log("卸载完成");
}
}
}
5.运行后能成功加载资源。
注:查看自己本地ip方法:
搜索框输入“cmd”,打开命令提示符窗口,在窗口里输入“ipconfig”,显示的IPv4地址即为自己的本地ip。
注:若AssetBundle加载Cubemap和Panoramic类型的天空盒,打包WebGL运行时材质丢失显示粉色,解决方法如下:
项目里Edit->Project Settings->Graphics->Always Included Shaders里边需要添加3种天空盒材质。