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

news2024/9/20 5:29:38

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,并在相应的按钮点击时更新状态。

实现源码

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2064341.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苍穹外卖(瑞吉外卖)--环境搭建

作为软件开发工程师&#xff0c;在编码的过程中就不可避免地会接触多种软件环境&#xff0c;我们主要来分析在工作中经常遇到的三套环境&#xff0c; 分别是: 开发环境、测试环境、生产环境 开发环境 在开发阶段使用的环境&#xff0c;就是开发环境&#xff0c;一般外部用户无…

解决ubuntu22.04无法识别CH340/CH341和vscode espidf插件无法选择串口设备节点问题

文章目录 解决ubuntu22.04无法识别CH340/CH341和vscode espidf插件无法选择串口设备节点问题不识别CH340/CH341报错解决办法升级驱动编译安装 卸载brltty程序 vscode espidf插件无法选择串口设备节点问题解决办法编译安装 解决ubuntu22.04无法识别CH340/CH341和vscode espidf插…

路径规划——Jump Point Search算法

路径规划——Jump Point Search算法 算法原理 跳点搜索算法(Jump Point Search)&#xff0c;简称JPS&#xff0c;是由澳大利亚两位教授于2011年提出的基于Grid格子的寻路算法。JPS算法在保留A Star算法的框架的同时&#xff0c;进一步优化了A Star算法寻找后继节点的操作。 A…

异常在代码中的两个作用

一.异常的作用: 作用一:异常是用来查询bug的关键参考信息。 作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况。 二.举例: 例1: 一个JavaBean类: package com.itheima.a01MyExpection;public class Student { private String name; private int…

Mamba-YOLO : 基于SSM的YOLO目标检测算法(附代码)

代码地址&#xff1a;GitHub - HZAI-ZJNU/Mamba-YOLO: the official pytorch implementation of “Mamba-YOLO&#xff1a;SSMs-based for Object Detection” 论文地址&#xff1a;https://arxiv.org/pdf/2406.05835 在深度学习技术的快速进步推动下&#xff0c;YOLO系列为实时…

前端VUE低代码平台有哪些?盘点几款,你且看看有没有用得上的

前端低代码平台有哪些&#xff1f;盘点几款&#xff0c;你且看看有没有用得上的。 1、GOVIEW GoView 是一个使用 Vue3 搭建的低代码数据可视化开发平台&#xff0c;将图表或页面元素封装为基础组件&#xff0c;无需编写代码即可完成业务需求。它的技术栈为&#xff1a;Vue3 T…

vant 组件中事件选择器的一些小用法

获取当前所在的月份的月初和当天的日期 computed: {// 默然展示月初的第一天formattedFirstDayOfMonth() {const now new Date();const firstDayOfMonth new Date(now.getFullYear(), now.getMonth(), 1);const year firstDayOfMonth.getFullYear();const month (firstDay…

聚星文社原版本绘唐科技AI推文工具

聚星文社原版本绘唐科技AI推文工具是一种可以帮助用户生成推文内容的人工智能工具。它通过分析大量的文本和数据&#xff0c;学习了推文的写作风格和语言特点&#xff0c;并能够根据用户提供的关键词和要求&#xff0c;生成符合要求的推文内容。 这个工具可以快速生成高质量的推…

C语言一笔画迷宫

目录 开头程序程序的流程图程序游玩的效果结尾 开头 大家好&#xff0c;我叫这是我58。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <Windows.h> void printmaze(const char strmaze[11][11]) {int ia 0;…

金蝶云星空元数据冲突SVN:replaced,tree conflict树冲突解决过程

文章目录 SVN:replaced,tree conflict树冲突解决过程问题解决方案 SVN:replaced,tree conflict树冲突解决过程 问题 解决方案

五参数防爆气象站

五参数防爆气象站是一种用于监测环境气象条件和预测潜在爆炸危险的装置。其功能包括以下五个方面&#xff1a; 温度监测&#xff1a;防爆气象站能够实时监测环境的温度变化&#xff0c;并且能够提供温度的历史记录和趋势预测。这对于防止设备过热和爆炸具有重要意义。 湿度监测…

场外个股期权优劣有哪些?场外个股期权有风险吗?

今天带你了解场外个股期权优劣有哪些&#xff1f;场外个股期权有风险吗&#xff1f;个股场外期权&#xff0c;作为非交易所交易的股票期权合约&#xff0c;为投资者提供了独特的投资渠道。 场外个股期权&#xff08;OTC个股期权&#xff09;的优势&#xff1a; 1.灵活性&…

网络间通信

1、udp通信 特点&#xff1a;&#xff08;1&#xff09;无连接 &#xff08;2&#xff09;不可靠 2、udp编程&#xff08;c/s模型&#xff09; ssize_t recvfrom(int sockfd, //socket的fd void *buf, //保存数据的一块空间的地址 …

鸿蒙弹窗实现乱象?带你玩转正确的实现姿势

最近看到很多童鞋吐槽鸿蒙自定义弹窗的实现,也有不少童鞋提供了各式各样的低耦,轻巧方向的优化方案,但多数参差不齐,甚至有基于老API(白玩,以后还得废弃掉…)给的方案,为避免如此“乱象”遂提出正确的实现姿势。 姿势一 如果您没有特别的要求,系统AlertDialog(API 6+)…

新加坡门店客流计数器,AI智能识别算法加持,精准完成统计分析

在数字化转型的大潮下&#xff0c;零售业正经历着前所未有的变革。为了更好地理解顾客行为并优化店铺运营&#xff0c;新加坡的零售门店开始采用搭载AI智能识别算法的客流计数器系统。这套系统不仅能够精准统计顾客流量&#xff0c;还能提供深入的分析报告&#xff0c;帮助商家…

tcp 和udp通信

一.recvfrom recvfrom函数是一个系统调用&#xff0c;用于从套接字接收数据。该函数通常与无连接的数据报服务&#xff08;如 UDP&#xff09;一起使用&#xff0c;但也可以与其他类型的套接字使用。与简单的 recv() 函数不同&#xff0c;recvfrom() 可以返回数据来源的地址信息…

“肯将玉钳作双戟,一舞天下定乾坤。”记唐铎《墨龙图》之中的笔墨画意

唐铎&#xff0c;1957 年生于北京&#xff0c;国家一级美术师&#xff0c;曾先后师从于刘文西、黄申发老师&#xff0c;原名唐京鸣&#xff0c;京城人士&#xff0c;取其名&#xff0c;不鸣则已&#xff0c;一鸣惊人之意&#xff0c;学画三十余年&#xff0c;专注于齐派虾蟹&am…

算法工程师第四十四天(99. 岛屿数量 深搜 99. 岛屿数量 广搜 100.岛屿的最大面积 )

参考文献 代码随想录 一、岛屿数量 题目描述 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成&#xff0c;并且四周都是水域。你可以假设矩阵外均被水包…

Android 安卓Compose软键盘和Activity页面的协调处理问题

文章目录 问题展示1、输入框展示不完整&#xff0c;且布局被顶出屏幕外2、输入框被软键盘完全覆盖 解决方案最终演示 问题展示 1、输入框展示不完整&#xff0c;且布局被顶出屏幕外 这是默认处理的样式 2、输入框被软键盘完全覆盖 当在AndroidManifest.xml Activity标签上加…

天龙八部万象归一第8版单机安装教程+GM工具+虚拟机一键端

今天给大家带来一款单机游戏的架设&#xff1a;天龙八部万象归一第8版。 另外&#xff1a;本人承接各种游戏架设&#xff08;单机联网&#xff09; 本人为了学习和研究软件内含的设计思想和原理&#xff0c;带了架设教程仅供娱乐。 教程是本人亲自搭建成功的&#xff0c;绝对…