NoiseFloor 发表于 2022-3-31 15:42

*Unity自动化

本篇主要讲得是游戏制作流程的优化(工具制作),属于Unity中级篇。
什么是自动化?

自动化(又称:程序化生成工具包)是指:某类功能由程序按照一定(操作方便、可视方便的)规则封装好,供他人使用。
自动化有什么用?

[*]规范流程:自动化规定了流程,操作得到了规范。
[*]操作方便:由于功能封装完了,只需按照手册操作。
[*]一劳永逸(省事省力):功能封装完后,无需再动用更多的劳力(但由于封装性,使用有一定局限。如:需求不同时,仍需要维护)。
一般哪些功能会自动化?

[*]导表工具
[*]代码模板生成
[*]编辑器类工具(动画编辑器、技能编辑器等)
[*]任何可能成为插件的功能(寻路、战斗等)
<hr/>内容目录


[*]基础篇(放在下面了)
[*]资源管理篇
[*]UI自动化
[*]编辑器扩展篇
<hr/>基础

序列化和持久化

序列化

[*]深入Unity序列化 - 波波沙的文章 - 知乎
[*]关于Unity中Inspector序列化显示Dictionary的方法 - LinLin的文章 - 知乎
[*]ISerializationCallbackReceiver这个方法只能序列化,无法持久化(因为public static T CreateInstance<T>() where T : ScriptableObject)
序列化方式
1. -> 标记类或结构为可序列化,显示在界面上
2. ->将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("m_SavedProperties");
SerializedProperty property = saveProperty.FindPropertyRelative("m_TexEnvs");序列化内容修改的响应

[*]OnValidate():当序列化内容修改后,会调用。
持久化
持久化是指:保存文件到本地。
Unity中,.asset会自动持久化到文件中,但是如果脚本中含有字典、HashSet等(Unity不支持的)集合,这些集合不会自动持久化。
IO操作

常见文件操作
//获取路径下所有文件
Directory.GetFiles("Assets/Test/Editor/Data","*.asset");
//Resources方式(无需文件名后缀)
Resources.Load<Setting>("Setting");
//AssetDatabase方法(仅编辑器有效)
var setting = AssetDatabase.LoadAssetAtPath<Setting>("Assets/Setting\Setting.asset");(正反斜杠都生效)
//File
File.Create("Path");//创建文件
File.Delete("Path");//删除问题
//路径转换
Str.Replace('/', '\\');流
//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("WriteFilePath:" + filePath);searchPattern
"*t" -> 以字母“t”结尾的文件
"*.gif" -> 以字母“.gif”结尾的文件
"s" -> 以字母“s”开头的文件创建Class : ScriptableObject的Asset文件

[*]ScriptableObject文件需要是一个单独的.CS文件(且文件名和Class名一致),否则第二次进入Unity(或资源刷新)文件的Inspector信息就会丢失。
[*]注意:AssetDatabase.CreateAsset (scriptableObj, outputPath)中outputPath错写成文件夹路径,那么整个文件夹都会坏死。
//菜单创建


//代码生成 - 没有实例
      string outputPath = "Assets/Resources/x.asset";
      X scriptableObj = ScriptableObject.CreateInstance<X> ();
      AssetDatabase.CreateAsset (scriptableObj, outputPath);
      AssetDatabase.SaveAssets ();
      AssetDatabase.Refresh();
//代码生成 - 已有实例
      string outputPath = "Assets/Resources/x.asset";
      AssetDatabase.CreateAsset (scriptableInstance, outputPath);
      AssetDatabase.SaveAssets ();
      AssetDatabase.Refresh();<hr/>导表工具ExcelToOther

将Excel文件转为特定格式文件(.json、.csv、.asset)。

[*]TableML - GitHub
生成特定格式文件,同时生成JavaBean,详情看这里。

[*]Excel Exportor - GitHub
最常用的,用Python写的工具,详情看这里。

[*]NPOI
区别于其他导表工具,它能转为.asset文件,详情看这里。

[*]ExcelDataReader - GitHub
最老的导表工具,稍微复杂一些。
或者在码云(或GitHub)里搜索更多开源。
<hr/>生成DLL文件


[*]透明:给第三方公司提供Unity插件,而又不希望第三方看到具体代码。
[*]通用和方便维护:同一个公司多个项目都用到某个模块,则可以把该模块封装成dll。
[*]特殊需求1:在代码中使用 Unity 不支持的编译器。
[*]特殊需求2:在 .dll 文件中添加第三方 .NET 代码。
[*]特殊需求3:不使用Unity源码。
[*]Unity插件之Unity调用C#编译的DLL(VisualStudio生成法)
[*]UsingDLL(Unity文档)
[*]DLL加密
页: [1]
查看完整版本: *Unity自动化