Unity中自定义 Inspector 面板

假如有以下代码:

 1 using UnityEngine;
 2 using UnityEditor;
 3
 4 public class LugsTest : MonoBehaviour
 5 {
 6     [SerializeField]
 7     bool isEnabled;
 8
 9     [SerializeField]
10     string name;
11 }

将这个脚本直接挂到 GameObject 上的效果是:

这个是显而易见的答案。如果现在有一个需求,只在 Inspector 中显示代码中的部分变量,该如何做呢?这个就是这里要实现的内容。

额外多出两个脚本(其实多出一个就可以,只是这里想总结一套架构清晰的逻辑):

CustomInspector、LugsTestEditor

以下分别是两个脚本的内容:

 1 using UnityEngine;
 2 using UnityEditor;
 3
 4 public class CustomInspector : Editor
 5 {
 6     protected void DrawPropertyField(string filedName)
 7     {
 8         DrawPropertyField(filedName, true, true);
 9     }
10
11     protected void DrawPropertyField(string fieldName, bool isValid, bool isValidWarning)
12     {
13         WrapWithValidationColor(() =>
14         {
15             SerializedProperty property = serializedObject.FindProperty(fieldName);
16             EditorGUILayout.PropertyField(property);
17         }, isValid, isValidWarning);
18     }
19
20     protected void WrapWithValidationColor(System.Action method, bool isValid, bool isValidWarning)
21     {
22         Color colorBackup = GUI.color;
23         if (isValid == false)
24         {
25             GUI.color = Color.red;
26         }
27         else if (isValidWarning == false)
28         {
29             GUI.color = Color.yellow;
30         }
31         method.Invoke();
32         GUI.color = colorBackup;
33     }
34 }

对以上脚本中第 31 行内容不理解的可以阅读: https://www.cnblogs.com/luguoshuai/p/10940879.html

 1 using UnityEditor;
 2 using UnityEngine;
 3
 4
 5 [CustomEditor(typeof(LugsTest))]
 6 public class LugsTestEditor : CustomInspector
 7 {
 8     public override void OnInspectorGUI()
 9     {
10         DrawPropertyField("isEnabled");
11
12         if (GUI.changed)
13         {
14             serializedObject.ApplyModifiedProperties();
15         }
16     }
17 }

在工程中加入以上脚本后的结果是怎么样的呢?

这个时候隐藏了 name 字段,如果同时隐藏定义的两个字段,该如何?只需修改 LugsTestEditor 中的内容即可。

 1 using UnityEditor;
 2 using UnityEngine;
 3
 4
 5 [CustomEditor(typeof(LugsTest))]
 6 public class LugsTestEditor : CustomInspector
 7 {
 8     public override void OnInspectorGUI()
 9     {
10         //DrawPropertyField("isEnabled");
11         //DrawPropertyField("name");
12
13         if (GUI.changed)
14         {
15             serializedObject.ApplyModifiedProperties();
16         }
17     }
18 }

原文地址:https://www.cnblogs.com/luguoshuai/p/10941160.html

时间: 2024-08-08 04:34:34

Unity中自定义 Inspector 面板的相关文章

Unity Editor自定义检视面板

学习了下自定义检视面板的使用,效果图如下: 先是定义一个脚本文件,我们来修饰它的检视面板: [HelpURL("http://www.baidu.com")] public class Atr : MonoBehaviour { public int id; public string Name; [Multiline(5)] public string BackStory; public float health; public float damage; public float

unity中自定义鼠标样式

在用unity制作游戏过程中,运行游戏时,有没有感觉到原来的鼠标看着是不是特别不爽了?反正我是看腻了,哈哈! 下面来看看自定义鼠标样式的自作:首先你需要在unity中将图片的样式改为Cursor类型的: 然后我们来看看代码: public Texture2D cursorTexture;    //在外面为该变量赋值; void OnGUI() {      Vector2 mouse_Pos=Input.MousePosition;      GUI.DrawTexture(new Rect(

Unity中自定义应用程序打开Assets目录下指定类型的文件

在Unity使用VS2017打开unityShader文件时总提示错误: 我也一直没找啥原因,我直接把之前工具拿过来了,shader文件直接使用vsCode打开,其他类型的文件也可这样处理,如:pdf,txt等文件均可 具体代码如下: 1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEditor; 4 using UnityEngine; 5 6 public class SetAssets

自定义Inspector检视面板

Unity中的Inspector面板可以显示的属性包括以下两类:(1)C#以及Unity提供的基础类型:(2)自定义类型,并使用[System.Serializable]关键字序列化,比如: [System.Serializable] public class TestClass { public Vector3 vec = Vector3.zero; public Color clr = Color.green; } 也可以使用[System.NonSerialized]标记不需要显示的属性,

unity中可以使一个私有的变量在Inspector面板中显示出来 和 SerializeField的使用

[HideInInspector] 可以使一个公有的变量在Inspector面板中隐藏起来 [SerializeField] 可以使一个私有的变量在Inspector面板中显示出来

讲解如何在Unity的Inspector面板实现类似摄像机层次遮罩的多选效果

首先,我们现在的需求是这样的,我定义了一个脚本,里面有一个枚举,还有一个Public的枚举类型变量,现在我们就可以在Unity的工程里的Inspector面板中通过手动的选择来控制这个枚举变量到底选择什么了,就像我们Unity中的摄像机自带的那种可以选择遮罩层次的感觉,但是现在的问题是,我们只能选择一个,并不能多选,现在我们要解决的就是,给这个枚举变量写一段让它可以多选的代码. 效果图如下: 这里的变量名我改成了自定义的中文,其实在代码中大家可以根据自己的需求更改 和上一篇一样,我先说一下这个工

Unity脚本在层级面板中的执行顺序测试4-附加内容

测试4为一些附加内容,后面的各种tips都加在此. 前几篇测试的链接: Unity脚本在层级面板中的执行顺序测试1 http://www.cnblogs.com/hont/p/4298110.html Unity脚本在层级面板中的执行顺序测试2 http://www.cnblogs.com/hont/p/5034419.html Unity脚本在层级面板中的执行顺序测试3 http://www.cnblogs.com/hont/p/5179427.html 1.基本执行顺序 Awake OnEn

一键展开关闭unity的 Inspector面板上的所有组件

孙广东  2015.12.11 using UnityEngine; using System.Collections.Generic; using System.Collections; using UnityEditor; using System.Reflection; using System; /// <summary> /// 描述:全部 展开/收起 Inspector面板的所有组件. /// author: 孙广东 /// todo 还可以深度定制,添加两个按钮切换 /// &l

解决在自定义编辑器下,无法用Inspector面板的赋值作为参数显示Gizmos的问题

之前在给策划童鞋写一个小脚本,为了让他们使用时能很快了解用法,自定义了编辑器,重写了一下脚本的inspector面板布局和显示逻辑. 但发现一个问题,就是一旦自定义了Editor,Gizmo的绘图包含通过编辑器赋值的参数就不能使用了.也就是说,假如我想Gizmos.DrawLine(from * param, to * param);其中 param 为编辑器赋值参数,这时Gizmo会一直使用默认值. 我想这也很好理解,扩展的东西Gizmo当然是不知道的.于是google了一下,几经波折(主要是