當前位置:首頁 >教程首頁 > 遊戲程序 > 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公眾號

华体会hth体育网 賞析
  • 2101期學員李思庭作品

    2101期學員李思庭作品

  • 2104期學員林雪茹作品

    2104期學員林雪茹作品

  • 2107期學員趙淩作品

    2107期學員趙淩作品

  • 2107期學員趙燃作品

    2107期學員趙燃作品

  • 2106期學員徐正浩作品

    2106期學員徐正浩作品

  • 2106期學員弓莉作品

    2106期學員弓莉作品

  • 2105期學員白羽新作品

    2105期學員白羽新作品

  • 2107期學員王佳蕊作品

    2107期學員王佳蕊作品

專業問題谘詢

你擔心的問題,火星幫你解答

微信掃碼入群領福利

掃碼領福利最新AI資訊

點擊谘詢
添加老師微信,馬上領取免費課程資源

1. 打開微信掃一掃,掃描左側二維碼

2. 添加老師微信,馬上領取免費課程資源

×

同學您好!

您已成功報名0元試學活動,老師會在第一時間與您取得聯係,請保持電話暢通!
確定