Unity3D插件開發教程(四):獲取地址組件

前言

前幾天做導出安裝包插件時,遇到了個問題,我需要獲取地址,可是每次都要手動填入(複製粘貼)地址是個很費時不討好的事,所以我就寫了一個獲取地址的小組件。 樣子就是這樣的:

一個文本和一個按鈕,文本顯示選擇的路徑(路徑為空時顯示提示語,並且無法選擇),點擊按鈕打開面板選擇文件夾。

聲明

  • 歡迎分享本文
  • 本文未經允許不能以任何形式轉載。

知識要點

  • 組合GUI組件
  • EditorGUI.BeginDisabledGroup()/EndDisabledGroup()
  • EditorUtility.OpenFolderPanel()

使用版本

  • Unity3D 5.3.3

目標

  • 如何把多個組件封裝在一起,組合成自己需要用的組件,然後一句代碼就可以調用

準備

整個插件的結構:

在開始寫主要邏輯之前,我們先要做準備工作,那就是,怎麼打開下圖這個窗口(系統選擇文件夾的窗口)。

我在網上搜了一下「Unity3d 如何選擇文件夾」的資料,發覺都是要導入一個System.Windows.Forms.dll,然後調用OpenFileDialog。 可是這種方式很不優雅,所以我就去找api,發現了原來EditorUtility是有操作外部文件的方法(項目內部使用AssetDatabase)。EditorUtility裡面的OpenFilePanel()OpenFolderPanel()方法就是今天我們要用到的,選擇文件和選擇文件夾。

代碼:

準備工作好了,那麼接下來就是正式的代碼邏輯了,我們先創建一個GUIExtendWindow的窗口類,之前的教程已經教了很多次了,這裡就不再敘述了。

然後申明一個欄位「_folderPath」用於後面保存路徑。

public class GUIExtendWindow : EditorWindown{n [MenuItem("Tools/GUIExtend")]n public static void ShowWindow()n {n EditorWindow.GetWindow<GUIExtendWindow>("GUIExtend");n }nn private string _folderPath;n}n

接下來就是今天的主角————OpenFolderPanelField()方法。我們要把按鈕和文本的邏輯都封裝在這個方法裡面。首先先看看整個方法的代碼。

/// <summary>n/// n/// </summary>n/// <param name="path">選擇的路徑</param>n/// <param name="buttonLabel">按鈕上的文字</param>n/// <param name="tips">提示</param>n/// <returns></returns>nprivate string OpenFolderPanelField(string path, string buttonLabel, string tips)n{n bool disabled;nn string content;nn if (string.IsNullOrEmpty(path))n {n disabled = true;nn content = tips;n }n elsen {n disabled = false;nn content = path;n }nn EditorGUILayout.BeginHorizontal();nn EditorGUI.BeginDisabledGroup(disabled);n EditorGUILayout.TextArea(content, EditorStyles.label);n EditorGUI.EndDisabledGroup();nn if (GUILayout.Button(buttonLabel, GUILayout.Width(100)))n {n string currentDirectory;nn if (string.IsNullOrEmpty(path))n {n currentDirectory = Directory.GetCurrentDirectory();n }n elsen {n currentDirectory = path;n }nn path = EditorUtility.OpenFolderPanel(tips, currentDirectory, "");n }nn EditorGUILayout.EndHorizontal();nn return path;n}n

三個參數的作用注釋已經說明了,而參數部分是可以根據你功能自定義的,你可以替換成GUIContent類型,也可以刪除或增加,這就看具體要做到什麼的效果了。

接著是判斷路徑參數是否為空。空的話,文本內容顯示為tips,無法選擇。不為空,文本內容顯示路徑,可以選擇。

EditorGUILayout.BeginHorizontal()方法之前的文章提到過,是水平布局的一個組件。 這些組件都是一對對的,有Begin就有End。例如BeginDisabledGroup()/EndDisabledGroup(),這是個禁用組件,如果參數為true,包含著的組件都會變成禁用狀態。

在禁用組件中間我們繪製一個TextArea組件,樣式是EditorStyles.label,這樣,原本是文本就不會顯示文本框,而又可以選擇文本。

接著是點擊按鈕的邏輯,首先是準備一個默認目錄待會打開,默認打開path,如果path為空,則獲取項目的目錄。

然後我們就可以是使用OpenFolderPanel打開面板了,第一個參數為窗口的標題,第二個參數為默認打開的文件夾目錄,第三個參數選擇的文件夾的默認名字。使用很簡單,用一下就可以了。然後這個方法會回調一個你選擇的文件夾的絕對地址。然後我們賦值到參數path里,最後返回。

組件封裝完畢了,接下來就是使用了,使用也很簡單,跟EditorGUILayout的方法一樣使用就行了。

void OnGUI()n{n _folderPath = OpenFolderPanelField(_folderPath, "Select Folder", "please select Folder");n}n

最後

其實,Unity3D的GUILayoutEditorGUILayout等類都是採用上述的方法將多個組件(內容)封裝在一起。 所以這種封裝的方法我建議是寫在一個類裡面,然後變成靜態函數,這樣就可以任何地方都能使用。例如筆者就用了一個EditorGUILayoutExtend作為封裝組件的類。

有人問到,如果我不是選擇文件夾,而是選擇文件怎麼辦,其實做法也是一樣的,當然,我也會在源代碼裡面把選擇文件的邏輯加上。

源代碼

==========================分割線==========================

如果大家有什麼意見和建議,或者是有什麼疑問,或者是有想看的知識點內容,都歡迎到評論區發上你們的評論。

最後我希望有更多人參與到插件開發的隊伍里。也歡迎大家投稿。

QQ群:234204968

=========================最後的最後=======================

你們覺得好記得贊啊,覺得不好可以評論啊,不然我不知道到底有沒有人在看啊/(ㄒoㄒ)/~~


推薦閱讀:

從零開始學基於ARKit的Unity3d遊戲開發系列16
聊聊Unity里的嵌套Prefab
從零開始學基於ARKit的Unity3d遊戲開發系列10
大萌喵的Unity後期特效第一發---鏡頭炫光與光暈(Flare)
(Unity) 為被 Lua 隔斷的 C# 實現添加 Profiler 支持

TAG:Unity游戏引擎 | 游戏引擎 |