UnityEditor<三>自定义窗口 案例2

本文参自: 
克森https://mp.weixin.qq.com/s/4TEfD3W6RJZZbtBnC4pUQQ

本文为本人学习上链接的笔记微有改动,请点击以上链接查看原文,尊重楼主知识产权。

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

本文难点:

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


-------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- --
文末:再次声明请尊重楼主版权: 
克森 https://mp.weixin.qq.com/s/4TEfD3W6RJZZbtBnC4pUQQ
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值