前几天做了AssentBundle的例子,遇到了问题,在论坛上问了三天都没人解答,最后在一个朋友的帮助下解决了。下面介绍AssentBundle。

AssetBundles让你通过WWW类流式加载额外的资源并在运行时实例化它们。AssetBundles通过BuildPipeline.BuildAssetBundle创建。

看了雨凇MOMO的关于 AssetBundles的帖子,受益很多,但是他把资源全达成.assetbundle 二进制格式,与Unity帮助脚本中不一样,Unity帮助文档中打包和加载的文件后缀名都是.unity3d格式,而且网上其他人也都用的.unity格式,所以我也就打成.unity3d格式。

打包AssentBundle:

最核心的方法其实就它:

BuildPipeline.BuildAssetBundle (obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies)

不过这是默认的电脑上打包的资源只可以电脑上用

安卓打包需要添加参数:

BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets,BuildTarget.Android);

Iphone打包也需要添加参数:

 BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets,BuildTarget.iPhone);

需要在项目文件根目录Assets下新建Editor文件夹,新建C#脚本“ExportAssetBundles”。

using UnityEngine;

using System.Collections;

using UnityEditor;//必须引用此类

public class ExportAssetBundles : MonoBehaviour

{

    /// <summary>

    /// 将所选择的的物体和物体有依赖关系的对象一起打包

    /// </summary>

    [MenuItem("Assets/Build AssetBundle From Selection - Track dependencies")]

static void ExportResource()

    {

        // Bring up save panel

string path = EditorUtility.SaveFilePanel("Save Resource", "", "New Resource", "unity3d");

if (path.Length != 0)

        {

            // Build the resource file from the active selection.

            Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);

            BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies |

BuildAssetBundleOptions.CompleteAssets);

            Selection.objects = selection;

}

}

/// <summary>

    /// 只打包选择的物体

    /// </summary>

    [MenuItem("Assets/Build AssetBundle From Selection - No dependency tracking")]

static void ExportResourceNoTrack()

    {

        // Bring up save panel

        string path = EditorUtility.SaveFilePanel("Save Resource", "", "New Resource", "unity3d");

        if (path.Length != 0)

        {

            // Build the resource file from the active selection.

            BuildPipeline.BuildAssetBundle(Selection.activeObject, Selection.objects, path);

        }

    }

}

保存之后,选中项目中的文件,鼠标右键或者Assent菜单下都会有这两个选项,根据自己的需要打包即可。

下载AssentBundle:Assetbundle是可以同时放在服务器或者本地的,无论放在哪里两种下载读取的方式是完全一样的。所以我建议在做unity项目的时候开始就把资源放在Assetbundle中在本地来做,等做的差不多了直接把Assetbundle放在服务器上,因为两种读取的方式完全一样,这样以后更新资源会方便很多。 using UnityEngine;

using System.Collections;public class assentBuntleScript : MonoBehaviour

{   

    public static readonly string URL = http://"+"网址";网络路径

    //public static readonly string URL = "file://" + Application.dataPath+"/mm.unity3d";//本地路径    void OnGUI()

    {

        if(GUILayout.Button("下载资源"))

        {

            StartCoroutine(loadBundleOBject(URL));

        }

    }    IEnumerator loadBundleOBject(string url)

    {

        WWW date = new WWW(url);

        yield return date;

        Instantiate(date.assetBundle.mainAsset);//实例化加载的资源,我加载的是个模型。

        date.assetBundle.Unload(false);

    }

}

下载类WWW

WWW bundle = new WWW(path);

这样的做法是通过一个路径进行下载(无论是服务器路径还是本地路径下载操作都一样)但是bundle只能保存在内存中,也就是退出游戏在进入还得重新下,很显然在游戏中我们不能使用这种方式。

IEnumerator loadBundleOBject(string url)

    {

        WWW date = WWW.LoadFromCacheOrDownload(url,5);

        yield return date;

        Instantiate(date.assetBundle.mainAsset);//实例化加载的资源,我加载的是个模型。

        date.assetBundle.Unload(false);

    }

使用的方法是WWW.LoadFromCacheOrDownload(path,5);参数1:服务器或者本地下载地址 参数2:版本号Unity会下载Assetbundle本地中,它的工作原理是先通过(版本号和下载地址)先在本地去找看有没有这个Assetbundle,如果有直接返回对象,如果没有的话,在根据这个下载地址重新从服务器或者本地下载。这里版本号起到了很重要的作用,举个例子,同一下载地址版本号为1的时候已经下载到本地,此时将版本号的参数改成2
那么它又会重新下载,如果还保持版本号为1那么它会从本地读取,因为本地已经有版本号为1的这个Assetbundle了。你不用担心你的资源本地下载过多,也不用自己手动删除他们,这一切的一切Unity会帮我们自动完成,它会自动删除掉下载后最不常用的Assetbundle ,如果下次需要使用的话只要提供下载地址和版本后它会重新下载。(转自雨松MOMO研究院)

        Assetbundle 中的脚本,在移动平台下Assetbundle里面放的脚本是不会被执行的,在手机上将Assetbundle下载到本地后,加载进游戏中Prefab会自动在本地找它身上挂着的脚本,他是根据脚本的名来寻找,如果本地有这条脚本的话,Prefab会把这个脚本重新绑定在自身,并且会把打包前的参数传递进来。如果本地没有,身上挂的条脚本永远都不会被执行。(转自雨松MOMO研究院)

最后再说说我遇到的问题,本地加载.unity3d的资源没问题,但是我挂到IIS上就失败了,显示404错误,找不到资源,无法实例化。这就需要配置服务器的MIME了,因为服务器不识别.unity3d格式的资源,所以服务器不响应请求,所以就下不下来。

    这样就行了,可以下载.unity3d,这就是困扰我三天的问题啊,怎么都下载不了,最终是这么个问题。

Unity3D基础学习之AssetBundle 资源包创建与加载的更多相关文章

  1. Assetbundle创建与加载

    [Assetbundle创建与加载] Unity有两种动态加载机制:一种是Resource.Load.一种是AssetBundle.Assetbundle是Unity Pro提供的功能,它可以把多个游 ...

  2. Unity学习笔记(5):动态加载Prefab

    第一种方法,从Resources文件夹读取Prefab Assets/Resources文件夹是Unity中的一个特殊文件夹,在博主当前的认知里,放在这个文件夹里的Prefab可以被代码动态加载 直接 ...

  3. Android四大组件之Activity(活动)及其布局的创建与加载布局

    Android四大组件之Activity(活动)及其布局的创建与加载布局 什么是Activity ? 活动(Activity)是包含用户界面的组件,主要用于和用户进行交互的,一个应用程序中可以包含零个 ...

  4. 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址

    驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...

  5. ECshop语言包lang的加载原理

    当前使用的ecshop的版本:2.7.3,ecshop 2.7.3版本的网店系统的语言包的位置是ecshop文件下 languages/xxx/   其中的xxx表示各种语言的文件夹,里面存放指定语言 ...

  6. dubbo的jmeter压测时jar包的热加载/动态加载

    在做dubbo的jmeter压测时,需要把jar包放入jmeter的lib/ext目录下,但是jmeter启动的时候会自动加载这个目录lib目录及lib/ext目录,这样启动后放入这些目录下的jar包 ...

  7. 【SpringBoot基础系列-实战】如何指定 bean 最先加载(应用篇)

    [基础系列-实战]如何指定 bean 最先加载(应用篇) 在日常的业务开发中,绝大多数我们都是不关注 bean 的加载顺序,然而如果在某些场景下,当我们希望某个 bean 优于其他的 bean 被实例 ...

  8. Electron – 基础学习(1): 环境安装、创建项目及入门

    这几天到年底了,公司也没啥事,闲着就到处瞅瞅.记得上一家公司的时候用 Electron+ng1 写过项目,只是那个时候项目框架都是别人搭的,自己只负责写功能,对Electron没啥认识. 这几天想着反 ...

  9. Unity3D基础学习 加载场景时隐藏物体,点击显示时显示物体

    隐藏物体有两种方法,一是设置Meshrender为False,即不渲染物体. 二是设置物体为False,禁用物体,我使用的第二种. 当场景中需要隐藏的物体很多时,我们可以添加一个层来表示需要隐藏的物体 ...

随机推荐

  1. Linq101-Miscellaneous

    using System; using System.Collections.Generic; using System.Linq; namespace Linq101 { class Miscell ...

  2. (转)Android调用系统自带的文件管理器进行文件选择并获得路径

    Android区别于iOS的沙盒模式,可以通过文件浏览器浏览本地的存储器.Android API也提供了相应的接口. 基本思路,先通过Android API调用系统自带的文件浏览器选取文件获得URI, ...

  3. cxf webservice异步调用

    http://blog.csdn.net/changpingchen/article/details/9048347 http://www.oschina.net/question/780719_12 ...

  4. React 点击删除列表中对应项(React 获取DOM中自定义属性)

    点击删除按钮,删除列表中对应项本来是React比较基础的应用,可是应用情况变得复杂了以后,我还真想了一会儿才搞定. 简化一下应用场景:点击新增按钮,增加一条输入框,点击输入框旁边的按钮,删除该输入框( ...

  5. 【USACO 3.3.1】骑马修栅栏

    [描述] Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入 ...

  6. MPICH2在两台Ubuntu上安装(用mpd做进程管理)

    本文在经过大量的实验终于不负众望成功的在两台Ubuntu 12.04上部署MPI的一个小型集群,MPICH2所用版本为mpich2-1.4.1,下载地址:http://www.mcs.anl.gov/ ...

  7. PHP之路——验证码实现

    验证码生成并保存到session <?php //开始session session_start(); //画布大小 $image = imagecreate(100, 40); $color ...

  8. 10 - 删除vtkDataObject中的Update Extent方法 VTK 6.0 迁移

    VTK6 引入了许多不兼容的变.其中之一是删除vtkDataObject中所有有关管道的方法.下面列出来的就是其中的一些方法: SetUpdateExtent(int piece, int numPi ...

  9. C++学习笔记--Season 1

    #include <iostream> //预处理 注意:iostream不带.h int main() { std::cout << "Aloha World&qu ...

  10. infinitescroll 通过无限制分页(json方式完整代码)

    @{ ViewBag.Title = " ";} <style type="text/css"> #infscr-loading { text-al ...