Unity3d之AssetBundle打包与读取

一、创建Assetbundle

在unity3d开发的游戏中,无论模型,音频,还是图片等,我们都做成Prefab,然后打包成Assetbundle,方便我们后面的使用,来达到资源的更新。

       一个Assetbundle可以打包一个模型(这里的模型不单单指的是预制模型,可以是Project视图下的任何东西),也可以是多个模型,但两种打包方式占用的空间不一样。

      比如我打包三个一样的模型(只不过他们的脚本不一样创建三个空的GameObject(One,Two,Three),分别挂载脚本One,Two,Three)。如果我为每个模型单独打包生成One,Two,Three三个Assetbundle,其所占的空间是A,B,C,但是A+B+C != D.由此可知想通的资源尽可能的打包到一起,他们共用一套资源。不相同的模型尽量分开打包。



二、分开打包(注意这个脚本必须放在Editor文件夹内,Editor文件夹没有的话需自己创建)

[csharp] view plaincopy
print?
  1. /// <summary>  
  2. /// 将选中的预制分别打包  
  3. /// </summary>  
  4. [MenuItem("AssetBundleDemo/Create AssetBundles By themselves")]  
  5. static void CreateAssetBundleThemelves(){  
  6.     //获取要打包的对象(在Project视图中)  
  7.     Object[] selects = Selection.GetFiltered (typeof(Object),SelectionMode.DeepAssets);  
  8.     //遍历选中的对象  
  9.     foreach(Object obj in selects){  
  10.         //这里建立一个本地测试  
  11.         //注意本地测试中可以是任意的文件,但是到了移动平台只能读取路径StreamingAssets里面的  
  12.         //StreamingAssets是只读路径,不能写入  
  13.         string targetPath = Application.dataPath + "/AssetBundleLearn/StreamingAssets/" + obj.name + ".assetbundle";//文件的后缀名是assetbundle和unity都可以  
  14.         if(BuildPipeline.BuildAssetBundle(obj,null,targetPath,BuildAssetBundleOptions.CollectDependencies)){  
  15.   
  16.             Debug.Log(obj.name + "is packed successfully!");  
  17.         }else{  
  18.             Debug.Log(obj.name + "is packed failly!");  
  19.         }  
  20.     }  
  21.     //刷新编辑器(不写的话要手动刷新,否则打包的资源不能及时在Project视图内显示)  
  22.     AssetDatabase.Refresh ();  
  23. }  

SelectionMode.DeepAssets

这个选择模式意味着如果选择中包含多个文件,那么他将包含这个文件视图中的所有资源。

他还有其他的各种选项(以下是官方文档)

SelectionMode

Description

SelectionMode can be used to tweak the selection returned by Selection.GetTransforms.

The default transform selection mode is: SelectionMode.TopLevel | SelectionMode.ExcludePrefab | SelectionMode.Editable.

UnfilteredReturn the whole selection.
TopLevelOnly return the topmost selected transform. A selected child of another selected transform will be filtered out.
DeepReturn the selection and all child transforms of the selection.
ExcludePrefabExcludes any prefabs from the selection.
EditableExcludes any objects which shall not be modified.
AssetsOnly return objects that are assets in the Asset directory.
DeepAssetsIf the selection contains folders, also include all assets and subfolders within that folder in the file hierarchy.

最核心的方法:BuildPipeline.BuildAssetBundle (obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies)

参数1:它只能放一个对象,因为我们这里是分别打包,所以通过循环将每个对象分别放在了这里。

参数2:可以放入一个数组对象。

参数3:要打包到的路径

参数4:默认情况下打的包只能在电脑上用,如果要在手机上用就要添加一个参数。

Android上:

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

IOS上:

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

另外,电脑上和手机上打出来的Assetbundle不能混用,不同平台只能用自己的。

三、一起打包

[csharp] view plaincopy
print?
  1. /// <summary>  
  2. /// 将选中的预制打包到一起  
  3. /// </summary>  
  4. [MenuItem("AssetBundleDemo/Create AssetBundles Together")]  
  5. static void CreateAssetBundleTogether(){  
  6.     //要打包的对象  
  7.     Object[] selects = Selection.GetFiltered (typeof(Object),SelectionMode.DeepAssets);  
  8.     //要打包到的路径  
  9.     string targetPath = Application.dataPath + "/AssetBundleLearn/StreamingAssets/Together.assetbundle";  
  10.     if(BuildPipeline.BuildAssetBundle(null,selects,targetPath,BuildAssetBundleOptions.CollectDependencies)){  
  11.         Debug.Log("Packed successfully!");  
  12.   
  13.     }else{  
  14.         Debug.Log("Packed failly!");  
  15.     }  
  16.     //刷新编辑器(不写的话要手动刷新)  
  17.     AssetDatabase.Refresh ();  
  18. }  


四、读取

[csharp] view plaincopy
print?
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class ReanAssetbundle : MonoBehaviour {  
  5.   
  6.     //不同平台下StreamingAssets的路径是不同的,这里需要注意一下。  
  7.     public static readonly string m_PathURL =  
  8.         #if UNITY_ANDROID  
  9.         "jar:file://" + Application.dataPath + "!/assets/";  
  10.         #elif UNITY_IPHONE  
  11.         Application.dataPath + "/Raw/";  
  12.         #elif UNITY_STANDALONE_WIN || UNITY_EDITOR  
  13.         "file://" + Application.dataPath + "/AssetBundleLearn/StreamingAssets/";  
  14.         #else  
  15.         string.Empty;  
  16.         #endif  
  17.   
  18.     void OnGUI(){  
  19.         if(GUILayout.Button("加载分开打包的Assetbundle")){  
  20.             StartCoroutine(LoadGameObjectPackedByThemselves(m_PathURL + "One.assetbundle"));  
  21.             StartCoroutine(LoadGameObjectPackedByThemselves(m_PathURL +  "Two.assetbundle"));  
  22.             StartCoroutine(LoadGameObjectPackedByThemselves(m_PathURL + "Three.assetbundle"));  
  23.   
  24.         }  
  25.           
  26.         if(GUILayout.Button("加载打包在一起的Assetbundle")){  
  27.             StartCoroutine(LoadGameObjectPackedTogether(m_PathURL + "Together.assetbundle"));  
  28.         }  
  29.           
  30.     }  
  31.     //单独读取资源  
  32.     private IEnumerator LoadGameObjectPackedByThemselves(string path){  
  33.         WWW bundle = new WWW (path);  
  34.         yield return bundle;  
  35.   
  36.         //加载  
  37.         yield return Instantiate (bundle.assetBundle.mainAsset);  
  38.         bundle.assetBundle.Unload (false);  
  39.     }  
  40.   
  41.     IEnumerator  LoadGameObjectPackedTogether (string path)  
  42.     {  
  43.         WWW bundle = new WWW (path);  
  44.         yield return bundle;  
  45.   
  46.         Object one = bundle.assetBundle.Load ("One");  
  47.         Object two = bundle.assetBundle.Load ("Two");  
  48.         Object three = bundle.assetBundle.Load ("Three");  
  49.   
  50.         //加载  
  51.         yield return Instantiate (one);  
  52.         yield return Instantiate (two);  
  53.         yield return Instantiate (three);  
  54.         bundle.assetBundle.Unload (false);  
  55.     }  
  56. }  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android代码抄袭Java曝猛料 新证据出现

Oracle最初告Android代码里侵犯了他们旗下Java知识产权的时候,大多数不明真相的围观群众都是站在Google这一边的,毕竟Oracle蛮横不讲理惯了嘛. 但是,这次我们还真是当了不明真相的围观群众了,美国专利博 ... Oracle最初告Android代码里侵犯了他们旗下Java知识产权的时候,大多数…

JS之数据类型v(** v**)v个人笔记

<body> <!-- 单词记忆 argument&#xff1a;实参 assignment&#xff1a;赋值 instance&#xff1a;实例 1.JS中的数据类型分为以下类型 *值类型&#xff08;基本类型&#xff09;*String&#xff1a;可以为任何字符串*Number&#xff1a;可以为任何数字*boolean&…

unity3d 各个目录的意思

1.首先&#xff0c;你得理解Unity中各个目录的意思&#xff1f; 我这里说的是移动平台&#xff08;安卓举例&#xff09;&#xff0c;读&#xff0c;写。所谓读&#xff0c;就是你出大版本的包之后&#xff0c;这个只读的话&#xff0c;就一辈子就这些东西了&#xff0c;不会改…

WordPress Option API(数据库储存 API)

WordPress Option API 是提供给开发者的数据库存储机制&#xff0c;通过调用函数&#xff0c;可以快速、安全的把数据存储到数据库里&#xff08;都在 wp_options 表&#xff09;。 每个设置的模式是 key – value&#xff0c;利于扩展。Option API 不仅仅给主题和插件开发者用…

asp.net core根据用户权限控制页面元素的显示

asp.net core根据用户权限控制页面元素的显示 Intro 在 web 应用中我们经常需要根据用户的不同允许用户访问不同的资源&#xff0c;显示不同的内容&#xff0c;之前做了一个 AccessControlHelper 的项目&#xff0c;就是解决这个问题的。 asp.net core 支持 TagHelper 和 基于 …

Please let us know in case of any issues

Please let us know in case of any issues转载于:https://www.cnblogs.com/zhangchenliang/archive/2010/05/18/1738117.html

Java面向对象(二)

source:http://blog.java1234.com/index.html?typeId1 Java类的继承 1&#xff0c;继承定义以及基本使用 定义&#xff1a;子类能够继承父类的属性和方法&#xff1b; 注意点&#xff1a;Java中只支持单继承&#xff1b; 私有方法不能继承&#xff1b; 2&#xff0c;方法重写 …

游戏通讯方式

农药自从上线以来&#xff0c;依靠着强大的产品力以及腾讯的运营能力&#xff0c;在游戏市场上表现可谓是风生水起&#xff0c;根据第三方的调研数据显示&#xff0c;《王者荣耀》渗透率达到22.3%&#xff0c;用户规模达到2.01亿人&#xff0c;每日的日活跃用户&#xff08;DAU…

小小c#算法题 - 3 - 字符串语句反转

题目&#xff1a;反转语句。 如I love Beijing! 反转后输出 !Beijing love I 特点是指反转单词的顺序&#xff0c;其他字符&#xff08;这个可以自己指定&#xff09;不反转。且不能用内置函数&#xff0c;如Split和Substring。 分析&#xff1a;我们需要保证一个单词的字…

unity5.4.3p2里面的AssetBundle打包流程

unity5.4.3p2里面的AssetBundle打包流程&#xff0c;相比之前unity4.x的打包简单了许多&#xff0c;Unity4.X中打包的时候需要自己去管理依赖关系&#xff0c;各种BuildPipeline.PushAssetDependencies()和BuildPipeline.PopAssetDependencies()&#xff0c;一不小心手一抖&…

静态查找表的实现

#ifndef SSTABLE_H #define SSTABLE_H#include <iostream> using namespace std;/************************************************************* SSTable&#xff1a;stastic search table 静态查找表的模板类实现 顺序存储结构 ************************************…

(转)javascript匿名函数

文章来源: http://hi.baidu.com/koen_li/blog/item/4b14e4fc0c9b140c08244d8c.html 匿名函数的写法 顾名思义&#xff0c;就是没有名字的函数&#xff08;⊙﹏⊙b汗&#xff09;。匿名函数通常用于javascript作用域的控制&#xff0c;可以有效的避免对全局变量的污染。常见的匿…

BZOJ3307 雨天的尾巴

题目链接&#xff1a;戳我 树上链修改->差分 每一个节点都开一个权值线段树&#xff0c;最后从下往上合并qwq 代码如下&#xff1a; #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #define MA…

主成分分析(PCA)原理详解 2016/12/17 · IT技术 · 主成分分析, 数学 分享到: 21 原文出处: 中科春哥 一、PCA简介 1. 相关背景 主成分分析(Principa

主成分分析&#xff08;PCA&#xff09;原理详解 2016/12/17 IT技术 主成分分析, 数学 分享到&#xff1a;21原文出处&#xff1a; 中科春哥 一、PCA简介 1. 相关背景 主成分分析&#xff08;Principal Component Analysis&#xff0c;PCA&#xff09;&#xff0c; 是一种统…

1 Hadoop简介

1.1 什么是Hadoop 分布式计算平台 优点&#xff1a; 高可靠性 高扩展性 高效性 在各节点之间动态地移动数据&#xff0c;保证各个节点的动态平衡 高容错性 数据多副本&#xff1b;重新启动失败任务 Hadoop应用&#xff1a; Yahoo 广告系统Web搜索研究 Facebook 数据分…

Google Xpath Helper

Google Xpath Helper 下载方法&#xff1a; 1. 访问http://chrome-extension-downloader.com/ 2. 把https://chrome.google.com/webstore/detail/xpath-helper/hgimnogjllphhhkhlmebbmlgjoejdpjl拷贝到文本框里面&#xff0c;然后点击“Download Extention”按钮。 使用方法&am…

【Tensorflow】 Object_detection之训练PASCAL VOC数据集

参考&#xff1a;Running Locally 1、检查数据、config文件是否配置好 可参考之前博客&#xff1a; Tensorflow Object_detection之配置Training Pipeline Tensorflow Object_detection之准备数据生成TFRecord 2、训练模型 PIPELINE_CONFIG_PATH/data/zxx/models/research/date…

2 Hadoop的安装与配置

需要JDK、SSH 对于伪分布式&#xff0c;Hadoop会采取与集群相同的处理方式&#xff1a;按次序启动文件conf/slaves中记载的主机上的进程&#xff0c;只不过在伪分布式中Slave为localhost&#xff08;自身&#xff09;。 Hadoop从三个角度将主机划分为两种角色&#xff1a; 最…

局域网访问控制

访问局域网内其他机器可用如下方式&#xff1a; \\PC-name\d$\dir 或者 \\192.168.xxx.xxx\d$\dir d代表d盘 但前提是对方机器已经把本机用户设置为管理员账户转载于:https://www.cnblogs.com/jimmy-c/p/4116804.html

Unity3d 插值同步

文中大体的思路&#xff1a; A玩家 移动时&#xff0c;本机自行移动&#xff0c;并发送移动指令给服务端&#xff0c;假设移动是成功的&#xff0c;服务端同步其他客户端 B玩家&#xff0c;B玩家 中用一个队列 Queue 来装服务端来的移动指令&#xff0c;然后客户端在updata中做…