【Unity】Unity中资源动态载入的两种方式之AssetsBundle
首先要说的是,我们的project中有2个脚本。各自是:
Build(编辑器类脚本。无需挂载到不论什么物体)。可是必需要把Build脚本放到Editor目录中
Load脚本,挂载到摄像机上<pre name="code" class="csharp">using UnityEngine;
using System.Collections;
using UnityEditor; public class Build : MonoBehaviour
{
// 编辑器类
[MenuItem("Build/BuildAsset")]
// 打包单个资源的方法
static void BuildAsset ()
{
// 将物体打包到/AssetsBundles路径下同一时候命名为Cube1.assetbundle
string targetPath = Application.dataPath + "/AssetsBundles/Cube1.assetbundle";
// BuildPipeline 打包用 Selection (Selection.activeObject 在编辑器中选中的对象)
// 第二个參数null,是打包多个资源的时候用的。多个资源就是数组。单个资源的时候这个參数不用写
// 第三个參数是路径。你想把这个资源放到什么位置就写什么,而且还要命名为.assetbundl格式
BuildPipeline.BuildAssetBundle (Selection.activeObject, null, targetPath);
// 刷新资源,直接能够在unity中看到刚才打包的东西
AssetDatabase.Refresh();
} // -------------------------------------------------------------------------------- [MenuItem("Build/BuildMultiAsset")]
// 打包多个资源的时候使用这种方法
static void BuildMultiAsset()
{
// 将物体打包到/AssetsBundles路径下同一时候命名为Cubes.assetbundle
string target = Application.dataPath + "/AssetsBundles/Cubes.assetbundle";
// 由于打包多个游戏对象。所以是一个数组,typr(Object)表示,仅仅要选择的物体是Object类型就能够
// 而且选择的模式是深度资源搜索(详细学名究竟叫啥我也忘了。。 。 )。
// 意思是仅仅要你选择的object对象以下假设还有关联的东西就都会一起打包(unity导出场景的时候应该能够感受到)
Object[] cubes = Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets);
// 打包開始,由于是一堆资源。所以主资源为null,剩下两个參数意思同上
BuildPipeline.BuildAssetBundle(null,cubes,target);
// 刷新资源,直接能够在unity中看到刚才打包的东西
AssetDatabase.Refresh();
} // -------------------------------------------------------------------------------- [MenuItem("Build/BuildScene")]
// 打包场景的方法
static void BuildScene()
{
// 场景名字,为什么是数组呢(由于參数里要求这个參数是数组类型。。 。。 )
string [] sceneName = new string[]{Application.dataPath + "/scene1.unity"};
// 将物体打包到/AssetsBundles路径下同一时候命名为Scene1.assetbundle
string targetPath = Application.dataPath + "/AssetsBundles/Scene1.assetbundle";
// 注意打包的方法名已经变成流类型了,后面的最后一个參数表示你要在上面平台执行
// iphone平台就是用BuildTarget.iPhone这个參数
// 安卓平台就是用BuildTarget.Android这个參数
// 相似參数能够自己查看。。。
BuildPipeline.BuildStreamedSceneAssetBundle(sceneName,targetPath,BuildTarget.WebPlayer);
// 刷新资源。直接能够在unity中看到刚才打包的东西
AssetDatabase.Refresh();
}
// --------------------------------------------------------------------------------
[MenuItem("Build/BuildDependence")]
static void BuildDependence()
{
// 对一些公共參数的定义 //
// 定义路径目录是Application.dataPath读取后的路径 加上 "/AssetBundles"
string path = Application.dataPath + "/AssetsBundles";
// 定义资源包的依赖关系选项
BuildAssetBundleOptions buildOp = BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets; // --------------------------------------------------------------------- // Push和Pop是成对出现的。他们的作用是维持一个依赖关系
// 我们当前的资源包关系是这种:
/*
Tex1.assetbundle资源包(Tex1的包里有以下2个资源包)
c1.assetbundle资源包(c1和c2是平级关系)
c2.assetbundle资源包
*/
//依赖资源压栈
BuildPipeline.PushAssetDependencies(); // 替代之前的selection的手动选择方式
Object tex = AssetDatabase.LoadMainAssetAtPath("Assets/Resources/Tex1.jpg"); // 全部兴许资源将共享这一资源包中的内容,可是你要保证的是,在使用c1和c2这种内层依赖包时
// 你已经载入了最外层资源包Tex1
BuildPipeline.BuildAssetBundle(tex, null,path + "/Tex1.assetbundle", buildOp); // 这里使用一对Push和Pop是将我们接下来载入的c1资源包和tex依赖起来
BuildPipeline.PushAssetDependencies();
Object c1 = AssetDatabase.LoadMainAssetAtPath("Assets/Resources/Cube1.prefab");
BuildPipeline.BuildAssetBundle(c1, null, path + "/c1.assetbundle", buildOp);
BuildPipeline.PopAssetDependencies(); // 同上
BuildPipeline.PushAssetDependencies();
Object c2 = AssetDatabase.LoadMainAssetAtPath("Assets/Resources/Cube2.prefab");
BuildPipeline.BuildAssetBundle(c2, null,path + "/c2.assetbundle", buildOp);
BuildPipeline.PopAssetDependencies(); // 依赖资源出栈
BuildPipeline.PopAssetDependencies();
AssetDatabase.Refresh();
} }
using UnityEngine;
using System.Collections; public class Load : MonoBehaviour {
// 全部公共的路径名开头都是这个目录,所以单列出来,简化后面代码
public static string loadPath = "file://" + Application.dataPath +"/AssetsBundles"; // 画一个button
void OnGUI()
{
if(GUILayout.Button("LoadTex"))
{
StartCoroutine(LoadTex(loadPath));
}
if (GUILayout.Button("LoadCube")) {
// 由于以下的方法都是协同程序,所以须要手动开启协同程序
StartCoroutine(LoadCube(loadPath));
}
if (GUILayout.Button("LoadVersion")) {
StartCoroutine(LoadVersion(loadPath));
}
if (GUILayout.Button("LoadCubes")) {
StartCoroutine(LoadCubes(loadPath));
}
if (GUILayout.Button("LoadScene")) {
StartCoroutine(LoadScene(loadPath));
}
} // 协同方法,载入1个cube的方法
IEnumerator LoadCube (string path)
{
// 下载一个已经打包好的assetbundle(打包须要在Build脚本中实现,在project里手动打包)
WWW www = new WWW(path + "/Cube1.assetbundle");
// 返回下载的assetbundle包
yield return www;
// 实例化一个cube,游戏物体使用assetbundle中的主资源(由于是单独打包,所以仅仅有一个主资源),后面是实例化物体的位置和角度信息
Instantiate(www.assetBundle.mainAsset,new Vector3(Random.Range(0,9),Random.Range(0,9),Random.Range(0,9)),Quaternion.identity);
// 实例化成功后输出资源名字
print(www.assetBundle.mainAsset);
// 卸载刚才已经下载的资源在内存中(就是在内存中删除)
www.assetBundle.Unload(false);
} // 协同方法,载入多个cube的方法
IEnumerator LoadCubes(string path)
{
// 下载一个已经打包好的包括多个游戏对象的资源包
WWW www = new WWW(path + "/Cubes.assetbundle");
yield return www;
// 下载资源包中的当中一个名字叫Cube1的物体(这个名字一定是在刚才下载的那个包里有的)
Instantiate(www.assetBundle.Load("Cube1"),Vector3.up,Quaternion.identity);
// 下载资源包中的当中一个名字叫Cube2的物体(这个名字一定是在刚才下载的那个包里有的)
Instantiate(www.assetBundle.Load("Cube2"),Vector3.up,Quaternion.identity);
} // 协同方法,载入一个场景的方法
IEnumerator LoadScene(string path)
{
// 下载已经打包好的场景
WWW www = new WWW(path + "/scene1.assetbundle");
yield return www;
// 获取到包括场景的assetbundle资源包
AssetBundle bundle = www.assetBundle;
// 载入的是资源包中的scene1场景,假设没有上面的这行代码。就无法载入这个场景
Application.LoadLevel("scene1");
} IEnumerator LoadVersion(string path)
{
// 依据版本载入assetbundle
WWW www = WWW.LoadFromCacheOrDownload(path + "/Cube1.assetbundle",1);
yield return www;
if (www.error != null) {
print(www.error);
} else {
Instantiate(www.assetBundle.mainAsset);
}
} IEnumerator LoadTex(string path)
{
WWW www = new WWW(path + "/Tex1.assetbundle");
WWW wwwc1 = new WWW(path + "/c1.assetbundle");
yield return www;
print(www.assetBundle.mainAsset);
Instantiate(wwwc1.assetBundle.mainAsset); }
}
【Unity】Unity中资源动态载入的两种方式之AssetsBundle的更多相关文章
- Eclipse中构建maven项目的两种方式
Eclipse中构建maven项目的两种方式 方式一: 1.构建maven项目 1.1 新建meven项目,可在Other中找到maven文件夹 1.2 进入maven项目后,点击next 1.3 在 ...
- strus2中获取表单数据 两种方式 属性驱动 和模型驱动
strus2中获取表单数据 两种方式 属性驱动 和模型驱动 属性驱动 /** * 当前请求的action在栈顶,ss是栈顶的元素,所以可以利用setValue方法赋值 * 如果一个属性在对象栈,在页面 ...
- 怎样在Android开发中FPS游戏实现的两种方式比较
怎样在Android开发中FPS游戏实现的两种方式比较 如何用Android平台开发FPS游戏,其实现过程有哪些方法,这些方法又有哪些不同的地方呢?首先让我们先了解下什么是FPS 英文名:FPS (F ...
- HTML中设置背景图的两种方式
HTML中设置背景图的两种方式 1.background background:url(images/search.png) no-repeat top; 2.background-image ...
- [Android] Android ViewPager 中加载 Fragment的两种方式 方式(二)
接上文: https://www.cnblogs.com/wukong1688/p/10693338.html Android ViewPager 中加载 Fragmenet的两种方式 方式(一) 二 ...
- [Android] Android ViewPager 中加载 Fragment的两种方式 方式(一)
Android ViewPager 中加载 Fragmenet的两种方式 一.当fragment里面的内容较少时,直接 使用fragment xml布局文件填充 文件总数 布局文件:view_one. ...
- .Net 中读写Oracle数据库常用两种方式
.net中连接Oracle 的两种方式:OracleClient,OleDb转载 2015年04月24日 00:00:24 10820.Net 中读写Oracle数据库常用两种方式:OracleCli ...
- 【转】在Android Studio中下载Android SDK的两种方式(Android Studio3.0、windows)
在Android Studio中下载Android SDK的两种方式(Android Studio3.0.windows) 方式一.设置HTTP Proxy1. 打开Settings2. 点击HTTP ...
- 通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制
通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制 前言说明 本篇为网易云课堂Linux内核分析课程的第四周作业,我将通过调用C语言的库函数与在C代码中 ...
随机推荐
- Delphi 对象模型学习笔记(转)
摘要 Borland Object Pascal 对象模型(现在已经正是命名为 Delphi 语言)与其他 OOP 语言一样,都提供了一些基础服务: 如对象创建服务.对象释放服务.对象识别服务 ...
- MySQL : ERROR 1042 (HY000): Can't get hostname for your address
摘自: http://www.siutung.org/post/506/ 使用Navicat for MySQL连接远程的MySQL服务器,却提示:Can't get hostname for you ...
- Javascript code for soft keyboard
<style> BODY { SCROLLBAR-FACE-COLOR: #f0f0f6; FONT-SIZE: 9pt; BACKGROUND-ATTACHMENT: f ...
- 阿里巴巴Android开发手册(规约)
阿里巴巴Android开发手册(规约) 学习了:https://www.cnblogs.com/jb2011/p/8487889.html 这个猛 https://blog.csdn.net/ali ...
- [Angular] Extract Implementation Details of ngrx from an Angular Application with the Facade Pattern
Extracting away the implementation details of ngrx from your components using the facade pattern cre ...
- Node.js abaike图片批量下载爬虫1.02
//====================================================== // abaike图片批量下载爬虫1.02 // 用最近的断点续传框架改写原有1.01 ...
- 算法笔记_054:Prim算法(Java)
目录 1 问题描述 2 解决方案 2.1 贪心法 1 问题描述 何为Prim算法? 此处引用网友博客中一段介绍(PS:个人感觉网友的这篇博客对于Prim算法讲解的很清楚,本文与之相区别的地方在于具 ...
- webDriver API——第14部分Color Support
class selenium.webdriver.support.color.Color(red, green, blue, alpha=1) Bases: object Color conversi ...
- ant-design表单处理和常用方法及自定义验证
首先要说一下antdesign这个框架API和demo丰富,而且开发环境提供对应的warning来纠正用户的错误.是一个很好的组件库. 关于表单验证方面是依赖于 async-validator 库. ...
- 3、jQuery的DOM基础
DOM模型在页面文档中,通过树状模型展示页面的元素和内容,其展示的方式则是通过节点(node)来实现的. 3.1 访问元素 3.1.1 元素属性操作 Attr()可以对元素属性执行获取和设置操作,而r ...