Unity 5.X扩展编辑器之打包assetbundle
5.x的assetbundle与4.x以及之前的版本有些不同,不过本质是一样的,只不过5.x打包assetbundle更为简单和人性化了,总体来说只需要三个步骤:
第一步:创建打包资源
//这里是一个资源包数组,其中每一个资源包又可以包含多个小资源,所以一般情况下一个资源包就足够了
AssetBundleBuild[] _ABbuild = new AssetBundleBuild[1];
第二步:给资源命名以及指定需要打包的资源
//资源包的名称
_ABbuild[0].assetBundleName = "打包assetbundle出来之后的文件名";
//资源包下的资源名称,一个资源包可以包含多个资源,资源由从Assets开始的路径组成且包含自身后缀名
string[] _allassetname = new string[3];
_allassetname[0] = "Assets/1.png";
_allassetname[1] = "Assets/2.prefab";
_allassetname[2] = "Assets/3.FBX";
_ABbuild[0].assetNames = _allassetname;
第三步:开始打包
//打包到路径E:/test/mytest
BuildPipeline.BuildAssetBundles("E:/test/mytest", _ABbuild);
将之封装成扩展编辑器之后,把如下脚本放在Editor文件夹内:
using UnityEngine;
using UnityEditor;
using System.Diagnostics;
using System.IO; public class ExportAssetBundles : EditorWindow
{ [@MenuItem("AssetBundles/Build AssetBundles")]
static void main()
{
EditorWindow.GetWindow<ExportAssetBundles>(false,"AssetBundles");
} private Vector2 scrollVec2;
private string rootPath = "Assets";
private string _assetBundleName = "";
private string _assetBundlePath = "Assets/StreamingAssets";
private int _assetBundleElementNum = 4;
private string[] _assetBundleElement = new string[4]; void OnGUI()
{
scrollVec2 = EditorGUILayout.BeginScrollView(scrollVec2, GUILayout.Width(position.width), GUILayout.Height(position.height)); EditorGUILayout.BeginHorizontal();
GUILayout.Label("资源包名称:");
_assetBundleName = EditorGUILayout.TextField(_assetBundleName);
if (GUILayout.Button("清空"))
EditorApplication.delayCall += Delete;
EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal();
GUILayout.Label("资源包路径:");
_assetBundlePath = EditorGUILayout.TextField(_assetBundlePath);
if (GUILayout.Button("浏览"))
EditorApplication.delayCall += Save;
EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal();
GUILayout.Label("资源包容量:");
_assetBundleElementNum = EditorGUILayout.IntField(_assetBundleElementNum);
if (GUILayout.Button("增加"))
EditorApplication.delayCall += Add;
EditorGUILayout.EndHorizontal(); if (_assetBundleElementNum > 0)
{
if (_assetBundleElement.Length != _assetBundleElementNum)
{
string[] temp = _assetBundleElement;
_assetBundleElement = new string[_assetBundleElementNum];
for (int i = 0; i < temp.Length; i++)
{
if (i < _assetBundleElement.Length)
_assetBundleElement[i] = temp[i];
}
}
for (int i = 0; i < _assetBundleElementNum; i++)
{
EditorGUILayout.BeginHorizontal();
GUILayout.Label("资源" + (i + 1) + ":");
_assetBundleElement[i] = EditorGUILayout.TextField(_assetBundleElement[i]);
if (GUILayout.Button("浏览"))
Browse(i);
EditorGUILayout.EndHorizontal();
}
}
if (GUILayout.Button("打包"))
{
if (_assetBundleName == "")
{
//打开一个通知栏
this.ShowNotification(new GUIContent("资源包名称不可为空"));
return;
}
if (_assetBundlePath == "C:/" || _assetBundlePath == "D:/" || _assetBundlePath == "E:/" || _assetBundlePath == "F:/")
{
//打开一个通知栏
this.ShowNotification(new GUIContent("资源包路径不可为根目录"));
return;
}
if (_assetBundleElementNum <= 0)
{
//打开一个通知栏
this.ShowNotification(new GUIContent("资源包容量必须大于0"));
return;
}
for (int i = 0; i < _assetBundleElement.Length; i++)
{
if (_assetBundleElement[i] == null || _assetBundleElement[i] == "")
{
//打开一个通知栏
this.ShowNotification(new GUIContent("资源"+(i+1)+"路径为空"));
return;
}
}
EditorApplication.delayCall += Build;
} EditorGUILayout.EndScrollView();
}
/// <summary>
/// 清空资源包名称
/// </summary>
void Delete()
{
_assetBundleName = "";
//转移焦点至主窗口
EditorUtility.FocusProjectWindow();
}
/// <summary>
/// 选择资源存储路径
/// </summary>
void Save()
{
string path = EditorUtility.OpenFolderPanel("选择要存储的路径", "", "");
if (path.Length != 0)
{
_assetBundlePath = path;
EditorUtility.FocusProjectWindow();
}
}
/// <summary>
/// 资源包容量增加
/// </summary>
void Add()
{
_assetBundleElementNum += 1;
EditorUtility.FocusProjectWindow();
}
/// <summary>
/// 选择单个打包资源
/// </summary>
/// <param name="i">资源序号</param>
void Browse(int i)
{
string path = EditorUtility.OpenFilePanel("选择要打包的资源", @"E:\hutao\Unity Project5.2\Course Cloud Platform\Assets", "*");
if (path.Length != 0)
{
if (path.IndexOf(rootPath) >= 0)
{
//如果选中的资源是dll文件,则自动改后缀名为.bytes
if (path.EndsWith(".dll"))
{
string newpath = path.Substring(0, path.LastIndexOf('.')) + ".bytes";
File.Move(path, newpath);
_assetBundleElement[i] = newpath.Substring(newpath.IndexOf(rootPath));
AssetDatabase.Refresh();
}
else
{
_assetBundleElement[i] = path.Substring(path.IndexOf(rootPath));
}
}
}
}
/// <summary>
/// 打包资源
/// </summary>
void Build()
{
//需要打包的资源(可打包成多个)
AssetBundleBuild[] buildMap = new AssetBundleBuild[1]; //资源包的名称
buildMap[0].assetBundleName = _assetBundleName;
//资源包下的资源名称,一个资源包可以包含多个资源,资源由从Assets开始的路径组成且包含自身后缀名
buildMap[0].assetNames = _assetBundleElement; BuildPipeline.BuildAssetBundles(_assetBundlePath, buildMap);
}
}
在编辑器中效果图如下:(其中每个资源小项可以是工程中的文件夹,如果是文件夹的话那么该文件夹内所有资源都会打包进去)
Unity 5.X扩展编辑器之打包assetbundle的更多相关文章
- 实力封装:Unity打包AssetBundle(一)
说明:这是一系列循序渐进的教程,今天先介绍最简单的AssetBundle打包方式. 这是一个由在Unity中需要加载模型而引发出来的一系列坑,为了填坑花了不少时间,如果有需要在Unity中自定义菜单, ...
- 实力封装:Unity打包AssetBundle(大结局)
→→前情提要:让用户选择要打包的文件←← 大结局:更多选择 Unity打包AssetBundle从入门到放弃系列终于要迎来大结局了[小哥哥表示实在写不动了o(╥﹏╥)o]... 经过上一次的教程,其实 ...
- lua------------------Unity3D研究院编辑器之打开unity不可识别的文件(十三)
Unity3D研究院编辑器之打开unity不可识别的文件(十三) 雨松MOMO [Unity3D拓展编辑器] 围观8597次 9 条评论 编辑日期:2017-03-02 字体:大 中 小 有些特殊 ...
- Unity学习(六)5.x依赖打包
http://blog.sina.com.cn/s/blog_89d90b7c0102w2ox.html unity5已经封装好了接口,所以依赖打包并没有那么神秘和复杂了. 打包: 1.定义好资源的a ...
- Emacs和Vim:神的编辑器和编辑器之神, 到底哪个更好?
Emacs和Vim:神的编辑器和编辑器之神, 到底哪个更好? 在这个蔚蓝色的星球上,流传着两大神器的传说:据说Emacs是神的编辑器,而Vim是编辑器之神. 一些人勇敢地拾起了Vim或Emacs,却发 ...
- Win10系统下安装编辑器之神(The God of Editor)Vim并且构建Python生态开发环境(2020年最新攻略)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_160 众神殿内,依次坐着Editplus.Atom.Sublime.Vscode.JetBrains家族.Comodo等等一众编辑 ...
- 编辑器之神VIM 总结(一) 基础部分
版本号 说明 作者 日期 1.0 vim基础知识 Sky Wang 2013/06/19 概要 vim和emacs,一个是编辑器之神,一个是神一样的编辑器.他们被称是UNIX系统下的 ...
- 优测优社区干货精选|老司机乱谈编辑器之神——vim
文 / 腾讯 吴双 前言 优测小优 有话说: 腾讯优测只有应用测试大神?不不不,我们还有各种研发大牛! *** vim 是一种信仰,我自从2004年有了这个信仰,已经12个年头了.本文介绍了学习vim ...
- 自由软件之父、Google+设计者、Java之父、Linux之父、万维网之父、Vi编辑器之父、苹果Lisa电脑界面设计、微软首席软件架构师
自由软件之父.Google+设计者.Java之父.Linux之父.万维网之父.Vi编辑器之父.苹果Lisa电脑界面设计.微软首席软件架构师 理查德·斯托曼(Richard Stallman) 理查德· ...
随机推荐
- Python3 基础语法
编码 默认情况下,Python 3源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*- 标 ...
- 安卓高级 特效动画ExplosionField和 SmoothTransition
本教程所有图片为github上的所无法正常访问请科学上网 SmoothTransition 展示效果 github:源码地址 使用方法 你能通过一行代码使用上面所有的动画 @Override prot ...
- 到底什么是集群&分布式
对于楼主这样工作一年的菜鸟,偶尔会看到一些文章标题带有"分布式""集群"关键字,然后就懵逼了.最近对这些概念进行了一定的了解,整理了一下思路,在这里分享给各位猿 ...
- 六星经典CSAPP-笔记(7)加载与链接(上)
六星经典CSAPP-笔记(7)加载与链接 1.对象文件(Object File) 1.1 文件类型 对象文件有三种形式: 可重定位对象文件(Relocatable object file):包含二进制 ...
- Launcher3 HotSeat显示名称
今天闲的无聊,研究了下launcher代码,看到Hotseat.java的时候,想起来以前有做过显示hotseat中应用名称,因为换了公司代码都没拿出来,就想在试着修改,看了很久发现无从下手,记得ho ...
- 两种利用GCD实现分步获取结果的方式和SDWebImage缓存机制的验证
前段时间写界面,因为数据的请求分成了两部分,所以用到了多线程,实现数据的分步请求,然后自己写了一个Demo,用两种方式实现分步获取内容,其中也包含了验证SDWebImage这个库的缓存机制,在这里给大 ...
- 关于在arm裸板编程时使用printf问题的解决方法
在ARM裸板驱动编程中,是不允许程序直接调用C库程序的.为什么呢?因为此时kernel还没有被加载,所以在封装在kernel层的C库的API是用不了的,那怎么办? 在开发过程中,printf的功能我不 ...
- Ajax PHP JavaScript MySQL实现简易的无刷新在线聊天室
思路 消息显示区 发消息 板块 消息显示 消息发送 优化 显示非重复性的数据 优化显示 加上滚动条 每次都显示最新消息 完整代码 前端代码 数据库表结构 服务器端代码 总结与展望 总结 展望 为更好的 ...
- Not saving crash log because we have reached the limit for logs to store on disk.解决办法
一.问题简述: Xcode, window>Devices>DEVICES选中自已的设备,打开控制台:提示日志存量已达限制,这个是系统抛出的log."Not saving cra ...
- Dynamics CRM2016 Web API之删除
相比之前的增改查,删除就显得简单的多了. 这里的request的type为delete,删除成功的status为204,404则是要删除的记录不存在 var id = 'BAD90A95-7FEA-E ...