Unity中批处理的原理与使用

前言

由于从事工业三维可视化的原因,我们的项目中有大量的模型需要在Unity中打包为assetbundle文件,其实打包assetbundle的过程是很机械的过程,这种重复性很高变动很小的工作我们通常应该想到使用BATCH(批处理脚本/批处理文件)来解决这个问题,下面我们根据实际的项目来感受一下批处理程序的魅力。

主要内容

  • 批处理工具原理
  • 如何使用/何种情况使用(使用案例)

使用原理

  • 原理: 使用批处理程序来调用已经编写好的Unity拓展方法。

接下来看一下如何编写UnityEditor方法和BATCH是如何调用UnityEditor方法的。

什么是UnityEditor拓展?

放在工程目录下Assets/Editor文件下的方法都是对Unity引擎编辑器的拓展,一般常见的插件都会编写一部分编辑器拓展代码来自定义插件的Inspector面板等其他操作。

怎么利用批处理来触发编辑器的方法,Editor目录下的方法有多种方式来触发

  • 利用自定义的按钮来触发;

using UnityEditor;public class MyClass
{[MenuItem("My Tools/MyFunc1")]private static void MyFunc1(){//..你的操作}
}
  • 自定义窗口中来调用

using UnityEditor;
using UnityEngine;public class MyClass : EditorWindow
{// 重写window面板private void OnGUI(){if(GUILayout.Button("MyFunc1")){MyFunc1();}}// 打开窗口[MenuItem("My Tools/My Window")]private static void OpenMyWindow(){GetWindow<MyClass> (true, "My Window");}[MenuItem("My Tools/MyFunc1")]private static void MyFunc1(){//..你的操作Debug.Log ("你的操作");}
}
  • 利用批处理来调用

using UnityEditor;public class MyWindow : EditorWindow
{public static void MyFunc1(){//..你的操作Debug.Log("你的操作");}
}
rem 发布工具
@echo off
echo 启动 Unity.exe 请稍后...
start /min D:\Unity\Editor\Unity.exe -batchmode -projectPath D:\MyProject\BatchProject -executeMethod MyClass.MyFunc1
Pause
taskkill /f /im unity.exe
  • 执行结果
  • Eidtor日志路径Win7在C:\Users\Administrator\AppData\Local\Unity\Editor\Editor.Log

  • echo 为DOS编程中一种显示消息的方法

  • start DOS编程中用于启动应用程序的命令
  • -batchmode 是Unity提供的Command line arguments中较为常用的一种,它是后台运行Unity,不显示Unity界面,这对于把机械的工作交给策划?美术?是极其重要的。
    在-batchmode下运行Unity。这应该始终与其他命令行参数一起使用,因为它确保没有出现弹出窗口,并且不需要任何人为干预。执行脚本代码期间发生异常时,资产服务器更新失败或其他失败的操作,Unity立即退出并返回代码1。
    请注意,在批处理模式下,Unity将其日志输出的最小版本发送到控制台。但是,日志文件仍然包含完整的日志信息。在编辑器打开相同的项目时以批处理模式打开项目不受支持; Unity的一个实例只能一次运行。

  • -projectPath 指定项目的路径

  • -executeMethod(ClassName.MethodName) 调用Unity编辑器某个类型中的某个方法

  • 一旦Unity启动,项目打开,并且执行了可选的Asset Server更新之后,执行静态方法。这可以用于执行持续集成,执行单元测试,构建或准备数据等任务。要从命令行进程返回错误,请抛出异常,导致Unity退出代码1,或者使用非零返回代码调用EditorApplication.Exit。要传递参数,将它们添加到命令行并使用函数检索它们System.Environment.GetCommandLineArgs。要使用-executeMethod,您需要将封闭的脚本放在编辑器文件夹中。要执行的方法必须定义为static。

  • 更多Unity Command line arguments,最新Unity支持直接用.bat脚本直接导出linux、MacOS、Window的应用,暂时不支持Android和IOS等其它终端的输出。

  • 更多DOS Command line arguments,DOS命令行不许要去专门当做一门语言学习,你只需要根据自己的需求百度一下命令行的使用方式即可。

使用案例

批处理打包assetbundle

  • 1.点击.bat文件之后的界面
  • 2.等待启动资源导入选择导出路径的界面

    -3.选择导出路径

    -4.等待生成结果,并按下任意键退出,自动从清除进程中的Unity.exe

  • 编辑器代码

public class MyClass : EditorWindow
{// 重写window面板private void OnGUI(){if ( GUILayout.Button("选择路径并导出资源文件") ){string savePath = EditorUtility.SaveFolderPanel("导出路径" , "" , "");Build(savePath);}}private static string _modelName = null;[MenuItem("My Tools/Quickly Build")]public static void QuicklyBuild(){GetWindow<MyClass>(true , "打包工具");string assetPath = EditorUtility.OpenFolderPanel("选择资源路径" , "" , "");if (!Directory.Exists(Application.dataPath + "Resources/Models"))Directory.CreateDirectory(Application.dataPath + "Resources/Models");Copy(assetPath , Application.dataPath + "/Resources/Models");GetModelName();}// 自动选取后缀为.fbx的模型命名private static void GetModelName(){DirectoryInfo info = new DirectoryInfo(Application.dataPath + "/Resources/Models");foreach ( FileInfo file in info.GetFiles() )if ( file.Extension == ".FBX" )_modelName = file.Name.Replace(".FBX" , "");}// 打包资源public static void Build(string savePath){Debug.Log(_modelName);GameObject model = Resources.Load<GameObject>("Models/" + _modelName);Object oldPrefab = PrefabUtility.CreateEmptyPrefab("Assets/Resources/" + model.name + ".prefab");GameObject newPrefab = PrefabUtility.ReplacePrefab(model , oldPrefab);Caching.CleanCache();string modelName = newPrefab.name;string assetBundlePath = savePath + "/" + modelName + ".assetbundle";if ( BuildPipeline.BuildAssetBundle(newPrefab , null , assetBundlePath , BuildAssetBundleOptions.CollectDependencies) )Debug.Log(modelName + "资源打包成功");AssetDatabase.Refresh();Delete();}// 清空文件夹public static void Delete( ){DirectoryInfo info = new DirectoryInfo(Application.dataPath + "/Resources/Models");info.Delete(true);}// 文件导入public static void Copy( string sPath , string dPath ){DirectoryInfo info = new DirectoryInfo(sPath);foreach ( DirectoryInfo directory in info.GetDirectories() ){if ( !Directory.Exists(dPath + "/" + directory.Name) ){Directory.CreateDirectory(dPath + "/" + directory.Name);}foreach ( FileInfo file in directory.GetFiles() ){if ( !File.Exists(dPath + "/" + directory.Name + "/" + file.Name) ){File.Copy(sPath + "/" + directory.Name + "/" + file.Name , dPath + "/" + directory.Name + "/" + file.Name);}}}foreach ( FileInfo file in info.GetFiles() ){if ( !File.Exists(dPath + "/" + file.Name) ){File.Copy(sPath + "/" + file.Name , dPath + "/" + file.Name);}}}
}
  • 批处理代码(这个文件我是放在桌面的,使用时需要自己配置)
rem 我的打包工具
@echo off
echo 启动 Unity.exe 请稍后...
echo 清理缓存
rd /s /q "D:\UnityProjects_4.6\HYProjects\HYPTProject\Assets\Resources\Models"
echo 新建目录
md "D:\UnityProjects_4.6\HYProjects\HYPTProject\Assets\Resources\Models"
echo 开始操作
start /min D:\Unity\Editor\Unity.exe -batchmode -projectPath D:\MyProject\BatchProject -executeMethod MyClass.QuicklyBuild
echo 操作完成,按任意键退出...
Pause
taskkill /f /im unity.exe

明白原理之后,操作起来还是很简单的,这里提供一个例子给大家,大家也可在自己的项目中参考实现一下。具体的DOS命令我就不讲解了。百度一下,你就知道。

批处理处理模型

原理同上

批处理build多平台发布包

新版Unity已经提供了命令行来Build Lunix、MacOS、Windows平台的发布包

后续拓展

  • 批处理工具基本在任何操作重复的情况都可以使用,只需要将操作的步骤封装为方法,让代码去执行即可。
  • 批处理是一种操作思想,任何可以不需要你动手的事情你都可以编写为一个工具让不懂操作的其他人来替你完成。这样你就可以“提前下班啦”。

UGUI组件系列

  • Unity自定义UI组件(十一) 雷达图、属性图
  • Unity自定义UI组件(十) 折线图
  • Unity自定义UI组件(九) 颜色拾取器(下)
  • Unity自定义UI组件(八) 颜色拾取器(上)
  • Unity自定义UI组件(七)渐变工具、渐变色图片、渐变遮罩
  • Unity自定义UI组件(六)日历、日期拾取器
  • Unity自定义组件之(五) 目录树 UITree
  • Unity自定义UI组件(四)双击按钮、长按按钮
  • Unity自定义UI组件(三)饼图篇
  • Unity自定义UI组件(二)函数图篇(下)
  • Unity自定义UI组件(一)函数图篇(上)

Unity框架解读系列

  • [Unity]PureMVC框架解读(下)
  • [Unity]PureMVC框架解读(上)

分享地址(置顶目录包含所有组件的最新下载地址)

  • Github :https://github.com/ll4080333/UnityCodes
  • CSDN : http://blog.csdn.net/qq_29579137
  • 博客专栏 : http://blog.csdn.net/column/details/16329.html
  • QQ群 : 593906968 如有不懂, 加群提问,互相学习
    如果你想了解UGUI的更多拓展组件,欢迎关注我的博客,我会持续更新,支持一下我这个博客新手。如果以上文章对你有帮助,点个赞,让更多的人看到这篇文章,我们一起学习。如果有什么指点的地方欢迎在评论区留言,秒回复。

[Unity3D经验分享]批处理工具 (提前下班神器)相关推荐

  1. Unity3D 之 学习路线与学习经验分享

    转自:https://blog.csdn.net/qq_22521529/article/details/83108837 Unity3D学习路线与学习经验分享 该博文出自作者15游02 丁祺,是一篇 ...

  2. 非体制拿到浙大MPA提前批面试A资格经验分享

            提到浙大公共管理硕士的提前批面试,相信很多小伙伴应该都对其要求有所鸡蛋忌惮,我去年刚开始了解浙大MPA提面时也是一样,而且与多数事业编和公务员考生相比,感觉自己基本没太大希望,但还是硬 ...

  3. 一个老鸟的BI之路——转自他人的报表工具java报表软件以及bi的经验分享

    闲来无事看到一篇帖子,颇有感触,特此转发一下! 原文链接:https://blog.csdn.net/qq_36128242/article/details/83746582 这人一上年纪就爱回忆之前 ...

  4. 经验分享 | Arcgis模型构建器实现批处理

    问题描述 模型构建器(ModelBuilder):是一个用来创建.编辑和管理模型的应用程序.模型是将一系列地理处理工具串联在一起的工作流,它将其中一个工具的输出作为另一个工具的输入.也可以将模型构建器 ...

  5. 汽车电子技术——软考中级之系统集成项目管理工程师 高分(63+69)通过备考经验分享

    汽车电子技术--软考中级之系统集成项目管理工程师 高分(63+69)通过备考经验分享 1. 软考 1.1 软考概述 1.2 考试要求及科目设置 1.3 通过率 1.4 考试资料 1.5 2021报名及 ...

  6. 从国内跳槽至新加坡工作的经验分享

    前言 记录和分享自己在新加坡的工作生活以及新加坡的基本介绍,如果你只想了解我是如何来到新加坡的可以直接跳到最后一章. 为帮助大家玩转新加坡,快速适应当地生活 更新历史 2019年02月14日 - 更新 ...

  7. 转型经验分享|我为什么放弃做VC投资,去做自媒体?

    先说下我的背景,我之前在上汽通用的泛亚技术中心,做底盘开发工程师,后来加入一家新能源车企,再后来因为看好自动驾驶的技术发展前景,自学自动驾驶算法,终于在2017年底加入阿里(菜鸟)自动驾驶团队. 我在 ...

  8. 大促场景系统稳定性保障实践经验分享

    简介:11月11日0点刚过26秒,天猫双11的订单创建峰值就达到58.3万笔/秒,阿里云又一次扛住全球最大规模流量洪峰!58.3万笔/秒,这一数字是2009年第一次天猫双11的1457倍. 每到双11 ...

  9. python 笔试题 英方_4000字转型数据分析师笔试面试经验分享

    大家好,我是戴师兄~ 在上一篇文章中我分享了快速自学数据分析的经验. 本篇文章,我将跟大家分享下我的笔试和面试心得. 开头先说说我转型前的职业背景: 想看笔试面试经验的同学萌可以直接跳过这一段~ 20 ...

最新文章

  1. NTU 课程: MAS714(3) DFS BFS(搜索算法)
  2. JS-立即执行函数(function(){...})() amp;amp; (function(){...})()
  3. rocketmq java home,rocketmq 安装与配置以及遇到的问题
  4. 2018 Multi-University Training Contest 1 Balanced Sequence(贪心)
  5. PHP输出当前进程所有变量 / 常量 / 模块 / 函数 / 类
  6. 【ACM International Collegiate Programming Contest Gym-100814 C】Connecting Graph【并查集按秩合并】
  7. PhotoShop 基本知识
  8. 主成分分析二级指标权重_主成分分析确定指标权重的问题_主成分分析法确定权重...
  9. React纯前端生成word文档(支持多图片导出)
  10. 今日头条文章满多少字算原创
  11. 寄存器与ROM与RAM
  12. SAP 中的货币(Currencies)
  13. 小心身份证复印件的使用
  14. 有一种记录叫“时光轴”!
  15. 1033 旧键盘打字 (20分)
  16. mosquitto出现由于目标计算机积极拒绝,无法连接
  17. 使用sklearn进行增量学习
  18. 百度竞价推广中的,28定律是什么?
  19. 罗永浩疑回应再被强制执行
  20. 生活随记 - 干瞪眼

热门文章

  1. mac拓展显示屏睡眠或锁屏后启动黑屏,mac typeC不支持4K 60HZ
  2. opensips与对方tls sip trunk对接注意事项
  3. 美食最大的意义在于分享
  4. 【读书笔记】单人FPS关卡设计模式
  5. 如何利用python进行在线语音识别
  6. 中安威士:三大安全隐患,不得不防的企业数据问题
  7. openwrt的ddns总是没有及时更新
  8. 新闻丨可信区块链电信应用组正式成立
  9. 创业板IPO过会14月后昆山香料及2保代收证监会警示函,未对产品性质作出审慎认定
  10. java计算机毕业设计基于springboo+vue的个人家庭理财记账管理系统