Hello,大家好,今天给大家带来一个小工具的编写逻辑,U3D引擎如何批量自动创建文件夹,我是水王麦田。
1、阐述背景
开发项目的时候,经常会遇到一个问题,就是资源胡乱存放,不按照文件归类。然后就会导致项目开发到后面,越来越乱,维护成本越来越高。实在受不了开始整理,就像下面一样。一整理就是一天,甚至更多,然后传Git,啪,各种冲突,脚本丢失,程序炸毛,Mesh missing,prefab变红,引擎美术掏出了刀子……
这种问题,我们应该从源头上就避免掉,从开始就规范好每个文件夹存放的路径,每个资源存放的位置。但是每次都手动右键新建文件夹确实挺累的,尤其是我们一个项目是按照一个Prefab为一个单位存放的方式。所以花了一点时间搞一个小功能让他自己去创建,岂不美哉。
首先,我们来看一下这个小工具的使用方法,我目前路径是按照我所需要的方式去配置的,如果是美术同学想用的话,直接打开脚本文件把路径修改了就好。路径也可以暴露出来,但是我没有。如果说我懒,我也认了。(完整代码添加在最后)
2、工具预览
打开方式如图,这里的路径可改,如下图。
这里分别是两个脚本,我没有把他们写在一起。一个是创建共用的资产文件夹,比如我们有贴图需要共用,比如Noise,或者是需要共用的Mesh,索性一股脑都放在共用文件夹下面。我们来看一下:
是的,只有一个创建按钮.......
点击创建之后,控制台提示文件夹创建成功。
自动创建好了所有类型的文件夹。
另一个是按照Prefab为单位创建文件夹。当前Prefab所用到的所有资产,都会存在对应的路径下,我们来看一下:
弹出了一个窗口,第一个是父级名称,默认是Prefab(可改),比如美术资产一般会以Arts开头,这里就可以填写Arts,然后资产都会被默认创建在Arts下。
输入Prefab名称,刚刚也说了,我是按照Prefab分类非共用资产的,所以这里填写的Prefab名称,就是Arts这个目录下的子目录名称,如:我填写Pref_Test,然后点击确定。
控制台提示我这个路径的文件夹创建成功,并且创建好了对应的空文件夹。
3、实现方式
下面我们来看一下实现方式:
直接说Prefab的代码,因为创建Public类型的里面其实都囊括了。
首先,我们引用进命名空间,第一个是是必须引用的,第三个是编辑器扩展支持。第二个是在Visual C# .NET 中读取文本文件打开和读取文件进行读取访问是输入/输出 (IO) 功能的一个非常重要的部分。说通俗点其实就是你想创建文件夹,这个不是引擎层面的,是操作系统层面的读和写。
接着往下看:我把代码折叠起来,主要看到只有一个继承了Editorwindow的class类,然后这个类里面有三个方法,AddWindow , OnGUI 和GenerateFolder ,其中OnGUI是Unity自带的继承方法。其他两个是自定义方法。
我们看一下第8行,这一行MenuItem这个类(MenuItem是编辑器属性(Editor Attributes)类,所以在使用之前要添加一句:using UnityEditor;)是定义当前工具打开的位置。后面必须跟随路径。
下面,我们开始第一个方法,写好窗口,这里定义了一个长宽300-500的Rect,然后调用GetWithRect创建出来。
然后声明两个私有字段,第一个默认叫Prefab,也就是一开始窗口打开时默认的字,如果修改成Art,那就是会创建在Arts下。
第二个方法:重写了OnGUI方法,(EditorGUILayout.Space(20);)是指当前的空格距离,20是界面上距离上一个GUI块为20,然后分别给两个字段声明,由用户传入进来。
然后接着用if做一次判断,这是一个条件语句:如果点击了创建按钮,并且这两个字段不为空,则运行(GenerateFolder)方法,并且展示创建成功GUI。如果有一个条件不满足(如有一个字段为空),则运行下一个if,弹出警告GUI,并且控制台打印错误警告。
最后一个方法:创建文件夹方法。
首先我们定义一个字段并且拿到这个API,返回路径(即Unity的最外路径Assets),然后创建在Arts下面。”/”是一个转义字符,代表下一层,分别是用户输入进来的字段。
然后调用Directory.CreateDirectory方法,当前目录的创建其他的文件夹。这里的目录和路径如果想改成自己要用的话,都是可以改的。
最后,调用refresh方法,刷新一次当前已修改的数据,并且打印Log。
4、完整代码
using UnityEngine;
using System.IO;
using UnityEditor;
using System;
public class Createfolder_Prefab : EditorWindow
{
[MenuItem("XRRender/CreateFolder/Create_Prefab_Folder")]
public static void addWindow()
{
Rect wr = new Rect(0, 0, 300, 500);
Createfolder_Prefab window =
(Createfolder_Prefab) EditorWindow.GetWindowWithRect(typeof(Createfolder_Prefab), wr, true,
"创建Prefabs常用文件夹");
window.Show();
}
private string text1 = "Prefabs";
private string text2;
void OnGUI()
{
EditorGUILayout.Space(20);
text1 = EditorGUILayout.TextField("输入父层级名称:", text1);
EditorGUILayout.Space(20);
text2 = EditorGUILayout.TextField("输入Prefab名称:", text2);
EditorGUILayout.Space(50);
if (GUILayout.Button("创建", GUILayout.Width(80), GUILayout.Height(40)) && !string.IsNullOrWhiteSpace(text1) && !string.IsNullOrWhiteSpace(text2))
{
GenerateFolder();
//打开一个通知栏
this.ShowNotification(new GUIContent("创建成功"));
}
if (string.IsNullOrWhiteSpace(text1) || string.IsNullOrWhiteSpace(text2))
{
this.ShowNotification(new GUIContent("字符不能为空或符号"));
Debug.LogWarning("<color=red><b>字符不能为空或符号</b></color>");
}
}
private void GenerateFolder()
{
string prjPath = Application.dataPath + "/" + "Arts" + "/" + text1 + "/" + text2;
Directory.CreateDirectory(prjPath + "/" + "Textures");
Directory.CreateDirectory(prjPath + "/" + "Materials");
Directory.CreateDirectory(prjPath + "/" + "Models");
Directory.CreateDirectory(prjPath + "/" + "Prefabs");
Directory.CreateDirectory(prjPath + "/" + "Shaders");
Directory.CreateDirectory(prjPath + "/" + "Materials");
Directory.CreateDirectory(prjPath + "/" + "Animations");
Directory.CreateDirectory(prjPath + "/" + "Audios");
Directory.CreateDirectory(prjPath + "/" + text2 + "_Sence");
//刷新unity资源显示
AssetDatabase.Refresh();
Debug.Log("Arts/"+text1 + "/"+text2+"文件夹" + "<color=green><b>创建成功</b></color>");
}
}
这个小工具比较简单。基本就是调调API。希望对各位看官有所帮助。
- End -
来源:Thepoly公众号
上一篇 Unity如何预定义UI?
下一篇 Unity动画系统设计介绍(上)
热门课程
专业讲师指导 快速摆脱技能困惑相关文章
多种教程 总有一个适合自己专业问题咨询
你担心的问题,火星帮你解答今天,我来和大家聊聊,迪士尼动画《海洋奇缘》系列是怎么用Maya软件为他们最新的续集打造获奖动画的。
有哪些听起来高大上、实际上转行同学也能胜任的岗位?试试虚拟现实工程师!
增强现实(AR)和虚拟现实(VR)是当前备受瞩目的创新技术,对相关的增强现实开发、虚拟现实开发、数字孪生开发工程师的人才需求,......
在这个短视频盛行的时代,越来越多的人想要尝试自己进行短视频剪辑,却常常因为缺乏专业知识而无从下手。别担心,今天就为大家带来短视......
今天,我们聊聊皮克斯的《头脑特工队》系列
中国首个AIGC导演共创计划今日正式上线:同学,做导演不要?
中国首个AIGC导演共创计划定于12月6日正式上线。该计划由快手自研视频生成大模型产品“可灵AI”,联合李少红、贾樟柯、叶锦添......
近日,中央广播电视总台《2025年春节联欢晚会》发布官方吉祥物形象“巳(sì)升升”,祝福全球华人在新的一年如意康宁、好事连连。