Unity自定义编辑器界面(Inspector界面)
作者:王王王渣渣 发布时间:2023-01-09 08:40:46
标签:Unity,编辑器
在开发的过程中,往往会需要在组件中添加一些按钮,用于执行一些自定义的操作。
例如你有一个组件A,里面有一个List<Collider>,你想在这个List中存放当前Scene中所有的碰撞体数据。那么你会在组件A中写一个方法Find去遍历获取,一种情况你可以运行Unity的时候在Start方法中去执行Find方法,如果你想不运行Unity的情况下就获取到,那么可以使用[ExecuteInEditMode]标签,然后依旧在Start方法中执行Find方法。再或者就是这篇要介绍的自定义编辑器界面来处理。
首先我们简单的写个组件如下:
using UnityEngine;
public class Test : MonoBehaviour
{
public float speed;
public int length;
public void Reset()
{
speed = 0;
length = 0;
}
}
我们在一个GameObject上添加该组件后,Inspector界面的显示为
然后我们可以在Editor目录下建一个新的cs脚本,用于自定义该组件Inspector界面的显示,代码如下:
using UnityEditor;
using UnityEngine;
//添加这个标签,可以选择多个拥有Test组件的GameObject进行同时修改,否则会提示Multi-object editing not supported
[CanEditMultipleObjects]
//关联对应的MonoBehaviour类
[CustomEditor(typeof(Test))]
public class TestInspector : Editor
{
public override void OnInspectorGUI()
{
Test test = target as Test;
//添加了这句,当你选中一个带有Test组件的GameObject时,修改了属性,点击工具栏Edit,会显示Undo RecordTest和Redo RecordTest用于撤销和重做
//同时如果是在prefab中,加上这句,在修改了属性之后prefab会知道属性的变化,你可以apply或revert,否则prefab无法检测出。(5.3版本之前使用EditorUtility.SetDirty(test);)
Undo.RecordObject(test, "RecordTest");
//显示默认视图(即Test的speed和length)
base.OnInspectorGUI();
//在默认视图下方添加一行
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("Button 1"))
{
//点击按钮触发
Debug.Log("name:" + test.name);
test.speed = 100;
//通知Prefab属性变化,5.3版本前使用下面这句,之后使用Undo.RecordObject
//EditorUtility.SetDirty(test);
}
if (GUILayout.Button("Button 2"))
{
//targets 表示选中的多个组件
foreach (Object obj in targets)
{
Debug.Log("name:" + obj.name);
Test item = obj as Test;
item.Reset();
}
}
EditorGUILayout.EndHorizontal();
if (GUI.changed)
{
//如果属性改变时调用
}
}
}
这样显示界面就会变为
这样我们就可以在不运行unity的情况下执行一些组件方法,方便使用。
一些需要注意的如[CanEditMultipleObjects],Undo.RecordObject,EditorUtility.SetDirty在代码中注释了,大家可以自己尝试看看对应的作用。
来源:https://blog.csdn.net/wangjiangrong/article/details/100982719


猜你喜欢
- 部分网友会发现Activity在切换到后台或布局从横屏LANDSCAPE切换到PORTRAIT,会重新切换Activity会触发一次onCr
- 什么是分布式锁?它能干什么?相信大家对于Java提供的synchronized关键字以及Lock锁都不陌生,在实际的项目中大家都使用过。如下
- 一、Maven简介1. 什么是MavenMaven:是Apache提供的免费开源的项目管理工具。它提供了一个项目对象模型(pom.xml)、
- 由于今天用Security进行权限管理的时候出现了一些Bug,特此发这篇博客来补习一下对SpringSecurity的理解前言引入当今市面上
- 开发中经常遇到从集合类List、Map中取出数据转换为String的问题,这里如果处理不好,经常会遇到空指针异常java.lang.Null
- jedis是redis的java客户端,spring将redis连接池作为一个bean配置。redis连接池分为两种,一种是“redis.c
- 一、Application是什么?Application类在每一次开发当中是我们都会遇到的,每一个APP都会有一个Application实例
- 继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易。同时也有利于重用代码和节
- springboot集成mybatis plus和dynamic-datasource注意事项环境spring-boot-starter-p
- 下面是我做C#第一个项目的过程:1.首先打开VS,这里我用的是VS2022预览版,鼠标双击打开VS;图一2.打开VS后会出现下面的页面,鼠标
- Linux Hadoop 2.7.3 安装搭建Hadoop实现了一个分布式文件系统(Hadoop Distributed File Syst
- 通过自定义注解的方式(如:@SysLog(obj = "操作对象", text = "操作内容"),
- 正文 #方法一:使用string.Contains方法string.Contains是大小写敏感的,如果要用该方法来判断一个str
- 下面以launch方法为例进行分析。一.协程的创建launch方法的代码如下:// CoroutineScope的扩展方法public fu
- 本文为大家分享了CentOS 7下安装JDK8的详细步骤,供大家参考,具体内容如下一、下载JDK 至oracle官网下载,如图所示二、安装J
- 前言上篇博文把表连接查询和三种对应关系的写法记录总结了,本篇要把 mybatis 中的动态sql 的使用以及缓存知识记录下来。动态SQL在解
- @RequestBody和@ResponseBody及Stringify()的作用首先,在项目的前后交互中json数据格式比较常用,普遍认为
- C# windows语音识别与朗读示例,供大家参考,具体内容如下本示例通过windows语音识别功能进行语音识别和文本朗读。打开window
- 最近做一个项目,因为涉及到注册,因此需要发送短信,一般发送短信都有一个倒计时的小按钮,因此,就做了一个,在此做个记录。一、发送消息没有调用公
- 前言对于广大java开发者而已,对于J2EE规范中的Session应该并不陌生,我们可以使用Session管理用户的会话信息,最常见的就是拿