Unity编辑器扩展:创建一个欢迎窗口,在启动Editor的时候显示自定义窗口。

Unity编辑器扩展:创建一个欢迎窗口,在启动Editor的时候显示自定义窗口。

在Unity开发过程中,经常会遇到需要向其他人展示重要信息的情况,比如项目文档、脚本说明、插件介绍等。这个窗口不仅能够展示必要的文档信息,还提供了便捷的交互功能,如打印文本以及欢迎控制窗口的显示与否。

实现效果展示

可以手动打开窗口

内容切换,点击顶部的按钮即可切换内容。

实现思路

UI编辑器,再启动编辑器的时候显示窗口。

点击按钮会读取指定路径下的文件并展示。

的的

教程

创建文件夹
\Assets\Editor\WelcomeWindow,创建脚本:ReadmeEditor.cs,将下面的代码粘贴进去。

一、设计目标:

  1. 创建一个简洁直观的界面,用于展示项目文档、脚本说明、插件介绍等内容。
  2. 提供用户友好的交互方式,允许用户选择显示不同的文本内容。
  3. (目前不允许用户复制当前显示的文本到剪贴板),并在控制台中输出。
  4. 用户可以选择是否在下次启动编辑器时自动显示该窗口。

二、功能实现:

  1. 文本加载: 使用File.ReadAllText方法从指定路径加载文本文件,并将其内容存储在字符串变量中。这样可以灵活地更新文档而无需重新编译代码。
  2. 用户界面: 利用Unity编辑器的GUI系统,创建了一个垂直布局,其中包含按钮和文本显示区域。按钮用于切换显示不同类型的文档内容。
  3. 复制和控制台输出: 当用户点击"Copy"按钮时,使用Debug.Log将当前文本内容输出到Unity控制台,并使用GUIUtility.systemCopyBuffer将文本复制到剪贴板。
  4. 显示控制: 我们使用Unity的SessionState来控制窗口是否在下次启动编辑器时显示。用户可以选择Don't show againShow again,并在相应的按钮点击时更新状态。

实现源码

csharp 复制代码
using UnityEngine;
using UnityEditor;
using System.IO;

namespace wuhuEditorExpand
{
[InitializeOnLoad]
public class ReadmeEditor : EditorWindow
{
    static string s_ShowedReadmeSessionStateName = "ReadmeEditor.showedReadme";

    static ReadmeEditor()
    {
        EditorApplication.delayCall += SelectReadmeAutomatically;
    }

    static void SelectReadmeAutomatically()
    {
        // 检查是否已经显示过该窗口
        if (!SessionState.GetBool(s_ShowedReadmeSessionStateName, false))
        {
            ShowHelloWindow();
            SessionState.SetBool(s_ShowedReadmeSessionStateName, true);
        }
    }

    static void ShowHelloWindow()
    {
        HelloWindow.ShowWindow();
    }
}

public class HelloWindow : EditorWindow
{
    private static bool s_DontShowAgain = false;
    private string noticeFileContent = "";
    private string pluginFileContent = "";
    private string scriptFileContent = "";
    private string thanksFileContent = "";
    private static string windowsFormName = "Welcome Window";

    private string noticeFilePath = "Assets/Editor/ReadmeWindow/notice.txt";
    private string pluginFilePath = "Assets/Editor/ReadmeWindow/plugin.txt";
    private string scriptFilePath = "Assets/Editor/ReadmeWindow/script.txt";
    private string thanksFilePath = "Assets/Editor/ReadmeWindow/thanks.txt";

    private string currentContent = "";

    [MenuItem("Window/Welcome Window")]
    public static void ShowWindow()
    {
        GetWindow<HelloWindow>(windowsFormName);
    }

    void OnGUI()
    {
        if (noticeFileContent == "" || pluginFileContent == "" || scriptFileContent == "" || thanksFileContent == "")
        {
            noticeFileContent = LoadFileContent(noticeFilePath);
            pluginFileContent = LoadFileContent(pluginFilePath);
            scriptFileContent = LoadFileContent(scriptFilePath);
            thanksFileContent = LoadFileContent(thanksFilePath);
            currentContent = "1. Readme是用前须知\n" +
                "2. Scripts 脚本介绍\n"+
                "3. Plugins引用的插件介绍\n"+
                "4. 致谢\n"+
                "5. Don't show again 下次启动Editor的时候不显示\n"+
                "6. Show again 下载启动Editor的时候显示\n"+
                "7.Copy 拷贝当前显示的内容,并输出于控制台\n"+
                "-----end-----";
          
        }

        EditorGUILayout.BeginVertical();

        // 第一排按钮
        EditorGUILayout.BeginHorizontal();
        var buttonStyle = new GUIStyle(GUI.skin.button);
        buttonStyle.fontSize = 14; // 设置字体大小

        if (GUILayout.Button("Readme", buttonStyle, GUILayout.Height(30)))
        {
            currentContent = noticeFileContent;
        }
        if (GUILayout.Button("Scripts", buttonStyle, GUILayout.Height(30)))
        {
            currentContent = scriptFileContent;
        }
        if (GUILayout.Button("Plugins", buttonStyle, GUILayout.Height(30)))
        {
            currentContent = pluginFileContent;
        }

        var buttonStylethx = new GUIStyle(GUI.skin.button);
        buttonStylethx.normal.textColor = Color.blue;
        buttonStylethx.fontSize = 16;
        if (GUILayout.Button("致谢", buttonStylethx, GUILayout.Height(30)))
        {
            currentContent = thanksFileContent;
        }

        EditorGUILayout.EndHorizontal();

        EditorGUILayout.Space();

        // 底部文本区域
        EditorGUILayout.LabelField(currentContent, EditorStyles.textArea, GUILayout.Height(position.height - 90));
        EditorGUILayout.EndVertical();


        // 最下方显示 "Don't show again" 按钮
        EditorGUILayout.BeginHorizontal();
        var style = new GUIStyle(GUI.skin.button);
        style.normal.textColor = Color.white;
        if (GUILayout.Button("Don't show again", style, GUILayout.Width(position.width * 0.7f), GUILayout.Height(30)))
        {
            s_DontShowAgain = true;
            Close();
        }
        if (GUILayout.Button("Show again", style, GUILayout.Width(position.width * 0.2f), GUILayout.Height(30)))
        {
            s_DontShowAgain = true;
            Close();
        }

        if (GUILayout.Button("Copy", style, GUILayout.Width(position.width * 0.1f), GUILayout.Height(30)))
        {
            Debug.Log("拷贝到剪贴板");
            Debug.Log(currentContent);

        }

        EditorGUILayout.EndHorizontal();

    }

    private string LoadFileContent(string _filePath)
    {
        if (File.Exists(_filePath))
        {
            try
            {
                return File.ReadAllText(_filePath);
            }
            catch (System.Exception e)
            {
                Debug.LogError("文件读取失败Error reading file: " + _filePath);
                return "没有读取到文件" + _filePath;
            }
        }
        else
        {
            Debug.LogError("文件没有找到File not found: " + _filePath);
            return "文件没有找到" + _filePath;
        }
    }
}
}
相关推荐
虾球xz44 分钟前
游戏引擎学习第59天
学习·游戏引擎
zh路西法1 小时前
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(二):从FSM开始的2D游戏角色操控底层源码编写
c++·游戏·unity·设计模式·状态模式
橘子遇见BUG5 小时前
Unity Shader学习日记 part 3 线性代数--矩阵变换
学习·线性代数·unity·矩阵·图形渲染
莲动渔舟7 小时前
妙用编辑器:如何使用编辑器的筛选功能更高效的阅读日志
编辑器
神洛华7 小时前
Y3编辑器教程8:资源管理器与存档、防作弊设置
编辑器·游戏引擎·游戏程序
Moweiii7 小时前
SDL3 GPU编程探索
c++·游戏引擎·图形渲染·sdl·vulkan
Artistation Game7 小时前
一、c#基础
游戏·unity·c#·游戏引擎
成都渲染101云渲染66668 小时前
云渲染,Enscape、D5、Lumion渲染提速教程
运维·服务器·unity·电脑·图形渲染·blender·houdini
scoone8 小时前
VSCode 性能优化指南:提高编码效率,减少资源占用
ide·vscode·编辑器
html组态10 小时前
web组态可视化编辑器
前端·物联网·编辑器·web组态·组态·组态软件