如何使用BuildAssetBundles动态加载资源(2020.1.1f)

1. Unity动态加载资源的几种方式

(1) 通过Resources模块,调用它的load函数:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不关有没有场景引用,都会将其全部打入到安装包中。
()
(2) 通过bundle的形式:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object。

(3) 通过AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的

比较:Resources的方式需要把所有资源全部打入安装包,这对游戏的分包发布(微端)和版本升级(patch)是不利的,所以unity推荐的方式是不用它,都用bundle的方式替代,把资源达成几个小的bundle,用哪个就load哪个,这样还能分包发布和patch,但是在开发过程中,不可能没更新一个资源就打一次bundle,所以editor环境下可以使用AssetDatabase来模拟,这通常需要我们封装一个dynamic resource的loader模块,在不同的环境下做不同实现。

2. 使用AssetBundle打包并加载

(1)打包

  1. 在Assets文件夹内创建一个文件夹并命名为Editor。
  2. 将以下代码放入Editor(注意类名和文件名相同)
using UnityEditor;
using System.IO;
using UnityEngine;

public class CreateAssetBundles
{
    //添加的按钮位于Assets/Build AssetBundles
    [MenuItem("Assets/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
    	//存储路径,根据需要自己改变也可
        string assetBundleDirectory = Path.Combine(Application.streamingAssetsPath);
        if (!Directory.Exists(assetBundleDirectory))
        {
            Directory.CreateDirectory(assetBundleDirectory);
        }
        BuildPipeline.BuildAssetBundles(assetBundleDirectory,
                                        BuildAssetBundleOptions.None,
                                        BuildTarget.StandaloneWindows);
    }
}
  1. 在场景内新建一个物体,并将其变为预制体(拖入到Assets内即可),并删除Hierarchy内的物体。
  2. 在Assets内找到这个物体,在Inspector内最下面找到AssetBundle,有两个下拉菜单。点击第一个,New一个自己喜欢的名字,并选中。
    像这样
  3. 保存一下场景,在上面菜单中找到Assets/Build AssetBundles,点击。
  4. 等待一下,就会发现Assets内出现了一个新文件夹,里面就是我们要的包了。到这里打包工作就完成了。
    在这里插入图片描述

(2)加载(本地)

  1. 在场景中创建一个空物体,并附上以下代码:(代码中有需要改的名字)
using UnityEngine;
using System.Collections;
using System.IO;

public class LoadFromFileExample : MonoBehaviour
{
    void Start()
    {
    	//自己命名的bundle
        var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "firstbundle"));
        if (myLoadedAssetBundle == null)
        {
            Debug.Log("Failed to load AssetBundle!");
            return;
        }
		//自己物体的名字
        var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("Sphere");
        Instantiate(prefab);

        myLoadedAssetBundle.Unload(false);
    }
}
  1. 点击运行,即可看到物体已经加载出来。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值