编辑器拓展(入门与实践)

学习目标:入门编辑器并实现几个简单的工具

菜单编辑器

MenuItem 

[MenuItem("编辑器拓展/MenuItem")]static void MenuItem(){Debug.Log("这是编辑器拓展");}
}

案例 1:在场景中的 GameObject 设置

  • 1. @设置面板
  • 2. @直接创建 GameObject 结构
  • 3. @生成的 GameObject 结构进行赋值
  • 4. @制作成 Prefab

当场景中没有UIRoot物体时方法可用,有了之后方法不启用 

当第二个参数是true时表示是一个验证函数,用来验证这个功能是否启用

   [MenuItem("编辑器拓展/SetupUIRoot", true)]static bool ValidateUIRoot(){var gameObject = GameObject.Find("UIRoot");return !gameObject;}[MenuItem("编辑器拓展/SetupUIRoot", false)]static void SetupUIRoot(){Debug.Log("这是编辑器拓展");var uiRootObj = new GameObject("UIRoot");var canvas = new GameObject("Canvas");canvas.transform.SetParent(uiRootObj.transform);canvas.AddComponent<Canvas>().renderMode = RenderMode.ScreenSpaceOverlay;canvas.AddComponent<CanvasScaler>();canvas.AddComponent<GraphicRaycaster>();var eventSystem = new GameObject("EventSystem");eventSystem.transform.SetParent(uiRootObj.transform);eventSystem.AddComponent<EventSystem>();eventSystem.AddComponent<StandaloneInputModule>();}

第3个参数优先级,主要影响菜单出现的先后顺序,不填默认是1000. 值越小,出现在越上层的位置。当一个菜单的优先级 - 它上一个菜单的优先级 >= 11,菜单之间还能看到分界线

快捷键 :可以为MenuItem可以添加快捷键。ctrl,shift,alt 都有对应的字符,比如表示shift键的字符是#。那么快捷键shift + q,可以写成 #q。

        //注意:路径和快捷键之间有个空格[MenuItem("Learn/Log #q",false)]public static void Log(){Debug.Log(1);}

如果你想直接按一个键就触发,不想多按ctrl/shift/alt,那么可以用 ‘_’来表示。比如你想按F1就触发,那么可以写成 _F1

在Hierarchy层级窗口增加右键菜单

MenuItem还可以增加到右键菜单里面。其实用法和上面差不多,但有两个要求。

  • MenuItem(“GameObject/xxxx”,false,0)命名时,名字必须以GameObject/开头

在Assets资源窗口增加右键菜单

  • [MenuItem(“Assets/自定义菜单_Assets”)] 命名时,以Assets/开头  优先级可以不填
    [MenuItem("Assets/自定义菜单_Assets")]public static void CustomMenu_Assets(){}

创建一个窗口

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.IO;public class CreateUIRootWindow : EditorWindow
{[MenuItem("编辑器拓展/SetupUIRoot", true)]static bool ValidateUIRoot(){var gameObject = GameObject.Find("UIRoot");return !gameObject;}private string mWidth = "720";private string mHeight = "1280";private void OnGUI(){GUILayout.BeginHorizontal();GUILayout.Label("width:", GUILayout.Width(45));mWidth = GUILayout.TextField(mWidth);GUILayout.Label("x", GUILayout.Width(10));GUILayout.Label("height", GUILayout.Width(50));mHeight = GUILayout.TextField(mHeight);GUILayout.EndHorizontal();if(GUILayout.Button("Setup")){var width = float.Parse(mWidth);var height = float.Parse(mHeight);Setup(width, height);Close();}}[MenuItem("编辑器拓展/SetupUIRoot", false)]static void SetupUIRoot(){var window = GetWindow<CreateUIRootWindow>();window.Show();}static void Setup(float width,float height){//UIRootvar uiRootObj = new GameObject("UIRoot");var uirootScript = uiRootObj.AddComponent<UIRoot>();uiRootObj.layer = LayerMask.NameToLayer("UI");//Canvasvar canvas = new GameObject("Canvas");canvas.transform.SetParent(uiRootObj.transform);canvas.AddComponent<Canvas>().renderMode = RenderMode.ScreenSpaceOverlay;// CanvasScalervar canvasScaler = canvas.AddComponent<CanvasScaler>();canvasScaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;canvasScaler.referenceResolution = new Vector2(width, height);canvas.AddComponent<GraphicRaycaster>();canvas.layer = LayerMask.NameToLayer("UI");// EventSystemvar eventSystem = new GameObject("EventSystem");eventSystem.transform.SetParent(uiRootObj.transform);eventSystem.AddComponent<EventSystem>();eventSystem.AddComponent<StandaloneInputModule>();eventSystem.layer = LayerMask.NameToLayer("UI");// Bgvar bgObj = new GameObject("Bg");bgObj.AddComponent<RectTransform>();bgObj.transform.SetParent(canvas.transform);bgObj.transform.localPosition = Vector3.zero;uirootScript.Bg = bgObj.transform;// Commonvar commonObj = new GameObject("Common");commonObj.AddComponent<RectTransform>();commonObj.transform.SetParent(canvas.transform);commonObj.transform.localPosition = Vector3.zero;uirootScript.Common = commonObj.transform;// PopUIvar popUp = new GameObject("PopUp");popUp.AddComponent<RectTransform>();popUp.transform.SetParent(canvas.transform);popUp.transform.localPosition = Vector3.zero;uirootScript.PopUp = popUp.transform;// Forwardvar forwardObj = new GameObject("Forward");forwardObj.AddComponent<RectTransform>();forwardObj.transform.SetParent(canvas.transform);forwardObj.transform.localPosition = Vector3.zero;uirootScript.Forward = forwardObj.transform;var uirootScriptSerializedObj = new SerializedObject(uirootScript);uirootScriptSerializedObj.FindProperty("mRootCanvas").objectReferenceValue = canvas.GetComponent<Canvas>();uirootScriptSerializedObj.ApplyModifiedPropertiesWithoutUndo();// 制作 prefabvar savedFolder = Application.dataPath + "/Resources";if (!Directory.Exists(savedFolder)){Directory.CreateDirectory(savedFolder);}var savedFilePath = savedFolder + "/UIRoot.prefab";PrefabUtility.SaveAsPrefabAssetAndConnect(uiRootObj, savedFilePath, InteractionMode.AutomatedAction);}
}

效果: 

自动生成代码

案例2 : 根据GameObject结构生成代码工具

  • 在 Hierarchy上生成菜单
  • 生成脚本
  • 添加标记
  • 搜索并生成脚本

学习课程链接:siki学院课程,直接贴链接会被识别成广告

Unity编辑器拓展(一)-MenuItem的使用_unity menuitem-CSDN博客

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

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

相关文章

jvisualvm工具使用-jvm本地调优(一)

前言&#xff1a; 公司的项目上线后&#xff0c;吞吐量越来越小了&#xff0c;也没有特殊异常抛出&#xff0c;测试环境、预生产又一切正常&#xff0c;反复看了日志&#xff0c;不纠结了&#xff0c;直接把可能影响的因素复制到本地开始jvm调试&#xff0c;随便记录贴个安装教…

linux概述与安装虚拟机

linux 1.Linux 概述 Linux 是一个极具影响力和广泛应用的操作系统。 它起源于芬兰人林纳斯・托瓦兹在大学期间编写的开源内核。Linux 作为一个整体&#xff0c;是免费供用户使用的&#xff0c;具备多用户、多任务、支持多线程的强大特性。 Linux 内核是其核心部分&#xff…

鸿蒙 ArkUI组件二

ArkUI组件&#xff08;续&#xff09; 文本组件 在HarmonyOS中&#xff0c;Text/Span组件是文本控件中的一个关键部分。Text控件可以用来显示文本内容&#xff0c;而Span只能作为Text组件的子组件显示文本内容。 Text/Span组件的用法非常简单和直观。我们可以通过Text组件来显…

上海餐饮数据分析与可视化

数据下载入口&#xff1a;PandasPyecharts | 上海市餐饮数据分析可视化 - Heywhale.com 数据介绍 类别&#xff1a;餐饮类别的名称&#xff08;如烧烤、美食、粤菜等&#xff09;行政区&#xff1a;餐厅所在行政区的名称&#xff08;如浦东新区、闵行区等&#xff09;点评数&a…

【Spring框架精讲】进阶指南:企业级Java应用的核心框架(Spring5)

文章目录 【Spring框架精讲】进阶指南&#xff1a;企业级Java应用的核心框架(Spring5)1.Spring框架快速入门1.1七大核心模块1.1.1 Spring Core1.1.2 Spring-Beans1.1.3 Spring Context1.1.4 Spring-Expression1.1.5 Spring AOP1.1.6 JDBC和DAO模块&#xff08;Spring DAO&#…

C语言 | Leetcode C语言题解之第412题Fizz Buzz

题目&#xff1a; 题解&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*/ char ** fizzBuzz(int n, int* returnSize) {/*定义字符串数组*/char **answer (char**)malloc(sizeof(char*)*n);for(int i 1;i<n;i){/*分配单个字符串…

visual prompt tuning和visual instruction tuning

visual prompt tuning&#xff1a;作为一种微调手段&#xff0c;其目的是节省参数量&#xff0c;训练时需要优化的参数量小。 输入&#xff1a;视觉信息image token可学习的prompt token 处理任务&#xff1a;比如常见的分类任务 visual prompt tuning visual instruction tu…

Microsoft 365 Copilot: Wave 2

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Python3将Excel数据转换为文本文件

文章目录 python3安装使用Python将Excel数据转换为文本文件&#xff1a;逐步指南openpyxl库简介前提条件脚本解析代码详细解析实际应用场景使用示例 结论 python3安装 centos安装python3 Python3基础知识 使用Python将Excel数据转换为文本文件&#xff1a;逐步指南 在数据处理…

闯关leetcode——27. Remove Element

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/remove-element/description/ 内容 Given an integer array nums and an integer val, remove all occurrences of val in nums in-place. The order of the elements may be changed. Then retur…

Docker 消息队列RabbitMQ 安装延迟消息插件

介绍 RabbitMQ的官方推出了一个插件&#xff0c;原生支持延迟消息功能。该插件的原理是设计了一种支持延迟消息功能的交换机。当消息投递到交换机后可以暂存一定时间&#xff0c;到期后再投递到队列。 查看版本号 docker exec rabbit名字 rabbitmqctl version根据版本下载 插…

Java | Leetcode Java题解之第412题Fizz Buzz

题目&#xff1a; 题解&#xff1a; class Solution {public List<String> fizzBuzz(int n) {List<String> answer new ArrayList<String>();for (int i 1; i < n; i) {StringBuffer sb new StringBuffer();if (i % 3 0) {sb.append("Fizz"…

启动windows更新/停止windows更新,在配置更新中关闭自动更新的方法

在Windows操作系统中&#xff0c;启动或停止Windows更新&#xff0c;以及调整“配置更新”的关闭方法&#xff0c;涉及多种途径&#xff0c;这里将详细阐述几种常用的专业方法。 启动Windows更新 1.通过Windows服务管理器&#xff1a; -打开“运行”对话框&#xff08;…

《小迪安全》学习笔记04

这一块主要讲信息收集——渗透测试第一步&#xff01;&#xff01; 1.首先看有无网站&#xff1a; 存在CDN就用上次说的方法找到真实IP&#xff0c;然后转上↑ 收集四类信息&#xff1a;程序源码&#xff08;CMS&#xff09;等等 2.看有无APP&#xff0c;如涉及到WEB&#xf…

opencv学习:图像掩码处理和直方图分析及完整代码

图像掩码是一种二值图像&#xff0c;用于控制图像处理操作的应用区域。通过将掩码与原图像进行按位与操作&#xff0c;可以提取或屏蔽图像的特定部分。直方图是图像处理中的一个重要工具&#xff0c;用于分析图像的灰度分布。 实验步骤 使用OpenCV读取图像文件“phone.png”为…

JS基础之【对象详解 -- 对象的属性与方法、遍历对象与内置对象】

&#x1f680; 个人简介&#xff1a;某大型国企高级前端开发工程师&#xff0c;7年研发经验&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码…

后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0916)

接口文档: https://apifox.com/apidoc/shared-26c67aee-0233-4d23-aab7-08448fdf95ff/api-93850835 接口根路径&#xff1a; http://big-event-vue-api-t.itheima.net 本项目的技术栈 本项目技术栈基于 ES6、vue3、pinia、vue-router 、vite 、axios 和 element-plus http:/…

Linux 基本使用和 web 程序部署 ( 8000 字 Linux 入门 )

一&#xff1a;Linux 背景知识 1.1. Linux 是什么 Linux 是一个操作系统. 和 Windows 是 “并列” 的关系&#xff0c;经过这么多年的发展, Linux 已经成为世界第一大操作系统&#xff0c;安卓系统本质上就是 Linux. 1.2 Linux 发行版 Linux 严格意义来说只是一个 “操作系…

Parallels Desktop 20 搭载内置 AI 包正式发布

近期 Parallels 官方发布 Parallels Desktop 20 For Mac&#xff0c;这是一款流行的Mac虚拟化软件。 该版本引入了 Parallels AI 工具包&#xff0c;这将主要惠及需要新工具在 Mac 上使用人工智能的开发人员。 配合即将发布的 macOs sequoia 和 Windows 11 24H2&#xff0c;P…

Android源码集成 Google Play

1、 The Open GApps Project 下载 对应系统和平台的gms压缩包&#xff0c;压缩包文件如下&#xff1a; Core和Optional目录下为谷歌服务核心文件和应用&#xff0c;需要预置到源码中。解压Core 和 Optional 目录所有文件&#xff0c;得到如下文件夹&#xff1a; 其中 etc 和 li…