Unity3D基础学习之AssetBundle 资源包创建与加载
前几天做了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 资源包创建与加载的更多相关文章
- Assetbundle创建与加载
[Assetbundle创建与加载] Unity有两种动态加载机制:一种是Resource.Load.一种是AssetBundle.Assetbundle是Unity Pro提供的功能,它可以把多个游 ...
- Unity学习笔记(5):动态加载Prefab
第一种方法,从Resources文件夹读取Prefab Assets/Resources文件夹是Unity中的一个特殊文件夹,在博主当前的认知里,放在这个文件夹里的Prefab可以被代码动态加载 直接 ...
- Android四大组件之Activity(活动)及其布局的创建与加载布局
Android四大组件之Activity(活动)及其布局的创建与加载布局 什么是Activity ? 活动(Activity)是包含用户界面的组件,主要用于和用户进行交互的,一个应用程序中可以包含零个 ...
- 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址
驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...
- ECshop语言包lang的加载原理
当前使用的ecshop的版本:2.7.3,ecshop 2.7.3版本的网店系统的语言包的位置是ecshop文件下 languages/xxx/ 其中的xxx表示各种语言的文件夹,里面存放指定语言 ...
- dubbo的jmeter压测时jar包的热加载/动态加载
在做dubbo的jmeter压测时,需要把jar包放入jmeter的lib/ext目录下,但是jmeter启动的时候会自动加载这个目录lib目录及lib/ext目录,这样启动后放入这些目录下的jar包 ...
- 【SpringBoot基础系列-实战】如何指定 bean 最先加载(应用篇)
[基础系列-实战]如何指定 bean 最先加载(应用篇) 在日常的业务开发中,绝大多数我们都是不关注 bean 的加载顺序,然而如果在某些场景下,当我们希望某个 bean 优于其他的 bean 被实例 ...
- Electron – 基础学习(1): 环境安装、创建项目及入门
这几天到年底了,公司也没啥事,闲着就到处瞅瞅.记得上一家公司的时候用 Electron+ng1 写过项目,只是那个时候项目框架都是别人搭的,自己只负责写功能,对Electron没啥认识. 这几天想着反 ...
- Unity3D基础学习 加载场景时隐藏物体,点击显示时显示物体
隐藏物体有两种方法,一是设置Meshrender为False,即不渲染物体. 二是设置物体为False,禁用物体,我使用的第二种. 当场景中需要隐藏的物体很多时,我们可以添加一个层来表示需要隐藏的物体 ...
随机推荐
- Modernizr——为HTML5和CSS3而生!
原文地址:http://www.alistapart.com/articles/taking-advantage-of-html5-and-css3-with-modernizr/ 堂主译文地址:ht ...
- 让ie8支持foreach
if ( !Array.prototype.forEach ) { Array.prototype.forEach = function forEach( callback, thisArg ) { ...
- 用angular来思考问题How do I “think in AngularJS” if I have a jQuery background?
[翻译]How do I “think in AngularJS” if I have a jQuery background? 1. 不要先设计页面,然后再使用DOM操作来改变它的展现 在jQuer ...
- UITextView textViewShouldEndEditing
最近做到UITextView, 在取消键盘事件上我以为和UITextField差不多,于是我这样写: UITextView *textView = [[UITextView alloc] initWi ...
- 关于Core Data的一些整理(四)
关于Core Data的一些整理(四) 调用Core Data文件中的Request模板进行条件匹配 //获取ObjectModel相当于获取Core Date文件 NSManagedObjectMo ...
- C# == 和equals()区别
如以下代码: ? 1 2 3 4 5 int age = 25; short newAge = 25; Console.WriteLine(age == newAge); //true Consol ...
- 离线安装maven
maven离线安装 1.在eclipse根目录下新建两个文件夹,links和myplugins,myplugins文件名可以自定义 2.下载maven http://pan.baidu.com/s/1 ...
- python学习第十六天 --继承进阶篇
这一章节主要讲解面向对象高级编程->继承进阶篇,包括类多继承介绍和继承经典类和新式类属性的查找顺序不同之处. 多继承 上一章节我们讲到继承,子类继承父类,可以拥有父类的属性和方法,也可以进行扩展 ...
- 如何让div出现滚动条
由于DIV本身属性并没有滚动条设置,但是有些地方的设计却需要出现滚动条,如何实现呢?本人采用CSS样式来控制显示!而且也很简单,代码如下: <div style="OVERFLOW-Y ...
- function的粗浅理解
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...