1. 程式人生 > >Unity Editor 基礎篇(三):自定義視窗案例二

Unity Editor 基礎篇(三):自定義視窗案例二

本文為本人學習上鍊接的筆記微有改動,請點選以上鍊接檢視原文,尊重樓主智慧財產權。

---------------------------------------------------------------------------------------------------------

本文難點:

  1. GUILayout.ExpandHeight(true) 使用液態高度:

  2. 相當於動態高度,用掉所有剩下的空間

  1. GUILayoutUtility.GetRect()

  2. 方法會在剩下的區域返回指定寬高的矩陣

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;
    }
}