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) 理查德· ...
随机推荐
- Java第5次实验提纲(集合)
PTA与参考资料 重要参考-集合简述 题集:jmu-Java-05-集合 集合实验文件 第1次实验 1.1 7-1ArrayListIntegerStack(课堂演示) 注1:不要导入java.awt ...
- Redis源码学习:Lua脚本
Redis源码学习:Lua脚本 1.Sublime Text配置 我是在Win7下,用Sublime Text + Cygwin开发的,配置方法请参考<Sublime Text 3下C/C++开 ...
- 【SSH系列】hibernate映射 -- 一对一双向关联映射
开篇前言 上篇博文[SSH进阶之路]hibernate映射--一对一单向关联映射,小编介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身 ...
- 一个数组保存了N个结构,每个结构保存了一个坐标,结构间的坐标都不相同,请问如何找到指定坐标的结构(除了遍历整个数组,是否有更好的办法)?
#include <iostream> #include <map> using namespace std; #define N 5 typedef struct point ...
- JAVA面向对象-----成员内部类的访问方式
成员内部类的访问方式 1.内部类可以直接访问外部类的成员属性.(孙悟空相当于内部类飞到牛魔王的肚子里面去). 2.外部类需要访问内部类的成员属性时需要创建内部类的对象. 1.在外部类的成员函数中创建内 ...
- Dynamics CRM2016 升级老版本报“JavaScript Web 资源包含对 Microsoft Dynamics CRM 4.0 (2007) Web 服务终结点的引用”问题的解决办法
今天在新的服务器上部署了CRM2016 on-premises,并将CRM2015的数据库拷贝过来准备附加后升级,但在升级过程中遇到了如下错误,向导检测到了我的JavaScript Web 资源中包含 ...
- webstorm工具使用详解
webstorm简单介绍 官网地址:http://www.jetbrains.com/webstorm/features/index.html 参考地址:http://www.html5jscss.c ...
- Spring的DataSource配置、将Hibernate配置全部写到Spring配置
DataSource可以集中管理数据库连接,减少维护工作量,使部署更简单: Spring的DataSource配置:(Spring数据源配置)这里使用dbcp,还有很多其他的如c3p0,jdbc,jn ...
- 假设一个大小为100亿个数据的数组,该数组是从小到大排好序的,现在该数组分成若干段,每个段的数据长度小于20「也就是说:题目并没有说每段数据的size 相同,只是说每个段的 size < 20 而已」
假设一个大小为100亿个数据的数组,该数组是从小到大排好序的,现在该数组分成若干段,每个段的数据长度小于20「也就是说:题目并没有说每段数据的size 相同,只是说每个段的 size < 20 ...
- Android布局性能优化—从源码角度看ViewStub延迟加载技术
在项目中,难免会遇到这种需求,在程序运行时需要动态根据条件来决定显示哪个View或某个布局,最通常的想法就是把需要动态显示的View都先写在布局中,然后把它们的可见性设为View.GONE,最后在代码 ...