Unity3D工程全资源自动检测系统
是什么
这系统到底是个啥
本系统主要用于自动监测与检测各类型资源是否正常及满足指定规范,并在第一时间把出现的问题输出到控制台与保存到文件,以供对应的负责人及时修正。
为什么
你可能经常遇到的问题
-
资源名字或路径不规范?
-
资源丢引用?
-
特效丢材质或贴图?
-
预设丢组件或脚本?
-
动作控制器丢动画?
-
等等很多各类美术程序资源引用的丢失都可检测到
-
文件有冲突?
-
典型的是meta冲突导致各种资源BUG
-
组件属性设置有误?
-
特效OrderInLayer不合适?
-
UILabel层级不对?
-
用了不该用的组件或资源?
-
用了系统的材质/贴图/Shader?
-
JSON填错导致格式挂掉了?
-
Shader用了不兼容或不合适的语句?
-
资源性能数据不满足要求?
-
突然发现模型骨骼/面数/顶点数超了?
-
贴图大小或格式设置不对?
-
等等
-
策划测试发现资源有问题却不知该找谁?
-
More!还有很多功能已有或可以很方便地扩展。
你可能有类似的检测工具但是可能存在这样的问题
-
你可能需要定时或按心情来手动检测项目中某个路径或某种资源有什么问题
-
别的项目组想用你的类似工具,却要做很多的修改和合并。
-
为了新增加一个新的检测类型,你可能得修改很多原来的检测代码。
-
你可能得修改类文件来应付诸如“策划修改了某类资源的路径”或“策划增加了对某类资源的命名的检测”
-
你可能重载了很多 OnPostprocessAllAssets ,导致资源导入很慢,或经常不知道什么地方修改了资源导入的设置。
怎么用
我怎么把它用到我的项目
-
耦合性很低,直接拷贝对应的文件目录过来即可。
-
你可能需要修改下配置表,以增减或修改一些功能或路径来适应你的项目
-
默认会自动启用资源的自动检测,当然你也可以随时在编辑器界面或配置中关闭它
我怎么扩展它
已有类型的扩展你只要修改配置表即可,比如如果要增加"对某类新资源的命名规范或路径"的检测
不存在的类型的扩展,你需要这样做
-
继承 AssetValidateBase
-
重载 bool OnAssetTypeCheck(string assetPath) 以判断是否是你要检测的资源类型
-
重载 bool OnAssetvalidate(string assetPath) 对资源进行你想要的检测
代码呢?
别说话,上代码
抱歉,处于各种原因,不能给大家放上完整的代码。但是我会说明原理和所有的核心技术点,如果你有任何问题,也可以给我留言咨询(QQ569491198),谢谢。
核心技术
-
它是怎么捕获到资源的修改的
-
继承 Unity3D 的 AssetPostprocessor ,重载它的 OnPostprocessAllAssets
-
附上官网API说明
-
这样当有新增/修改/删除资源时你都可以 Hook 到,并进行自己的判断。
-
怎么不修改原来的代码来新增子校验器
-
把子校验器的类名配置到配置表中
-
通过反射来获取对应类名的校验器子类,执行其基类的相关方法即可
-
你可以查阅反射相关的API,也可以借鉴这段代码
-
Assembly
-
Type.GetType();
-
CreateInstance
-
不同校验器需要的数据的数据结构不一样,如何不修改原代码来动态获取
-
这是通过JSON来实现的
-
编辑器下你可以用U3D自带的JSON处理类来处理JSON
-
JsonUtility
-
如何知道某个GUID对应的资源是否存在?
-
你可以通过U3D的API,获取到对应GUID对应的Path,判断它是否为空,且文件存在,且不是默认资源,来判断这个资源是否存在。
-
UnityEditor.AssetDatabase.GUIDToAssetPath()
-
这些路径为内置资源路径
-
"Resources/unity_builtin_extra"
-
"Library/"
-
如果通过这个API返回的路径为空,也可能是内置资源
-
AssetDatabase.GetAssetOrScenePath
-
如何判断资源是否丢引用的
-
你可以通过读文本的方式读取资源的文本形式
-
这点很简单,但很有用,U3D很多资源都是有一定的格式的,包括meta文件等,善于利用这一点可以做很多事
-
再通过正则等方式匹配到资源的GUID/Type/Name/FileID等信息
-
你可能需要对C#正则表达式有一定的了解
-
送上解析资源文本中的绝大部分GUID等信息的正则表达式
-
private const string REG_TO_MATCH_FILEDS = @"\s(?<FieldName>[a-zA-Z_]+?)(\s)*?\:(\s)*?-*(\s)*?\{(\s)*?fileID(\s)*?\:(\s)*?(?<FileID>[0-9]+?)(\s)*?\,(\s)*?guid(\s)*?\:(\s)*?(?<GUID>[a-zA-Z0-9]+?)(\s)*?\,(\s)*?type(\s)*?\:(\s)*?(?<Type>[0-9])(\s)*?\}";
-
再去校验这些GUID是否存在。
还有吗
还有什么功能或技术吗
-
确实有很多细节,不论是功能实现,还是技术细节,限于篇幅,只能粗略提下了。
-
已实现且建议实现的功能包括但不限于:
-
你得把一次检测或监测到的问题记录到文本,方便查阅和修正
-
你得有个编辑器界面去很好地控制这个系统,包括但不限于控制整个系统及所有小校验器的开启和关闭。
-
你得很好地设计你的系统,让每个问题都绑定给对应的负责人(比如业务开发程序/引擎开发程序/动作美术/场景美术/特效美术/剧情策划/系统策划等)
注意点
使用或制作这个系统要注意什么?
-
需要注意,这个系统的核心是基于U3D资源库的文件的变动回调的,请尽量不要在系统中修改资源,否则可能跟你工程中其他对这个资源有修改的操作冲突,导致死循环。
-
也请知悉,刚用这类工具时,可能会检测出很多资源问题,这代表着,你可能会频繁去找很多其他组员或其他组的成员的问题,请保证你比他们强壮...