首页 - 信息 -  Unity3D编辑器扩展1——批量处理资源

Unity3D编辑器扩展1——批量处理资源

2023-09-20 10:12

前言

最近一段时间正在学习Unity的编辑器扩展方面的内容,因此想把所学到的知识以一种方式记录下来。有可能有很多不足的地方,甚至有错误的地方,请大佬们多多提供帮助。

什么是编辑器扩展

先说说什么是编辑器扩展。

通俗来说,编辑器扩展就是在原有的Unity编辑界面中添加各种各样的自定义功能,以达到自己想要的目的。

比如,我想在Unity菜单栏下添加一个按钮来实现删除所有图片资源。这就需要用到编辑器扩展。

这种编辑器扩展的代码跟普通挂在物体上的脚本不同,它需要放在Assets/Editor文件夹下。放在Editor文件夹下的代码,Unity自动默认为工具类代码(也就是在开发的时候帮助我们的工具“人”),在生成最终版本的时候是不会把这里面的文件打包进去的。


可能有小伙伴想问了:为什么第一节直接从批量处理资源开始呢?
因为我正好在学这个地方,其他的内容会在后续文章中补充。

最关键一步

要使用编辑器扩展,首先得用UnityEditor。有些情况下,需要对系统文件进行操作,所以有时候需要用www.genealogy-computer-tips.com。

using UnityEditor;
using System.IO;

获得路径下的资源文件

我们要批量处理资源,首先就得获得资源。

假设我们要获取某文件夹下面的所有资源,先得得到文件夹的路径path。(如Assets/Resources)

DirectoryInfo directoryInfo = new DirectoryInfo(path);//获得文件夹的info
FileSystemInfo[] fileSystemInfos = directoryInfo.GetFileSystemInfos();//获得文件夹中文件的info

这样我们就获得了该文件夹下的所有文件信息。这些文件有些是文件,有些可能是文件夹。因为我们希望彻底地遍历所有的文件,所以当我们遇到文件夹的时候需要再进一步递归该文件夹。

foreach (FileSystemInfo item in fileSystemInfos)//FullName从D:盘开始(即地址),Name就是文件名(即名称)。
{if (item is DirectoryInfo)//如果是文件夹{FindAssets(item.FullName);//递归调用该方法}else//如果不是文件夹,即如果是文件{if(!item.Name.EndsWith(".meta"))//每个资源都会有个对应的.meta文件,存储资源的ImportSetting{string importerPath = "Assets" + item.FullName.Substring(Application.dataPath.Length);//获得从Assets开始的资源路径AssetImporter assetImporter = AssetImporter.GetAtPath(importerPath);//通过上面的资源路径获得资源文件//TODO,这里已经获得了资源文件,想对资源文件进行什么操作都可以了}}
}

这时我们就以AssetImporter的形式获得了所有的资源文件。

如果我们想对其进行设置修改,我们可以将其转化为各种类型的Importer从而修改其属性。如模型文件为ModelImporter、图片文件为TextureImporter、音频文件为AudioImporter等。

最后一步

上面都是批量处理资源的方法。

所编辑器扩展,在于把功能添加到编辑器上。

很简单又很关键的一行代码就是:

[MenuItem("Tools/获取我的资源")]

这个是Unity内置的一种特性,使用了之后会在Unity菜单栏下创建该按钮。点击该按钮后调用其对应的方法。

这里的Tools是菜单栏中没有的,因此这行代码会在Unity菜单栏下创建一个Tools菜单,Tools菜单下会有一个按钮叫“获取我i的资源”。点击后就会调用之前我们写的方法。

小结

这是简单的批量获取资源的方法之一。因为本人也还在学习过程中,所以肯定有很多地方考虑不全,以及会有很多错误。希望有大佬看到能够及时指出,我会立刻进行改正,帮助我自己和大家共同进步!

有问题的小伙伴们可以在下方留言,大家可以一起讨论。


(吐槽:Markdown格式终于像模像样了…)