U3D引擎 | 批量自动创建文件夹
U3D代码虚幻引擎Thepoly 15795 2
实名

通过了实名认证的内容创造者

发布于 2022-3-29 18:44:46

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 Thepoly 于 2022-3-29 18:48 编辑

             src=http___xqimg.imedao.com_17b70f518351426d3fd73b36.png!800.jpgrefer=http___xqimg.imedao.webp.jpg
174551k9r66ex7z719e99h.jpg



Hello . 大家好
今天给大家带来一个小工具的编写逻辑
我是水王麦田



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;)是定义当前工具打开的位置。后面必须跟随路径。或者其他,其他使用方法诸如添加快捷键可以参考这篇文章(http://www.voidcn.com/article/p-nvlowbpg-ka.html


下面,我们开始第一个方法,写好窗口,这里定义了一个长宽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完整代码

  1. using UnityEngine;
  2. using System.IO;
  3. using UnityEditor;
  4. using System;

  5. public class Createfolder_Prefab : EditorWindow
  6. {
  7.     [MenuItem("XRRender/CreateFolder/Create_Prefab_Folder")]
  8.     public static void addWindow()
  9.     {
  10.         Rect wr = new Rect(0, 0, 300, 500);
  11.         Createfolder_Prefab window =
  12.             (Createfolder_Prefab) EditorWindow.GetWindowWithRect(typeof(Createfolder_Prefab), wr, true,
  13.                 "创建Prefabs常用文件夹");
  14.         window.Show();
  15.     }

  16.     private string text1 = "Prefabs";
  17.     private string text2;

  18.     void OnGUI()
  19.     {
  20.         EditorGUILayout.Space(20);
  21.         text1 = EditorGUILayout.TextField("输入父层级名称:", text1);
  22.         EditorGUILayout.Space(20);
  23.         text2 = EditorGUILayout.TextField("输入Prefab名称:", text2);
  24.         EditorGUILayout.Space(50);


  25.         if (GUILayout.Button("创建", GUILayout.Width(80), GUILayout.Height(40)) && !string.IsNullOrWhiteSpace(text1) && !string.IsNullOrWhiteSpace(text2))
  26.         {
  27.             GenerateFolder();
  28.             //打开一个通知栏
  29.             this.ShowNotification(new GUIContent("创建成功"));
  30.         }

  31.         if (string.IsNullOrWhiteSpace(text1) || string.IsNullOrWhiteSpace(text2))
  32.         {
  33.             this.ShowNotification(new GUIContent("字符不能为空或符号"));
  34.             Debug.LogWarning("<color=red><b>字符不能为空或符号</b></color>");
  35.         }
  36.     }

  37.     private void GenerateFolder()
  38.     {
  39.         string prjPath = Application.dataPath + "/" + "Arts" + "/" + text1 + "/" + text2;
  40.         Directory.CreateDirectory(prjPath + "/" + "Textures");
  41.         Directory.CreateDirectory(prjPath + "/" + "Materials");
  42.         Directory.CreateDirectory(prjPath + "/" + "Models");
  43.         Directory.CreateDirectory(prjPath + "/" + "Prefabs");
  44.         Directory.CreateDirectory(prjPath + "/" + "Shaders");
  45.         Directory.CreateDirectory(prjPath + "/" + "Materials");
  46.         Directory.CreateDirectory(prjPath + "/" + "Animations");
  47.         Directory.CreateDirectory(prjPath + "/" + "Audios");
  48.         Directory.CreateDirectory(prjPath + "/" + text2 + "_Sence");
  49.         //刷新unity资源显示
  50.         AssetDatabase.Refresh();
  51.         Debug.Log("Arts/"+text1 + "/"+text2+"文件夹" + "<color=green><b>创建成功</b></color>");
  52.     }
  53. }
点击此处复制文本

这个小工具比较简单。基本就是调调API。希望对各位看官有所帮助。



- End -


喜欢Thepoly的可以通过三种方式与我们建立联系。分别是公众号、微信群以及QQ群。公众号是我们最为官方的窗口,更多内容都必须关注公众号后才能获取。另外现已开通网站:www.thepoly.cn更多精彩请关注我们。
         

本帖被以下画板推荐:

还没有设置签名!您可以在此展示你的链接,或者个人主页!
使用道具 <
beg1  发表于 2022-8-12 10:46:08  
2#
虽然看不懂,
回复 收起回复
使用道具
肆酒清歌a  发表于 2023-1-4 20:19:54  
3#
美术表示看懂了功能但是不知道怎么使用0.o
回复 收起回复
使用道具
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表