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动画系统设计介绍(上)
热门课程
专业讲师指导 快速摆脱技能困惑相关文章
多种教程 总有一个适合自己专业问题咨询
你担心的问题,火星帮你解答学习游戏开发班可以帮助游戏爱好者从零基础成为游戏开发专家,掌握全面的游戏开发技能。
火星时代教育为您提供专业的界面设计实战班,在实践中掌握界面设计的核心技巧和最新趋势,成为优秀的UI设计师。
了解UI交互设计培训的最佳选择,比较不同培训机构的优势和特点。
火星时代教育为您推荐专业的学影视后期培训机构,提供高质量的培训内容及资深导师指导,助您成为优秀的影视后期剪辑师或合成师。
火星时代教育是一家专注于交互设计培训的机构,为学员提供专业的交互设计培训课程,并帮助他们成为优秀的交互设计师。
本文章将介绍关于UE5智慧城市专业学习的重要性和火星时代教育的资讯。
1. 打开微信扫一扫,扫描左侧二维码
2. 添加老师微信,马上领取免费课程资源
同学您好!