当前位置:首页 >教程首页 > 游戏程序 > Unity3D游戏开发工程师班 >U3D引擎如何批量自动创建文件夹

U3D引擎如何批量自动创建文件夹

发布时间:2021-09-14 10:04:54

Hello,大家好,今天给大家带来一个小工具的编写逻辑,U3D引擎如何批量自动创建文件夹,我是水王麦田。

1、阐述背景

1.webp.jpg

开发项目的时候,经常会遇到一个问题,就是资源胡乱存放,不按照文件归类。然后就会导致项目开发到后面,越来越乱,维护成本越来越高。实在受不了开始整理,就像下面一样。一整理就是一天,甚至更多,然后传Git,啪,各种冲突,脚本丢失,程序炸毛,Mesh missing,prefab变红,引擎美术掏出了刀子……

这种问题,我们应该从源头上就避免掉,从开始就规范好每个文件夹存放的路径,每个资源存放的位置。但是每次都手动右键新建文件夹确实挺累的,尤其是我们一个项目是按照一个Prefab为一个单位存放的方式。所以花了一点时间搞一个小功能让他自己去创建,岂不美哉。

首先,我们来看一下这个小工具的使用方法,我目前路径是按照我所需要的方式去配置的,如果是美术同学想用的话,直接打开脚本文件把路径修改了就好。路径也可以暴露出来,但是我没有。如果说我懒,我也认了。(完整代码添加在最后)

2、工具预览

2.webp.jpg

打开方式如图,这里的路径可改,如下图。

3.webp.jpg

这里分别是两个脚本,我没有把他们写在一起。一个是创建共用的资产文件夹,比如我们有贴图需要共用,比如Noise,或者是需要共用的Mesh,索性一股脑都放在共用文件夹下面。我们来看一下:

4.webp.jpg

是的,只有一个创建按钮.......

点击创建之后,控制台提示文件夹创建成功。

5-1.jpg5-2.webp.jpg

自动创建好了所有类型的文件夹。

另一个是按照Prefab为单位创建文件夹。当前Prefab所用到的所有资产,都会存在对应的路径下,我们来看一下:

6.webp.jpg

弹出了一个窗口,第一个是父级名称,默认是Prefab(可改),比如美术资产一般会以Arts开头,这里就可以填写Arts,然后资产都会被默认创建在Arts下。

输入Prefab名称,刚刚也说了,我是按照Prefab分类非共用资产的,所以这里填写的Prefab名称,就是Arts这个目录下的子目录名称,如:我填写Pref_Test,然后点击确定。

7.webp.jpg

控制台提示我这个路径的文件夹创建成功,并且创建好了对应的空文件夹。

3、实现方式

下面我们来看一下实现方式:

直接说Prefab的代码,因为创建Public类型的里面其实都囊括了。

8.webp.jpg

首先,我们引用进命名空间,第一个是是必须引用的,第三个是编辑器扩展支持。第二个是在Visual C# .NET 中读取文本文件打开和读取文件进行读取访问是输入/输出 (IO) 功能的一个非常重要的部分。说通俗点其实就是你想创建文件夹,这个不是引擎层面的,是操作系统层面的读和写。

接着往下看:我把代码折叠起来,主要看到只有一个继承了Editorwindow的class类,然后这个类里面有三个方法,AddWindow , OnGUI 和GenerateFolder ,其中OnGUI是Unity自带的继承方法。其他两个是自定义方法。

9.webp.jpg

我们看一下第8行,这一行MenuItem这个类(MenuItem是编辑器属性(Editor Attributes)类,所以在使用之前要添加一句:using UnityEditor;)是定义当前工具打开的位置。后面必须跟随路径。

10.webp.jpg

下面,我们开始第一个方法,写好窗口,这里定义了一个长宽300-500的Rect,然后调用GetWithRect创建出来。

然后声明两个私有字段,第一个默认叫Prefab,也就是一开始窗口打开时默认的字,如果修改成Art,那就是会创建在Arts下。

11.webp.jpg

第二个方法:重写了OnGUI方法,(EditorGUILayout.Space(20);)是指当前的空格距离,20是界面上距离上一个GUI块为20,然后分别给两个字段声明,由用户传入进来。

然后接着用if做一次判断,这是一个条件语句:如果点击了创建按钮,并且这两个字段不为空,则运行(GenerateFolder)方法,并且展示创建成功GUI。如果有一个条件不满足(如有一个字段为空),则运行下一个if,弹出警告GUI,并且控制台打印错误警告。

12.webp.jpg

最后一个方法:创建文件夹方法。

13.webp.jpg

首先我们定义一个字段并且拿到这个API,返回路径(即Unity的最外路径Assets),然后创建在Arts下面。”/”是一个转义字符,代表下一层,分别是用户输入进来的字段。

14.webp.jpg

然后调用Directory.CreateDirectory方法,当前目录的创建其他的文件夹。这里的目录和路径如果想改成自己要用的话,都是可以改的。

最后,调用refresh方法,刷新一次当前已修改的数据,并且打印Log。

15.webp.jpg15-2.webp.jpg

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公众号

学员作品赏析
  • 2101期学员李思庭作品

    2101期学员李思庭作品

  • 2104期学员林雪茹作品

    2104期学员林雪茹作品

  • 2107期学员赵凌作品

    2107期学员赵凌作品

  • 2107期学员赵燃作品

    2107期学员赵燃作品

  • 2106期学员徐正浩作品

    2106期学员徐正浩作品

  • 2106期学员弓莉作品

    2106期学员弓莉作品

  • 2105期学员白羽新作品

    2105期学员白羽新作品

  • 2107期学员王佳蕊作品

    2107期学员王佳蕊作品

专业问题咨询

你担心的问题,火星帮你解答
×

确定