找回密码
 立即注册
查看: 449|回复: 0

[笔记] *Unity自动化

[复制链接]
发表于 2022-3-31 15:42 | 显示全部楼层 |阅读模式
本篇主要讲得是游戏制作流程的优化(工具制作),属于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("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错写成文件夹路径,那么整个文件夹都会坏死。
//菜单创建
[CreateAssetMenu(fileName="x",menuName="X")]

//代码生成 - 没有实例
        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加密
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-12-4 01:32 , Processed in 0.092608 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表