好久没更新了,一直在加班敢项目进度。这里和关注我的博客的童鞋表示一下歉意!这里有我录的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. 关于在线编辑器的选择:tinymce - nilcms

    一开始使用的是百度开发的编辑器:ueditor.使用方便,很容易就部署了.现在发现此编辑器也就做一些安全性的更新,而且对于这个编辑器也越来越不喜欢了. 1.臃肿.[1.4.3.3 PHP 版本].下载 ...

  2. Source Map调试压缩后代码

    在前端开发过程中,无论是样式还是脚本,运行时的文件可能是压缩后的,那这个时候调试起来就很麻烦. 这个时候,可以使用Source Map文件来优化调试,Source Map是一个信息文件,里面储存着原代 ...

  3. How to get Timer Job History

    1. Get Timer Job internal name with id. Job ID can be found in SharePoint CA. Below PowerShell can h ...

  4. android常犯错误记录

    错误:Error:Error: Found item Attr/border_width more than one time 这个容易,属性相同了,按照提示查询一下找出来删了就行了,注意大小写很容易 ...

  5. Android Studio调试方法学习笔记

    (注:本人所用Android Studio的Keymap已设为Eclipse copy) 1.设置断点 只有设置断点,才好定位要调试什么地方,否则找不到要调试的地方,无法调试.(调试过程中也可以增加断 ...

  6. iOS MJRefresh设置MJRefreshStateNoMoreData状态图片

    MJRefresh地址 //  代码地址: https://github.com/CoderMJLee/MJRefresh//  代码地址: http://code4app.com/ios/%E5%B ...

  7. Linux 通过sendmail 发邮件到外部邮箱

    最近在写自动化巡检脚本,想着怎么预警后自动发送邮件报警. 首先下载最新版本mailx-12.4.tar.bz2 # wget http://sourceforge.net/projects/heirl ...

  8. centos6.5和centos7如何搭建php环境

    作者:白狼 出处:http://www.manks.top/linux_php.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责 ...

  9. STM32 KEIL不能输入仿真引脚端口error 65: access violation at 0x40021000 : no 'read' permission

    使用MDK自己创建一个STM32F103ZE核的项目 加入源码后编译,正常,在线仿真单步执行出现如下问题 error 65: access violation at 0x40021000 : no ' ...

  10. 别踩白块儿游戏源码Android版

    这个项目有带说明文档,大家可以看看源码附件的说明文档吧,“别踩白块儿”是目前非常火的一款游戏,游戏非常简单刺激.关于具体怎么火法怎么玩我就不多说了,相信看到本文的朋友们都非常地清楚. 什么游戏火,我们 ...