unity属性面板值的显示和隐藏

本文详细介绍了Unity3D中的序列化功能,包括公共变量、SerializeField属性、Serializable特性、ScriptableObject类型以及非序列化变量的定义方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Serialize功能

Unity3D 中提供了非常方便的功能可以帮助用户将 成员变量 在Inspector中显示,并且定义Serialize关系。

简单的说,在没有自定义Inspector的情况下所有显示在Inspector 中的属性都同时具有Serialize功能。

换句话说,就是你在Inspector看到什么,保存游戏的时候,这些值就会被保存成二进制文件。

本文说说可被Serialize的变量的定义方法

1. public 变量

在没有加入任何Attribute的前提下,public变量是默认被视为可以被Serialize的。所以public声明的变量在Inspector面板中是可见的。
public int MaxExp;

2. [SerializeField] Attribute

强制unity去序列化一个私有域

这是一个内部的unity序列化功能,有时候我们需要Serialize一个private或者protected的属性,这个时候可以使用[SerializeField]这个Attribute:

[SerializeField]
protected int foobar = 0;
注意: 这样定义出的成员变量也是会在Inspector中显示出来。

在Unity最新的UI系统中,UI属性上方全部添加[SerializeField] ,如下所示

[SerializeField]
private int ID;
这里写图片描述

SerializeField参考文档:http://game.ceeger.com/Script/Attributes/SerializeField.html

3. 单独的class或struct

Serializable是.Net自带的序列化

有时候我们会自定义一些单独的class/struct, 由于这些类并没有从 MonoBehavior 派生所以默认并不被Unity3D识别为可以Serialize的结构。自然也就不会在Inspector中显示。我们可以通过添加 [System.Serializable]这个Attribute使Unity3D检测并注册这些类为可Serialize的类型。具体做法如下:

[System.Serializable]
public class FooBar {
public int foo = 5;
public int bar = 10;
}
注意:Serializable只可以对class,struct,enum,delegate进行序列化,不可以对属性序列化

代码1:添加Serializable特性
这里写图片描述
结果1:
这里写图片描述
代码2:不添加Serializable特性
这里写图片描述
结果2:
这里写图片描述

所以,如果class添加Serializable特性之后,定义为public变量会在Inspector面板上面显示,否则即使是public类型的变量,也无法在Inspector面板上面显示。

4. ScriptableObject

ScriptableObject 类型经常用于存储一些unity3d本身不可以打包的一些object,比如字符串,一些类对象等。用这个类型的子类型,则可以用BuildPipeline打包成assetbundle包供后续使用,非常方便,具体请参考 [cb]ScriptableObject 序列化

NonSerialize的变量的定义方法

4.1. protected, private, internal 变量

默认情况下,protected, private, internal变量将不会被serialize.

4.2. [System.NonSerialized] Attribute

有时候我们需要定义一些public变量方便操作,但是又不希望这些变量保留。这个时候可以利用[System.NonSerialized]来完成这个操作:

[System.NonSerialized] public float foobar = 1.0f;

4.3. readonly, const, static 修饰符

如果变量加入了readonly, const, static等修饰符,无论他的serialize设置如何,都将不会进行serialize

4.4. Dictionary
            <link rel="stylesheet" href="http://static.blog.csdn.net/public/res-min/markdown_views.css?v=2.0" />
                </div>
<think>嗯,用户想了解Unity属性面板开发。首先,我需要确认用户的需求。他们可能在使用Unity进行游戏开发,想要自定义Inspector面板以提高工作效率。可能是一位开发者,遇到了默认Inspector够用的情况,或者想要优化团队的工作流程。 接下来,我应该介绍Unity属性面板开发的基础,也就是Custom Editors。可能需要解释如何通过编写自定义编辑器脚本来扩展Inspector的功能。需要提到Unity的序列化系统EditorGUI相关的API,比如OnInspectorGUI方法。 然后,可能需要提到PropertyDrawer,用于为特定数据类型创建自定义绘制方式。比如,如果一个类有特殊结构,用户可能希望更直观地显示在Inspector中。这时候PropertyDrawer就派上用场了,应该举一个例子,比如EnumFlagsAttribute,让枚举显示为多选框。 另外,用户可能对更高级的功能感兴趣,比如EditorWindow,可以用来创建自定义工具窗口,或者使用IMGUIUIElements两种GUI系统。需要简单比较两者的优缺点,UIElements更适合复杂界面,而IMGUI更直接但性能稍差。 还要考虑用户可能遇到的常见问题,比如如何让非程序员也能方便地调整参数,或者如何优化Inspector的布局。可能需要提到HorizontalGroup、Header这些特性,以及如何利用Odin Inspector插件简化开发。 最后,应该给出一些学习资源,比如Unity官方文档、社区教程,或者推荐插件,帮助用户更快上手。同时,提醒用户注意Editor脚本的存放位置,必须放在Editor文件夹下,否则会报错。 总结下来,结构应该是先介绍基本概念,再分点详细说明Custom Editor、PropertyDrawer、高级功能,然后推荐学习资源注意事项。确保内容清晰,适合同水平的开发者理解。</think>好的!Unity 属性面板开发(Inspector 面板开发)是 Unity 编辑器扩展的核心功能之一,主要用于自定义组件(`MonoBehaviour` 或 `ScriptableObject`)在 Inspector 中的显示方式。通过自定义属性面板,开发者可以优化工作流程、增强可视化编辑能力,或为团队提供更友好的工具支持。 --- ### **1. 基础概念** - **Unity Inspector**:默认情况下,Unity 会根据组件的公共字段(`public`)或标记了 `[SerializeField]` 的字段自动生成属性面板。但这种自动生成的布局可能够灵活。 - **自定义 Inspector**:通过编写 **Editor 脚本**,可以完全控制组件在 Inspector 中的显示方式,包括布局、输入验证、按钮操作等。 --- ### **2. 核心实现方法** #### **(1) 自定义编辑器(Custom Editor)** - **步骤**: 1. 在项目中创建 `Editor` 文件夹(Unity 要求 Editor 脚本必须放在此文件夹或其子目录)。 2. 编写一个继承自 `UnityEditor.Editor` 的类。 3. 使用 `[CustomEditor(typeof(YourComponent))]` 属性关联目标组件。 4. 重写 `OnInspectorGUI()` 方法,定义自定义界面。 - **示例代码**: ```csharp using UnityEditor; using UnityEngine; [CustomEditor(typeof(YourComponent))] public class YourComponentEditor : Editor { public override void OnInspectorGUI() { // 获取目标组件 YourComponent component = (YourComponent)target; // 自定义布局 component.speed = EditorGUILayout.FloatField("移动速度", component.speed); component.isActive = EditorGUILayout.Toggle("是否激活", component.isActive); // 添加按钮 if (GUILayout.Button("重置参数")) { component.ResetParameters(); } } } ``` #### **(2) 使用 PropertyDrawer** - **用途**:为特定数据类型(如自定义 `struct` 或 `class`)定义 Inspector 中的显示方式。 - **示例**:为某个枚举类型添加多选框(Flags)效果。 ```csharp [CustomPropertyDrawer(typeof(EnumFlagsAttribute))] public class EnumFlagsDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { property.intValue = EditorGUI.MaskField(position, label, property.intValue, property.enumNames); } } // 使用方式:在枚举字段上添加 [EnumFlags] [EnumFlags] public MyEnumType myEnum; ``` --- ### **3. 高级功能** #### **(1) 分组与布局** - 使用 `GUILayout` 或 `EditorGUILayout` 提供的控件(如 `BeginHorizontal`/`EndHorizontal`)实现复杂布局。 - 利用 `[Header("标题")]`、`[Space(10)]` 等 Unity 原生特性优化显示。 #### **(2) 条件显示** - 根据字段动态隐藏/显示属性: ```csharp if (component.showAdvancedOptions) { component.advancedValue = EditorGUILayout.IntField("高级参数", component.advancedValue); } ``` #### **(3) 按钮与交互** - 通过 `GUILayout.Button` 添加按钮,绑定方法: ```csharp if (GUILayout.Button("一键配置")) { component.AutoConfigure(); EditorUtility.SetDirty(component); // 标记对象为“已修改” } ``` #### **(4) 序列化与数据持久化** - 使用 `SerializedObject` `SerializedProperty` 处理数据修改,确保 Undo/Redo 功能正常。 ```csharp SerializedObject serializedObject = new SerializedObject(component); SerializedProperty speedProp = serializedObject.FindProperty("speed"); EditorGUILayout.PropertyField(speedProp); serializedObject.ApplyModifiedProperties(); ``` --- ### **4. 工具与插件推荐** - **Odin Inspector**:第三方插件,通过 `[ShowInInspector]`、`[BoxGroup]` 等属性快速实现复杂布局,无需编写 Editor 代码。 - **UIElements**:Unity 的新一代 UI 系统,支持通过 XML USS 样式表设计更复杂的编辑器界面。 --- ### **5. 学习资源** 1. **Unity 官方文档**: - [Editor Scripting](https://docs.unity3d.com/Manual/EditorScripting.html) - [Custom Editors](https://docs.unity3d.com/Manual/editor-EditorWindows.html) 2. **实用教程**: - 官方教程《[Extending the Unity Editor](https://learn.unity.com/tutorial/extending-the-unity-editor)》 - 社区博客如 Catlike Coding 或 Brackeys 的相关教程。 --- 通过自定义属性面板,你可以让组件更易用、减少错误输入,甚至为非程序员提供友好的配置工具。如果需要更具体的案例或代码示例,可以进一步说明需求! 😊
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值