AssetBundle,我入门了

老样子,先分享一个链接,主题就是 AssetBundle 的创建和加载。

http://www.cnblogs.com/tekkaman/p/4040081.html

首先,不负责任的说一下,创建 AssetBundle 的代码原链接找不到了,所以就不上了。


1、AssetBundle 的创建。这里我采用了 BuildPipline 来完成创建,并写了一个自定义菜单。

创建一个脚本,代码如下

using UnityEngine;
using UnityEditor;  //  需要手动添加此项

public class CustomEditor : MonoBehaviour {

    [MenuItem("Custom Editor/Build AssetBundles")]  //  菜单的层次和名称
    static void CreateAssetBundlesMain()    //  菜单执行的操作,一定要是 static 
    {
        BuildPipeline.BuildAssetBundles(    //  为选中的对象创建 AssetBundle 
            "Assets/StreamingAssets",       //  AssetBundle 创建完成后存储的位置
            BuildAssetBundleOptions.None,   //  因为 CollectDependency 在 5.4 版本以后已经成为默认包含的选项,所以这里为 None
            targetPlatform : BuildTarget.StandaloneWindows64);  //  创建的 AssetBundle 对应的平台
    }

    [MenuItem("Custom Editor/Clean Cache")]	//  清除缓存
    static void CleanCache()
    {
        Caching.CleanCache();               //  清除缓存
        Debug.LogFormat("Clean cache finished.");
    }
}

这样就完成了 Custom Editor / Build AssetBundles 和 Custom Editor / Clean Cache 两个菜单项的创建。

创建 AssetBundle 的操作: 

I、在 Project 视图中选中要创建 AssetBundle 的资源(可以是图片、声音、动画等,也可以是文件夹),在右下角添加 Asset Label,如图所示

II、得到的 AssetBundle 如下图所示:


说明的是:需要对每个资源分配 Asset Label,同时,加载过程中需要考虑依赖关系,先加载被依赖的资源。

2、加载时的操作:

两种方式加载,第一种是直接从本地的 AssetBundle 文件中加载,要求创建时不能压缩,关键操作的脚本如下:

	AssetBundle asset = AssetBundle.LoadFromFile("Assets/StreamingAssets/mut.prb");
        Object mutObj = asset.LoadAsset("MutPrb");

第二种方式,使用 WWW 完成下载和加载,关键操作分为两部分

I、下载资源文件的函数:

    /// <summary>
    /// 从给定地址下载并加载资源
    /// </summary>
    /// <param name="path"></param>
    /// <returns></returns>
    IEnumerator LoadWWW(string path)
    {
        WWW www = WWW.LoadFromCacheOrDownload(path, 0);
        yield return www;
        if(null == www)
        {
            Debug.LogFormat("Null www");
            yield break;
        }
        if (!string.IsNullOrEmpty( www.error))
        {
            Debug.LogFormat("Error found : " + www.error);
            yield break;
        }
        asset = www.assetBundle;    //  获得 AssetBundle
        mutObj = asset.LoadAsset("MutPrb");   //  从 AssetBundle 中加载指定名称的资源
    }
函数返回值为 IEnumerator,调用时使用 StartCoroutine 调用。

II、下载文件并加载资源

	StartCoroutine(LoadWWW("file:///G:/workspace/Demos/Assets/StreamingAssets/mut.prb"));	//  一定要使用 file:/// 才能从本地进行下载
完成加载后,可以从 Object 进行实例化得到保存的预制体,如下:
	GameObject obj = Instantiate(mutObj) as GameObject; //  实例化一个对象

到这里,已经可以实现将资源导出为 AssetBundle 然后再加载近场景的过程了,接下来看完整脚本。

3、加载时挂在游戏对象上的完整脚本

using UnityEngine;
using System.Collections;

public enum LoadMode
{
    www,        //  使用 WWW 从服务器下载资源并进行实例化
    fromFile,   //  直接从本地 AssetBundle 文件加载
}

public class CreateMutWhereYouHit : MonoBehaviour {
    AssetBundle asset;
    Object mutObj;
    LoadMode loadMode = LoadMode.www;

    // 初始化时完成加载
    void Start () {
        Caching.CleanCache();   //  清除缓存
        Debug.LogFormat("Persistent data path is : {0}", Application.persistentDataPath.ToString());
        switch (loadMode)
        {
            case LoadMode.fromFile: //  直接从本地 AssetBundle 文件加载
                asset = AssetBundle.LoadFromFile("Assets/StreamingAssets/mut.prb");
                mutObj = asset.LoadAsset("MutPrb");
                break;
            case LoadMode.www:      //  使用 WWW 从服务器下载资源并进行实例化
                StartCoroutine(LoadWWW("file:///G:/workspace/Demos/Assets/StreamingAssets/mut.prb"));   
                                    //  一定要使用 file:/// 才能从本地进行下载
                break;
        }
    }
	
	// Update is called once per frame
    void Update () {
        if (Input.GetMouseButtonDown(0))
        {
            Vector3 iactPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);  //  获取鼠标点击的屏幕位置变换到世界坐标系下的位置
            GameObject obj = Instantiate(mutObj) as GameObject; //  实例化一个对象
            iactPos.z = obj.transform.localPosition.z;
            obj.transform.localPosition = iactPos;
            obj.SetActive(true);
        }
    }

    void OnDestroy()
    {
        if(null!=asset)
            asset.Unload(true); //  true 的时候,会将在使用的资源也释放。 false 仅释放内存中的镜像
    }

    /// <summary>
    /// 从给定地址下载并加载资源
    /// </summary>
    /// <param name="path"></param>
    /// <returns></returns>
    IEnumerator LoadWWW(string path)
    {
        WWW www = WWW.LoadFromCacheOrDownload(path, 0);
        yield return www;
        if(null == www)
        {
            Debug.LogFormat("Null www");
            yield break;
        }
        if (!string.IsNullOrEmpty( www.error))
        {
            Debug.LogFormat("Error found : " + www.error);
            yield break;
        }
        asset = www.assetBundle;    //  获得 AssetBundle
        mutObj = asset.LoadAsset("MutPrb");   //  从 AssetBundle 中加载指定名称的资源
    }

}

完整脚本的功能是在鼠标点击的位置创建一个预制体,这里放出完整脚本的目的,是为了让读者能够查找一些我疏忽而未指出的细节。


关于链接,讲到了很多选项的作用,另外再推荐一个链接:
http://www.xuanyusong.com/archives/2405

这个是雨凇的,其实经常看雨凇的 Unity 先关的东西,但是没有怎么推荐过雨凇的链接,是有原因的:

1、每次其都是一个比较具体的实验,有可参考的东西,但是毕竟是方向性的东西,所以不够;

2、感觉他代入的感觉跟我理解的走势不太一致,这个纯属个人原因。

不过他的东西还是很多,而且是这方面的大牛,所以还是给大家推荐一下。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值