好久没更新了,一直在加班敢项目进度。这里和关注我的博客的童鞋表示一下歉意!这里有我录的Unity3D从零开始的视频教程大家可以关注一下:http://www.imooc.com/view/555  视频会陆续的更新,需要讲什么也可以留言给我。

之前在项目中一直用的是别人以前的写的打包代码,后来项目需要需要修改以前的代码把打包的代码过了一遍,今天把自己遇到的问题和打包思路在这路写下来。

在untiy支援加载方面分为两个种类:

第一类:Resources方式加载-------我们不用打包资源,放在项目中的Resources目录下就能在代码中直接加载出来。

第二类:assetBundle方式加载-----需要我们打包资源,把每个资源打包成一个个Bundle,然后加载。

两类资源加载方式在游戏项目中都会用,Resources加载的资源一般是要求非常及时的,assetBundle加载相对要慢一些因为需要把assetBundle资源解压出来。assetBundle也是方便项目中做热更新(在游戏对外发布的过程中,我们需要替换一些资源,通过热更新的方式把资源更新出去供当前的客户端下载替换)。Assetbundle是官方推荐使用的打包方式,AssetbundleUnity(Pro)提供的资源打包策略。

打包思路:

*高能:

  • a、打包的资源一定要放在StreamingAssets目录下因为在移动平台下只能访问这个目录
  • b、AssetBundle的保存后缀名可以是assetbundle或者unity3d
  • c、BuildAssetBundle要根据不同的平台单独打包,BuildTarget参数指定平台,如果不指定,默认的webplayer

1、准备好我们需要打包的资源

2、加载需要打包的资源

3、获取当前对象列表的所有依赖项

4、设置打包编译选项

5、开始打包

重要函数解释:

Selection.objects   ---------------------------------------------------  这个方法是用于判断在Asset目录中返回选中了哪些资源文件
AssetDatabase.GetAssetpath()-------------------------------------- 获取的是工程文件相对于Asset的路径
AssetDatabase.LoadMainAssetAtPath()----------------------------  加载指定路径下的资源
EditorUtility.CollectDependencies()--------------------------------- 获取当前对象列表的所有依赖项
BuildAssetBundleOptions ------------------------------------------- 打包编译选项
BuildPipeline.BuildAssetBundle() ---------------------------------- 打包函数
Path.GetFileNameWithoutExtension() ----------------------------- 获取路径下的不要扩展名的文件名
Path.ChangeExtension() --------------------------------------------  改变路径的文件后缀名
EditorUserBuildSettings.activeBuildTarget -----------------------  判断当前编译平台
 
 
下面列出打包实例代码!
实例:
 
 using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;
using System.Collections.Generic;
public class AssetBoundExport :EditorWindow { [MenuItem("Window/资源打包")]
static void Init()
{
EditorWindow.GetWindow(typeof(AssetBoundExport));
} void OnGUI()
{
/*
*ui1.prefab 和ui2.prefab 是两个预制件,里面都包含loading.png这张图
*这个方法是讲依赖打包的
*通一个资源用在多个预制件中的时候我们就采用这种依赖打包更小
*/
if (GUILayout.Button("打包UI对象", GUILayout.Width()))
{ BuildPipeline.PushAssetDependencies(); Object baseTexture = AssetDatabase.LoadMainAssetAtPath("Assets/Texture/loading.png");
ExportBundle<Texture2D>(AssetDatabase.GetAssetPath(baseTexture)); BuildPipeline.PushAssetDependencies();
Object p1 = AssetDatabase.LoadMainAssetAtPath("Assets/Prefab/ui1.prefab");
ExportBundle<GameObject>(AssetDatabase.GetAssetPath(p1));
BuildPipeline.PopAssetDependencies(); BuildPipeline.PushAssetDependencies();
Object p2 = AssetDatabase.LoadMainAssetAtPath("Assets/Prefab/ui2.prefab");
ExportBundle<GameObject>(AssetDatabase.GetAssetPath(p2));
BuildPipeline.PopAssetDependencies(); BuildPipeline.PopAssetDependencies();
AssetDatabase.Refresh();
} }
/// <summary>
/// 这个方法是用于单独给某类资源打包(这个方法实例是打图片的)
/// 应用场景:在实际项目中我们每次不一定是要全部打包,更多的时候是只需要打某一个资源
/// </summary>
[MenuItem("Assets/打包/Textrue")]
public static void PackageTextureAssetBundle()
{
Object[] _Object = Selection.objects;
for (int i = ; i < _Object.Length; i++)
{
ExportBundle<Texture2D>(AssetDatabase.GetAssetPath(_Object[i]));
}
} /// <summary>
/// 打包通用类
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="path"></param>
private static void ExportBundle<T>(string path) where T:Object
{
T assetObject = AssetDatabase.LoadMainAssetAtPath(path) as T;
if (assetObject == null)
{
Debug.Log("can't load "+path);
return;
} string _path = Application.dataPath + "/StreamingAssets/PC/" + Path.GetFileNameWithoutExtension(path);
_path = Path.ChangeExtension(_path, ".unity3d"); List<Object> obejectList = new List<Object>();
Object[] tempobject = new Object[];
tempobject[] = assetObject;
Object[] kDepens = EditorUtility.CollectDependencies(tempobject);
for (int i = ; i < kDepens.Length; i++)
{
obejectList.Add(kDepens[i]);
} BuildAssetBundleOptions babo = BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets
| BuildAssetBundleOptions.DeterministicAssetBundle;
bool istru= BuildPipeline.BuildAssetBundle(assetObject, obejectList.ToArray(),_path, babo, EditorUserBuildSettings.activeBuildTarget);
if (istru == true)
Debug.Log("打包成功");
else
Debug.Log("打包失败");
}
}

跟我从零基础学习Unity3D开发--资源打包篇(AssetBundle)的更多相关文章

  1. 跟我从零基础学习Unity3D开发--NGUI入门基础

    英雄联盟(撸啊撸) QQ飞车 魔兽世界等等相信大家都玩过游戏吧,玩过那UI知道是什么吧?UI可能说得有点专业的话那么游戏中那些属性面板例如: 现在对UI有一定认识了吧!回想一下您玩过的游戏就一定知道什 ...

  2. 跟我从零基础学习Unity3D开发--U3d脚本注意事项及两个基本函数的简单介绍

    经过上一篇的学习,我相信开发环境您已经搭好了,如果还没有搭好可以百度一下. 今天主要讲的有以下几点: 第一:Unity3D中的C#脚本与.net中的C#写法的区别 1.Unity3D C#脚本不支持命 ...

  3. 跟我从零基础学习Unity3D开发--初识U3D

    首先声明,我也是才开始学,把自己学的记录下来也供一些想要学习的朋友参考,一起努力.希望大家能给我指点一下.切莫喷我. 什么是Unity3d呢? 百度百科------Unity是由Unity Techn ...

  4. 跟我从零基础学习Unity3D开发--Unity3D开发必备神器(Visual Studio Tools for Unity)

    开发Unity3D程序你用的什么IDE呢? 1.MonoDevelop 2.VS 可能你的回答是这样的,我用的vs写代码MonoDevelop来做调试.这时有同学就会反驳了傻X不知道用unityVS吗 ...

  5. [iOS]关于零基础学习iOS开发的学习方法总结

    关于零基础学习iOS开发的学习方法总结 最近很多零基础来参加蓝鸥培训的学生经常会问到一些学习方法的问题,就如下我自己见过的好的学习方法一起讨论一下. 蓝鸥iOS开发技术的学习路线图 程序员的主要工作是 ...

  6. 【零基础学习iOS开发】【转载】

    原文地址:http://www.cnblogs.com/mjios/archive/2013/04/24/3039357.html 本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开 ...

  7. 李洪强iOS开发之【零基础学习iOS开发】【01-前言】01-开篇

    从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂 ...

  8. 【零基础学习iOS开发】【01-前言】01-开篇

    本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开发 四.学习iOS开发的目的 五.学习iOS开发的前提 从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过I ...

  9. 零基础学习iOS开发

    零基础学习iOS开发不管你是否涉足过IT领域,只要你对iOS开发感兴趣,都可以阅读此专题. [零基础学习iOS开发][02-C语言]11-函数的声明和定义 摘要: 在上一讲中,简单介绍了函数的定义和使 ...

随机推荐

  1. Bootstrap之栅格系统

    bootstrap 移动优先 中文官网  http://www.bootcss.com/ 1.基本模板 <!DOCTYPE html> <html lang="en&quo ...

  2. position: fixed用在iframe里面失效了

    iframe真是各种坑啊,,,可是找不到别的代替 $(parent.window).scroll(function(){ $('固定元素').css({ top : $(parent.window). ...

  3. SE16N使用方案总结

    SAP中直接修改表.视图的Tcode有SE16N和SM30. 另外,在EHP5版本及其更高的版本中,激活编辑功能是不被允许的,不过程序中是通过一个判断语句来限制的,可以通过将相关的判断值判断前加断点, ...

  4. Google C++单元测试框架GoogleTest---TestFixture使用

    一.测试夹具(Test Fixtures):对多个测试使用相同的数据配置 如果你发现自己写了两个或更多的测试来操作类似的数据,你可以使用测试夹具.它允许您为几个不同的测试重复使用相同的对象配置. 要创 ...

  5. Android项目实战(二十四):项目包成jar文件,并且将工程中引用的jar一起打入新的jar文件中

    前言: 关于.jar文件: 平时我们Android项目开发中经常会用到第三方的.jar文件. 其实.jar文件就是一个类似.zip文件的压缩包,里面包含了一些源代码,注意的是.jar不包含资源文件(r ...

  6. android中的回调请求的个人理解

    Fragment类提供了管理"选项菜单"的回调函数onCreateOptionMenu(Menu,MenuInflater),调用它可以--创建"选项菜单". ...

  7. 关于Fragment你所需知道的一切!

    转载自刘明渊 的博客地址:http://blog.csdn.net/vanpersie_9987 Fragment 是 Android API 中的一个类,它代表Activity中的一部分界面:您可以 ...

  8. Android 热修复技术(1)---原理

    热修复技术分为几部分: 原理介绍 Android HotFix源码分析 自定义框架 1.Android分包MultiDex原理 首先Dex是什么东西? Dex就是Window里面的exe文件 也就是可 ...

  9. rails中的session

    学rails toturial的时候,第八章一直觉得有点没吃透,后来看了两篇rails关于session和cookies源码分析的文章,cookie原理与实现(rails篇) 和session原理与实 ...

  10. 版本管理工具SVN

    此文件根据慕课网 源生活老师的教学视频总结 视频地址 http://www.imooc.com/learn/109 一.SVN下载和安装配置 服务端下载地址 https://www.visualsvn ...