【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代码中 ...
随机推荐
- CF(D. Fibonacci Sums)dp计数
题目链接:http://codeforces.com/contest/126/problem/D 题意:一个数能够有多种由互不同样的斐波那契数组成的情况: 解法:dp,easy证明:每一个数通过贪心能 ...
- 【云计算】OpenShift容器服务参考
https://docs.openshift.com/enterprise/latest/using_images/db_images/mysql.html 红帽发布OpenShift Dedicat ...
- 核弹级的git指令 git filter-branch
比如一不小心把node模块目录加入git仓库了,导致仓库很大 : git filter-branch --index-filter 'git rm --cached --ignore-unmatc ...
- SonarQube install on Kubernetes
Sonarqube搭建代码 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: postgres labels: app: ...
- RxJava2.0教程
尝试在新的项目中,引用一些流行的优秀的开源框架,在简书上偶然发现一篇很棒的写RxJava 2.0的帖子,个人认为非常适合Android开发者,你可以先知道怎么使用,然后再弄清楚里面做了哪些事情,例如可 ...
- AngularJS监听DOM加载完毕
直接上代码: Module.directive('renderFinish', function ($timeout) { //renderFinish自定义指令 return { restrict: ...
- mui 监听app运行状态
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- for in 与 Object.keys 与 hasOwnProperty区别
1.结论 for in遍历对象所有可枚举属性 包括原型链上的属性 Object.keys遍历对象所有可枚举属性 不包括原型链上的属性 hasOwnProperty 检查对象是否包含属性名,无法检查原型 ...
- Linux-《Linux命令行与shell脚本编程大全》阅读笔记
1.内核负责的主要功能 系统内存管理.软件程序管理.硬件设备管理.文件系统管理 2.GNU工具链 Linux内核是系统的核心,控制着内存.程序和硬件等是如何与对方交互的.内核还需要工具链来执行一些标准 ...
- SSH登陆响应慢的问题
http://xiaobin.net/201112/ssh-login-quite-slow/ 同样的问题,有可能是两种情况: 第一种情况比较常见,也有很多资料提及到,就是在SSH登陆时服务器端会对客 ...