Unity Editor 基礎篇(三):自定義視窗案例二
阿新 • • 發佈:2018-12-14
本文為本人學習上鍊接的筆記微有改動,請點選以上鍊接檢視原文,尊重樓主智慧財產權。
---------------------------------------------------------------------------------------------------------
本文難點:
-
GUILayout.ExpandHeight(true) 使用液態高度:
-
相當於動態高度,用掉所有剩下的空間
-
GUILayoutUtility.GetRect()
-
方法會在剩下的區域返回指定寬高的矩陣
GUI.DrawTexture(Rect position, 0, GUILayout.ExpandHeight(true)),Texture image);畫貼圖
功能:
預覽一個指令碼,轉為一個文字放到指定資料夾,反過來也有。
最終效果:
程式碼:
using UnityEngine; using System.Collections; using System.IO; using UnityEditor; public class MyWindow : EditorWindow { /// <summary> /// 視窗的正確開啟方式 /// </summary> [MenuItem("Tool/My Window")] public static void ShowWindow() { EditorWindow.GetWindow(typeof(MyWindow), false, "My Tool"); } void OnGUI() { Debug.Log(position); //整個視窗為水平佈局 GUILayout.BeginHorizontal(); DrawLeft(); DrawRight(); GUILayout.EndHorizontal(); } private string scriptsContext = ""; private Vector2 scrollposition; /// <summary> /// 繪製左邊區域 /// </summary> void DrawLeft() { //區域性視窗為垂直佈局 GUILayout.BeginVertical(GUILayout.Width(position.width / 2)); //空出5個畫素 GUILayout.Space(5); //繪製標籤 GUILayout.Label("Preview"); //開始滑塊區域 scrollposition = GUILayout.BeginScrollView(scrollposition); //繪製文字區域 scriptsContext = GUILayout.TextArea(scriptsContext, GUILayout.ExpandHeight(true));//液態高度(佔滿高度) //結束滑塊區域 GUILayout.EndScrollView(); GUILayout.EndVertical(); } //檔案資源物件 private TextAsset textAssetObje; //指令碼資源物件 private TextAsset scriptAssetObje; //檔案儲存的路徑 private string saveFilePath = ""; //指令碼儲存的路徑 private string saveScritpPath = ""; //繪製2D圖片物件 private Texture2D image; /// <summary> /// 繪製右邊區域 /// </summary> void DrawRight() { //區域性視窗為垂直佈局 GUILayout.BeginVertical(); GUILayout.Space(5); #region 指令碼轉換為文字功能 // 繪製物件欄位(型別為TextAsset) textAssetObje = (TextAsset)EditorGUILayout.ObjectField("Script Object", textAssetObje, typeof(TextAsset), false); //繪製Text欄位,使用者獲取使用者指定的路徑 saveFilePath = EditorGUILayout.TextField("Save In", saveFilePath); GUILayout.Space(5); //當我們點選這個按鈕時 if (GUILayout.Button("Save File")) { //執行這個方法 SaveFile(); } #endregion GUILayout.Space(5); #region 繪製顯示指令碼內容功能 //當點選 Show Script 按鈕時 if (GUILayout.Button("Show Script")) { //執行 ShowScript 函式 ShowScript(); } #endregion GUILayout.Space(10); #region 文字轉換為指令碼功能 scriptAssetObje = (TextAsset)EditorGUILayout.ObjectField("Text Object", scriptAssetObje, typeof(TextAsset), false); saveScritpPath = EditorGUILayout.TextField("Save In", saveScritpPath); GUILayout.Space(5); //當我們點選這個按鈕時 if (GUILayout.Button("Create Script")) { //執行這個方法 CreateScript(); } #endregion #region 繪製圖片 //通過Resources.load() 載入指定的圖片 if (image == null) { image = Resources.Load<Texture2D>("image"); } //GUILayoutUtility.GetRect()方法會在剩下的區域返回指定寬高的矩陣 GUI.DrawTexture(GUILayoutUtility.GetRect((position.width / 2), 0, GUILayout.ExpandHeight(true)), image); #endregion GUILayout.EndVertical(); } //預設檔案儲存路徑 private const string defaultFilePath = "Assets/LitionUtility/TextAssets/"; //預設指令碼儲存路徑 private const string defaultScriptPath = "Assets/LitionUtility/ScriptAssets/"; /// <summary> /// 指令碼轉換文字 /// </summary> void SaveFile() { //1.儲存到預設路徑 if (saveFilePath.Equals("")) { //儲存到預設路徑 //如果資料夾不存在 if (!Directory.Exists(defaultFilePath)) { //則建立資料夾 Directory.CreateDirectory(defaultFilePath); } //1.寫入檔案 // 建立StreamWriter StreamWriter sw = new StreamWriter(defaultFilePath + textAssetObje.name + ".txt"); //寫入檔案 sw.Write(textAssetObje.text); //關閉流 sw.Close(); } else { //儲存到使用者指定的路徑 //判斷資料夾是否存在 if (!Directory.Exists("Assets/" + saveFilePath)) { //不存在,則建立一個新的 Directory.CreateDirectory("Assets/" + saveFilePath); } //同上 StreamWriter sw = new StreamWriter("Assets/" + saveFilePath + "/" + textAssetObje.name + ".txt"); sw.Write(textAssetObje.text); sw.Close(); } //重新整理資源 AssetDatabase.Refresh(); } void CreateScript() { //1.儲存到預設路徑 if (saveScritpPath.Equals("")) { //儲存到預設路徑 //如果資料夾不存在 if (!Directory.Exists(defaultScriptPath)) { //則建立資料夾 Directory.CreateDirectory(defaultScriptPath); } //1.寫入檔案 // 建立StreamWriter StreamWriter sw = new StreamWriter(defaultScriptPath + scriptAssetObje.name + ".cs"); //寫入檔案 sw.Write(scriptAssetObje.text); //關閉流 sw.Close(); } else { //儲存到使用者指定的路徑 //判斷資料夾是否存在 if (!Directory.Exists("Assets/" + saveScritpPath)) { //不存在,則建立一個新的 Directory.CreateDirectory("Assets/" + saveScritpPath); } //同上 StreamWriter sw = new StreamWriter("Assets/" + saveScritpPath + "/" + scriptAssetObje.name + ".txt"); sw.Write(scriptAssetObje.text); sw.Close(); } //重新整理資源 AssetDatabase.Refresh(); //2.使用者指定的路徑 } /// <summary> /// 將指令碼的內容顯示到左邊的文字區域中 /// </summary> void ShowScript() { //textAssetObje.text 將指令碼的內容轉換成字串 //scriptsContext 用於顯示左邊文字區域對應的變數 scriptsContext = textAssetObje.text; } }