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

实现源码

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.rhkb.cn/news/405745.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用手机写一本电子书

第1步、进入Andi.cn网站 第2步、点击登录&#xff0c;注册用户 第3步、点击去创作&#xff0c;进入创作页面 第4步、点击右下角的小笔&#xff0c;写一篇文章 第5步、下翻&#xff0c;点击提交按钮 第6步、再写一篇文章 第7步、点击栏目设计 第8步、进入栏目设计&#xff0c;点…

FFmpeg的入门实践系列三(基础知识)

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力 文章目录 前期博客一、音视频常用术语二、FFmpeg库的结构介绍三、FFmpeg的常用函数初始化封装格式编解码器相关 四、FFmpeg常用的数…

安装搭建MongoDB及配置副本集

目录 一、什么是MongoDB的副本集 简介 &#xff08;1&#xff09;冗余和数据可用性 &#xff08;2&#xff09;MongoDB中的复制 &#xff08;3&#xff09;主从复制和副本集区别 二、副本集的架构 三、副本集的成员 四、部署副本集 1、节点划分 2、安装MongoDB 2.1、…

Jetpack 各种框架简介

Jetpack是Google推出的一套为Android开发提供极大便利的组件、工具和指导集&#xff0c;旨在帮助开发者快速构建高质量的应用&#xff0c;并遵循最佳实践。 Jetpack不仅是一个提高开发效率的工具集&#xff0c;还是Android开发的未来方向。它通过整合各种组件和工具&#xff0…

VAuditDemo审计之二次注入漏洞

目录 VAuditDemo二次注入漏洞 搜索危险函数&#xff0c;用户可控点 regCheck.php messageSub.php message.php 漏洞调用链 漏洞错误利用过程 注册用户 xxxx, 发表payload留言 漏洞正确利用过程 注册用户 wwww\ 退出用户 wwww\\ 使用 wwww\ 登录 发表留言 替换dat…

【全网最真实测评】随身WiFi值得入手吗?自费入手华为、中兴、格行、上赞4款随身WiFi,内含国产4款热门随身WiFi推荐!(最实用、最高性价比!)

随身WiFi的风越吹越大&#xff0c;市场乱象也更变本加厉。作为一名资深随身WiFi使用者&#xff0c;接触过太多的随身WiFi产品&#xff0c;越是了解这个行业黑幕&#xff0c;就越对无良商家夸大宣传、虚标限速&#xff0c;甚至售卖二手产品的行为深恶痛绝&#xff01; 本篇测评涉…

学习嵌入式第二十九天

ipc进程间通信方式 PC&#xff0c;即进程间通信&#xff08;Inter-Process Communication&#xff09;&#xff0c;是操作系统中不同进程之间交换数据的一种机制。以下是一些常见的IPC方式&#xff1a; 管道&#xff1a;用于父子进程或兄弟进程之间的通信。消息队列&#xff…

nestjs nest-cli.json中的assets不生效

官方文档 Documentation | NestJS - A progressive Node.js framework // nest-cli.json{"collection": "nestjs/schematics","sourceRoot": "src","compilerOptions": {"assets": ["microservices/mail/te…

【网络编程】select实现服务器与客户端进行通信

1、运行1个服务器和2个客户端 实现效果: 1、服务器和2个客户端互相聊天&#xff0c;服务器和客户端都需要使用select模型去实现 2、服务器要监视2个客户端是否连接&#xff0c;2个客户端是否发来消息&#xff0c;以及服务器自己的标准输入流 3、客户端…

定格精彩瞬间!详解六自由度技术原理及应用

在体育赛事中&#xff0c;观赏各项目的精彩瞬间&#xff0c;欣赏运动员的卓越表现是观众们最为关注的焦点。以体操跳马为例&#xff0c;运动员们全力助跑&#xff0c;然后奋力起跳、腾空&#xff0c;接着精准的推手和转体动作&#xff0c;最后稳稳落地&#xff0c;整个动作行云…

检测到目标URL存在http host头攻击漏洞

漏洞描述 修复措施 方法一&#xff1a; nginx 的 default_server 指令可以定义默认的 server 去处理一些没有匹配到 server_name 的请求&#xff0c;如果没有显式定义&#xff0c;则会选取第一个定义的 server 作为 default_server。 server { …

avue-crud 自定义搜索项 插槽

加上 -search 就可以自定义查询项了

【MongoDB】Java连接MongoDB

连接URI 连接 URI提供驱动程序用于连接到 MongoDB 部署的指令集。该指令集指示驱动程序应如何连接到 MongoDB&#xff0c;以及在连接时应如何运行。下图解释了示例连接 URI 的各个部分&#xff1a; 连接的URI 主要分为 以下四个部分 第一部分 连接协议 示例中使用的 连接到具有…

ant design pro 中用户的表单如何控制多个角色

ant design pro 如何去保存颜色ant design pro v6 如何做好角色管理ant design 的 tree 如何作为角色中的权限选择之一ant design 的 tree 如何作为角色中的权限选择之二ant design pro access.ts 是如何控制多角色的权限的 看上面的图片 当创建或编辑一个用户时&#xff0c;…

Mac文件需要分卷压缩怎么办 Mac上怎么解压分卷压缩的文件

在处理大型文件的传输和存储的时候&#xff0c;Mac用户常面临文件大小超过限制的问题。为了有效管理这些大文件&#xff0c;分卷压缩成为一种必不可少的解决方案。Mac文件需要分卷压缩怎么办&#xff1f;Mac上怎么解压分卷压缩的文件&#xff1f;本文将向你介绍如何使用BetterZ…

第R2周:LSTM-火灾温度预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、什么是LSTM 1.LSTM的本质 长短时记忆网络&#xff08;Long Short-Term Memory, LSTM&#xff09;的本质是一种特殊的循环神经网络&#xff08;Recurrent…

使用Go语言将PDF文件转换为Base64编码

使用 Go 语言将 Base64 编码转换为 PDF 文件-CSDN博客本文介绍了如何使用 Go 语言将 Base64 编码转换为 PDF 文件&#xff0c;并保存到指定路径。https://blog.csdn.net/qq_45519030/article/details/141225772 在现代编程中&#xff0c;数据转换和编码是常见的需求。本文将介绍…

SX_gitlab可视化操作c语言知识_17

gitlab可视化操作技巧: Merge into current branch直接将远程wjc_GNSS分支的数据拉下来同步到本机当前的分支代码&#xff0c;执行的是合并操作&#xff0c;即多的模块会添加到本地分支&#xff0c;有冲突的地方不行得rebase覆盖才行 修改完代码先暂存更改再在暂存区写入备注&a…

网络通信要素

网络介绍 定义&#xff1a;将具有独立功能的多台计算机通过通信线路和通信设备连接起来&#xff0c;在网络管理软件及网络通信协议下&#xff0c;实现资源共享和信息传递的虚拟平台。 学习网络的目的&#xff1a; 能够编写基于网络通信的软件或程序&#xff0c;通常来说就是网…

力扣面试经典算法150题:删除有序数组中的重复项 II

删除有序数组中的重复项 II 今天的题目是力扣面试经典150题中的数组的中等难度题: 删除有序数组中的重复项 II 题目链接&#xff1a;https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150 题…