AssetBundle动态加载外部资源

AssetBundle的加载方式有以下四种:

1.AssetBundle.LoadFromFile 从本地加载

2.AssetBundle.LoadFromMemory 从内存加载

3.WWW.LoadFromCacheOrDownload 加载后放在缓存备用

4.UnityWebRequest 从服务器加载。

本教程以UnityWebRequest 从服务器加载为例,适用于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 = "/AssetBundles/";//WebGL包运行时
    string url = "http://localhost:8011/AssetBundles/";//unity内部运行时(端口号为自己设置)
    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.运行后能成功加载资源。

注:若AssetBundle加载Cubemap和Panoramic类型的天空盒,打包WebGL运行时材质丢失显示粉色,解决方法如下:

项目里Edit->Project Settings->Graphics->Always Included Shaders里边需要添加3种天空盒材质。

猜你喜欢

转载自blog.csdn.net/qq_2633600317/article/details/134925347