|
本篇主要讲得是游戏制作流程的优化(工具制作),属于Unity中级篇。
什么是自动化?
自动化(又称:程序化生成工具包)是指:某类功能由程序按照一定(操作方便、可视方便的)规则封装好,供他人使用。
自动化有什么用?
- 规范流程:自动化规定了流程,操作得到了规范。
- 操作方便:由于功能封装完了,只需按照手册操作。
- 一劳永逸(省事省力):功能封装完后,无需再动用更多的劳力(但由于封装性,使用有一定局限。如:需求不同时,仍需要维护)。
一般哪些功能会自动化?
- 导表工具
- 代码模板生成
- 编辑器类工具(动画编辑器、技能编辑器等)
- 任何可能成为插件的功能(寻路、战斗等)
<hr/>内容目录
- 基础篇(放在下面了)
- 资源管理篇
- UI自动化
- 编辑器扩展篇
<hr/>基础
序列化和持久化
序列化
- 深入Unity序列化 - 波波沙的文章 - 知乎
- 关于Unity中Inspector序列化显示Dictionary的方法 - LinLin的文章 - 知乎
- ISerializationCallbackReceiver这个方法只能序列化,无法持久化(因为public static T CreateInstance<T>() where T : ScriptableObject)
序列化方式
1. [System.Serializable] -> 标记类或结构为可序列化,显示在界面上
2. [SerializeField] -> 将private变量显示在界面上
3. Class : ScriptableObject -> 可序列化为.asset文件
4. SerializedProperty/SerializedObject -> 获取序列化.asset文件里参数的类
【示例 - 拿序列化文件的纹理属性】
Material mat = AssetDatabase.LoadAssetAtPath(path, typeof(Material)) as Material;
SerializedObject so = new SerializedObject(mat);
SerializedProperty m_SavedProperties = so.FindProperty(&#34;m_SavedProperties&#34;);
SerializedProperty property = saveProperty.FindPropertyRelative(&#34;m_TexEnvs&#34;);序列化内容修改的响应
- OnValidate():当序列化内容修改后,会调用。
持久化
持久化是指:保存文件到本地。
Unity中,.asset会自动持久化到文件中,但是如果脚本中含有字典、HashSet等(Unity不支持的)集合,这些集合不会自动持久化。
IO操作
常见文件操作
//获取路径下所有文件
Directory.GetFiles(&#34;Assets/Test/Editor/Data&#34;,&#34;*.asset&#34;);
//Resources方式(无需文件名后缀)
Resources.Load<Setting>(&#34;Setting&#34;);
//AssetDatabase方法(仅编辑器有效)
var setting = AssetDatabase.LoadAssetAtPath<Setting>(&#34;Assets/Setting\Setting.asset&#34;);(正反斜杠都生效)
//File
File.Create(&#34;Path&#34;);//创建文件
File.Delete(&#34;Path&#34;);//删除问题
//路径转换
Str.Replace(&#39;/&#39;, &#39;\\&#39;);流
//FileStream写入数据
FileStream stream;
if (!File.Exists(filePath))
stream = File.Create(filePath);
else
stream = File.OpenWrite(filePath);
//Clear
stream.Seek(0, SeekOrigin.Begin);
stream.SetLength(0);
byte[] writeBytes = Encoding.UTF8.GetBytes(text);
stream.Write(writeBytes, 0, writeBytes.Length);
stream.Close();
AssetDatabase.Refresh();
Debug.Log(&#34;WriteFilePath:&#34; + filePath);searchPattern
&#34;*t&#34; -> 以字母“t”结尾的文件
&#34;*.gif&#34; -> 以字母“.gif”结尾的文件
&#34;s&#34; -> 以字母“s”开头的文件创建Class : ScriptableObject的Asset文件
- ScriptableObject文件需要是一个单独的.CS文件(且文件名和Class名一致),否则第二次进入Unity(或资源刷新)文件的Inspector信息就会丢失。
- 注意: AssetDatabase.CreateAsset (scriptableObj, outputPath)中outputPath错写成文件夹路径,那么整个文件夹都会坏死。
//菜单创建
[CreateAssetMenu(fileName=&#34;x&#34;,menuName=&#34;X&#34;)]
//代码生成 - 没有实例
string outputPath = &#34;Assets/Resources/x.asset&#34;;
X scriptableObj = ScriptableObject.CreateInstance<X> ();
AssetDatabase.CreateAsset (scriptableObj, outputPath);
AssetDatabase.SaveAssets ();
AssetDatabase.Refresh();
//代码生成 - 已有实例
string outputPath = &#34;Assets/Resources/x.asset&#34;;
AssetDatabase.CreateAsset (scriptableInstance, outputPath);
AssetDatabase.SaveAssets ();
AssetDatabase.Refresh();<hr/>导表工具ExcelToOther
将Excel文件转为特定格式文件(.json、.csv、.asset)。
生成特定格式文件,同时生成JavaBean,详情看这里。
最常用的,用Python写的工具,详情看这里。
区别于其他导表工具,它能转为.asset文件,详情看这里。
最老的导表工具,稍微复杂一些。
或者在码云(或GitHub)里搜索更多开源。
<hr/>生成DLL文件
- 透明:给第三方公司提供Unity插件,而又不希望第三方看到具体代码。
- 通用和方便维护:同一个公司多个项目都用到某个模块,则可以把该模块封装成dll。
- 特殊需求1:在代码中使用 Unity 不支持的编译器。
- 特殊需求2:在 .dll 文件中添加第三方 .NET 代码。
- 特殊需求3:不使用Unity源码。
- Unity插件之Unity调用C#编译的DLL(VisualStudio生成法)
- UsingDLL(Unity文档)
- DLL加密
|
|