一、创建Assetbundle 在unity3d开发的游戏中,无论模型,音频,还是图片等,我们都做成Prefab,然后打包成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/387480.shtml

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

相关文章

【JS】我的JavaScript学习之路(2)

3.从JavaScript页面解析过程看执行顺序 代码(test.html)&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/x…

王者荣耀提取攻略

1. 王者荣耀安装后&#xff0c;就将模型等资源解压到SD卡目录里&#xff0c;我们需要找到这个目录。模型资源存储在SD卡中&#xff0c;路径为&#xff1a;【/SDCard/Android/data/com.tencent.tmgp.sgame/files/Resources/AssetBundle/】 2. 2 所有英雄的资源包都在这个目…

Exchange ActiveSyn身份验证类型

http://www.exchangecn.com/html/exchange2010/20110125_316.html 配置 Exchange ActiveSync 身份验证 时间:2011-01-25 11:01来源:Exchange中文站 作者:Exchange中文站 点击:3045次ActiveSync 身份验证是客户端和服务器验证其身份以进行数据传输的过程&#xff0c;本文以示例的…

二 SVN代码冲突的解决

问题&#xff1a; A和B都是最新的代码&#xff0c;A修改了代码提交了&#xff0c;B也修改了代码&#xff0c;但是B提交的时候出现冲突的问题。 解决方案&#xff1a;编辑冲突 解决冲突&#xff1a; 方法一&#xff1a;将文件里面冲突的描述去掉&#xff0c;重新提交 方法二&…

Android7.0反射类找不到的问题

Java中使用反射的地方较多&#xff0c;尤其是各种框架中。最近在Android7.0的项目中遇到个问题很奇怪&#xff0c;反射使用的类找不到了&#xff0c;但是编译的时候没问题啊。然后在代码中使用非反射的方式调用代码也是没有问题的&#xff0c;这时奇怪的现象出现了&#xff0c;…

[转]JSon数据解析的四种方式

转至http://blog.csdn.net/enuola/article/details/7903632 作为一种轻量级的数据交换格式&#xff0c;json正在逐步取代xml&#xff0c;成为网络数据的通用格式。 有的json代码格式比较混乱&#xff0c;可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验&#xf…

iOS开发UI篇—Quartz2D使用(绘图路径)

1 //1.获取图形上下文 2 CGContextRef ctxUIGraphicsGetCurrentContext(); 3 //2.绘图&#xff08;画线&#xff09; 4 //设置起点 5 CGContextMoveToPoint(ctx, 20, 20); 6 //设置终点 7 CGContextAddLineToPoint(ctx, 200, 300); 8 //渲染 9…

13结构型模式之桥接模式

概念 Bridge 模式又叫做桥接模式&#xff0c;是构造型的设计模式之一。Bridge模式基于类的最小设计原则&#xff0c;通过使用封装&#xff0c;聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象&#xff08;abstraction&#xff09;与行为实现&#xff08;i…

简易中控紫猫插件版(3)压缩包使用说明

1.环境配置脚本运行环境&#xff1a;没什么说的 正常的最新版手机按键 当然还需要 最新的紫猫插件中控运行环境&#xff1a;首先要保证把压缩包的所有php文件都扔到网站的根目录下 必须保证网站的php版本是5.4 不然紫猫插件的php框架会出问题 然后你要知道网站数据库的账号和密…

Java9新特性

Java 8 发布三年多之后&#xff0c;即将快到2017年7月下一个版本发布的日期了。 你可能已经听说过 Java 9 的模块系统&#xff0c;但是这个新版本还有许多其它的更新。 这里有九个令人兴奋的新功能将与 Java 9 一起发布。 1. Java 平台级模块系统 Java 9 的定义功能是一套全新的…

Java面试常见算法

在程序员的职业生涯中&#xff0c;算法亦算是一门基础课程&#xff0c;尤其是在面试的时候&#xff0c;很多公司都会让程序员编写一些算法实例&#xff0c;例如快速排序、二叉树查找等等。 本文总结了程序员在代码面试中最常遇到的10大算法类型&#xff0c;想要真正了解这些算法…

高仿人人Android梦想版终极源码发送(转)

经过几个月的努力,终于基本完成了人人API拥有的所有功能,界面采用仿照人人梦想版5.13制作,其中资源文件也采用人人的APK文件资源,完成的功能及知识点如下:1.通过三种动画仿照出人人引导页的放大切换图片的效果。2.通过重写ViewGroup仿照出人人菜单和其他界面的手势滑动切换效果…

android 实现SSL握手协商

Android的私钥和信任证书的格式必须是BKS格式的&#xff0c;通过配置本地JDK&#xff0c;让keytool可以生成BKS格式的私钥和信任证书,java本身没有BouncyCastle密库 ssl通道建立前必须进行协商&#xff08;形成安全的通道--隧道技术&#xff09;。 服务端&#xff1a; View Co…

同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO

IO的方式通常分为几种&#xff0c;同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来之前&#xff0c;我们建立网络连接的时候采用BIO模式&#xff0c;需要先在服务端启动一个ServerSocket&#xff0c;然后在客户端启动Socket来对服务端进行通信&#x…

1 概述

Unix C TCP/IP 三位一体 Linux天生是网络操作系统 程序员的学习&#xff1a;不断地敲代码&#xff0c;不断地看别人的代码。 Linux两大领域&#xff1a; &#xff08;1&#xff09;服务器 &#xff08;2&#xff09;嵌入式设备 www.netcraft.com 查看网站服务器系统 VMware快…

Java Annotation认知(包括框架图、详细介绍、示例说明)

摘要 Java Annotation是JDK5.0引入的一种注释机制。 网上很多关于Java Annotation的文章&#xff0c;看得人眼花缭乱。Java Annotation本来很简单的&#xff0c;结果说的人没说清楚&#xff1b;弄的看的人更加迷糊。 我按照自己的思路&#xff0c;对Annotation进行了整理。理解…

Go语言学习之3 流程控制、函数

主要内容&#xff1a; 1. strings和strconv使用2. Go中的时间和日期类型3. 指针类型4. 流程控制5. 函数详解 1. strings和strconv使用 //strings 1. strings.HasPrefix(s string, prefix string) bool&#xff1a;判断字符串s是否以prefix开头 。 2. strings.HasSuffix(s strin…

RabbitMQ教程总结

【译】RabbitMQ教程一 主要通过Hello Word对RabbitMQ有初步认识 【译】RabbitMQ教程二 工作队列&#xff0c;即一个生产者对多个消费者循环分发、消息确认、消息持久、公平分发 【译】RabbitMQ教程三 如何同一个消息同时发给多个消费者开始引入RabbitMQ消息模型中的重要概念路由…

机器学习实战(笔记)------------KNN算法

1.KNN算法 KNN算法即K-临近算法&#xff0c;采用测量不同特征值之间的距离的方法进行分类。 以二维情况举例&#xff1a; 假设一条样本含有两个特征。将这两种特征进行数值化&#xff0c;我们就可以假设这两种特种分别为二维坐标系中的横轴和纵轴&#xff0c;将一个样本以点的形…

Java注解Annotation 完成验证

Java注解Annotation用起来很方便&#xff0c;也越来越流行&#xff0c;由于其简单、简练且易于使用等特点&#xff0c;很多开发工具都提供了注解功能&#xff0c;不好的地方就是代码入侵比较严重&#xff0c;所以使用的时候要有一定的选择性。 这篇文章将利用注解&#xff0c;来…