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>");
}
}
这个小工具比较简单?;揪褪堑鞯鰽PI。希望对各位看官有所帮助。
- End -
来源:Thepoly公众号
上一篇 Unity如何预定义UI?
下一篇 Unity动画系统设计介绍(上)
热门课程
专业讲师指导 快速摆脱技能困惑相关文章
多种教程 总有一个适合自己专业问题咨询
你担心的问题,火星帮你解答腾讯游戏美术春招已经启动啦!25、26、27、28届均有机会投递,实习岗位有动画、特效、3D场景/角色、2D场景/角色、技术美......
刚入学的同学,在第一次学到新软件的时候,经?;岜桓髦挚旖菁?。但是网上download的快捷键记忆图,不一定就是合适的。这里......
官方宣布3月共134款新游戏版号过审,网传68家游戏公司超1000岗位
提前了解行业趋势,关注热门游戏和新技术如AI、UE5等;或通过了解和参加线上、线下行业游戏大赛或交流峰会,增加行业信息来源,积......
今天要分享的是武汉校区剪包专场招聘会,企业代表是曾就读于武汉校区2210期的剪包学长,这次代表公司返校,招聘视频拍摄剪辑岗位。
AI时代找不到工作怎么办?瞄准这6个常青树行业,火星全专业可匹配!
科技在创新,社会在发展,自动化、机器人和AI人工智能的应用,让很多重复性高、低技能要求的传统工作岗位正在被逐步取代,这是一个无......
一般发生在下半年,如果公司上半年业绩未达标,有些公司可能会在年中发起招聘需求,为团队储备一些新人,到年底以“试用期不通过”为理......