AssetBundle使用

2022/7/23 23:28:24

本文主要是介绍AssetBundle使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

AssetBundle是什么?

AssetBundle是Unity资源加载的一个重要使用工具,一般在做游戏的时候,如果将所有资源都放在本地,常常会把游戏做的非常大,AssetBundle是将资源放到了服务器上,当需要加载资源的时候,将资源从服务器中下载下来使用


使用 AssetBundle 只需四步:
1.设置包名
2.打包
3.加载包内资源


1.设置要打包的资源
可以手动设置:

也可以在代码里面设置:

AssetImporter asset = AssetImporter.GetAtPath("Assets/GameRes/Cube.prefab");
asset.SetAssetBundleNameAndVariant("cube", "a");

2.进行打包

我们可以制作一个Editor下的工具类来完成我们打包的功能

using System.Collections;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

public class MyTool : Editor
{
    [MenuItem("Tools/CreateBundle")]
    static void CreateAssetBundle()
    {
        string path = "AssetBundle";

        //如果目录不存在创建目录
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }
        //路径 打包方式 目标平台
        BuildPipeline.BuildAssetBundles(path,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);
        AssetDatabase.Refresh();
    }
}

 打包成功

其中manifest是一个清单,记录了资源信息和依赖项的一些内容


3.进行打包

本地加载一共有四种方式 如下

1、内存

2、文件

3、WWW

4、UnityWebRequest(推荐)

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;

public class LoadAssetBundle : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //StartCoroutine(FromMemery());
        //StartCoroutine(FromFile());
        //StartCoroutine(AllFromFile());
        //StartCoroutine(FromWWW2());
        StartCoroutine(FromUnityWebRequest());
    }

    //读取方式 1、内存 2、文件 3、WWW 4、unityWebRequest

    //内存
    IEnumerator FromMemery()
    {
        string path = @"E:\learn\Unity\AnimTest\AssetBundle\model.u3d";
        byte[] bytes = File.ReadAllBytes(path);
        AssetBundle assetBundle = AssetBundle.LoadFromMemory(bytes);
        GameObject go = assetBundle.LoadAsset("Bike") as GameObject;
        Instantiate(go);
        yield return null;
    }

    //文件
    IEnumerator FromFile()
    {
        string path = @"E:\learn\Unity\AnimTest\AssetBundle\model.u3d";
        AssetBundle assetBundle = AssetBundle.LoadFromFile(path);
        GameObject go = assetBundle.LoadAsset("Step") as GameObject;
        Instantiate(go);
        yield return null;
    }

    //读取多个文件
    IEnumerator AllFromFile()
    {
        string path= @"E:\learn\Unity\AnimTest\AssetBundle\model.u3d";
        AssetBundle assetBundle = AssetBundle.LoadFromFile(path);
        object[] objs=assetBundle.LoadAllAssets();
        Debug.Log(objs.Length);
        foreach (var go in objs)
        {
            GameObject.Instantiate(go as GameObject);
        }
        yield return null;
    }


    //WWW 无缓存
    IEnumerator FromWWW()
    {
        string path = @"file:///E:\learn\Unity\AnimTest\AssetBundle\model.u3d";
        WWW www = new WWW(path);
        yield return www;

        //如果有错误
        if (!string.IsNullOrEmpty(www.error))
        {
            Debug.Log(www.error);
            yield break;
        }
        AssetBundle assetBundle = www.assetBundle;
        GameObject go = assetBundle.LoadAsset("Step") as GameObject;
        Instantiate(go);

        yield return null;
        www.Dispose();
    }

    IEnumerator FromWWW2()
    {
        string path = @"file:///E:\learn\Unity\AnimTest\AssetBundle\model.u3d";

        //缓存加载
        WWW www = WWW.LoadFromCacheOrDownload(path,1);
        yield return www;

        //如果有错误
        if (!string.IsNullOrEmpty(www.error))
        {
            Debug.Log(www.error);
            yield break;
        }
        AssetBundle assetBundle = www.assetBundle;
        GameObject go = assetBundle.LoadAsset("Step") as GameObject;
        Instantiate(go);

        yield return null;
        www.Dispose();
    }
    //unityWebRequest

    IEnumerator FromUnityWebRequest()
    {
        string path = @"file:///E:\learn\Unity\AnimTest\AssetBundle\model.u3d";
        UnityWebRequest unityWebRequest = UnityWebRequestAssetBundle.GetAssetBundle(path);
        yield return unityWebRequest.SendWebRequest();
        AssetBundle assetBundle = DownloadHandlerAssetBundle.GetContent(unityWebRequest);

        GameObject go = assetBundle.LoadAsset("Step") as GameObject;
        Instantiate(go);

        yield return null;
    }
}

利用服务器加载 我们可以通过IIS服务器配置的方式来加载

此时路径就改为使用http的路径



这篇关于AssetBundle使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程