Unity 编辑器篇|(十三)自定义属性绘制器(PropertyDrawer ,PropertyAttribute) (全面总结 | 建议收藏)

目录

  • 1. 前言
  • 2. PropertyDrawer
    • 2.1 参数总览
    • 2.2 两种用途
    • 2.3 注意事项
    • 2.4 代码样例
  • 3. PropertyDrawer与PropertyAttribute结合使用

1. 前言

  • 在Unity中,PropertyDrawerPropertyAttribute是两个重要的工具,它们主要用于自定义属性的显示和行为。
  • PropertyDrawer是一个类,它定义了如何在编辑器中渲染属性的外观。你可以通过继承PropertyDrawer类并重写其方法来自定义属性的显示方式。PropertyDrawer主要关注的是在编辑器中如何显示属性,提供了一种灵活的方式来控制属性的外观和交互方式。
  • PropertyAttribute是一个标记特性,它可以应用于C#类中的字段或属性上,提供额外的元数据或改变默认的编辑行为。通过使用PropertyAttribute,你可以为属性添加各种功能,例如限制值的范围、添加提示信息等。PropertyAttribute主要关注的是在代码中提供更多关于属性的信息和行为,以便在编辑器中更好地处理和呈现这些属性。
  • PropertyDrawerPropertyAttribute结合使用,可以实现更加丰富和灵活的编辑器自定义功能。通过定义自己的PropertyDrawer来控制属性的显示方式,并使用PropertyAttribute来提供额外的属性和行为信息,可以创建出高度定制化的编辑器界面,满足特定场景的需求。

2. PropertyDrawer

2.1 参数总览

常用参数描述
CreatePropertyGUI使用 UI Toolkit 为属性创建自定义 GUI。
GetPropertyHeight重载此方法可指定此字段的 GUI 的高度(以像素为单位)。
OnGUI重写此方法,为属性创建自己的基于 IMGUI 的 GUI。

2.2 两种用途

  • 自定义可序列化类的每个实例的GUI。如果脚本中的属性是自定义类,并且需要在Inspector中显示,可以使用Serializable修饰符。
  • 自定义具有自定义PropertyAttribute的脚本成员的GUI。通过结合使用PropertyAttribute和PropertyDrawer,可以自定义自己的Attribute,如添加提示信息、范围限制等。

2.3 注意事项

  • PropertyDrawer只对可序列化的类有效,非可序列化的类没法在Inspector面板中显示。
  • OnGUI方法里只能使用GUI相关方法,不能使用Layout相关方法。
  • PropertyDrawer对应类型的所有属性的显示方式都会修改,例如创建一个带string属性的MonoBehaviour。

2.4 代码样例

using UnityEngine;
using UnityEditor;[CustomPropertyDrawer(typeof(string))]
public class StringPropertyDrawer : PropertyDrawer
{public override void OnGUI(Rect position, SerializedProperty property, GUIContent label){Rect btnRect = new Rect(position);position.width -= 60;btnRect.x += btnRect.width - 60;btnRect.width = 60;EditorGUI.BeginProperty(position, label, property);EditorGUI.PropertyField(position, property, true);if (GUI.Button(btnRect, "select")){string path = property.stringValue;string selectStr = EditorUtility.OpenFilePanel("选择文件", path, "");if (!string.IsNullOrEmpty(selectStr)){property.stringValue = selectStr;}}EditorGUI.EndProperty();}
}
using UnityEngine;public class Test : MonoBehaviour
{public string str;
}

1

  • 为Inspector面板中的所有string属性添加一个选择文件按钮,选中文件的路径直接赋值给该变量。

3. PropertyDrawer与PropertyAttribute结合使用

  • 想要修改部分类的指定类型的属性的显示,直接使用PropertyDrawer就无法满足条件,这时可以结合PropertyDrawerPropertyAttribute来实现需求。
  • Unity中,有一些内置属性可直接使用,例如:[Range(0,100)][Header(“Header Name”)][Tooltip(“Tips”)] 等,当然自己也可以自定义属性,以下是一个简单实例:需要在滑动条后面,显示当前滑动条的值。
using UnityEngine;public class Test : MonoBehaviour
{[Range(0.0F, 10.0F)]public float myFloat = 0.0F;
}
using UnityEngine;public class RangeAttribute : PropertyAttribute
{public float min;public float max;public RangeAttribute(float min, float max){this.min = min;this.max = max;}
}
using UnityEngine;
using UnityEditor;
using System;[CustomPropertyDrawer(typeof(RangeAttribute))]
public class RangeDrawer : PropertyDrawer
{// 在给定的矩形内绘制属性public override void OnGUI(Rect position, SerializedProperty property, GUIContent label){// 首先获取属性,因为它包含滑块的范围RangeAttribute range = attribute as RangeAttribute;// 现在,根据属性是浮点数还是整数,将属性绘制为 Slider 或 IntSlider。if (property.propertyType == SerializedPropertyType.Float){EditorGUI.Slider(new Rect(position.x, position.y, position.width * 0.8f, position.height), property, range.min, range.max);EditorGUI.LabelField(new Rect(position.x + position.width * 0.8f, position.y, position.width - (position.x + position.width * 0.8f), position.height), "滑到了" + property.floatValue);}else if (property.propertyType == SerializedPropertyType.Integer)EditorGUI.IntSlider(position, property, Convert.ToInt32(range.min), Convert.ToInt32(range.max), label);elseEditorGUI.LabelField(position, label.text, "将 Range 与 float 或 int 一起使用。");}
}

2

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

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

相关文章

U-Boot 命令解析(一)

U-Boot 命令解析(一) 查询命令环境变量操作命令修改环境变量新建环境变量删除环境变量, 内存操作命令内存查看命令 md内存修改命令 nm内存修改命令 mm内存填充命令 mw内存拷贝命令 cp内存对比命令 cmp 更多内容 一般情况下,U-Boot…

亚马逊KYC审核的重要性,所需提交的文件有哪些?—站斧浏览器

亚马逊KYC审核的重要性有哪些? KYC审核是亚马逊对卖家身份的一种验证,确保卖家遵守相关法规。只有通过审核的卖家才能在欧洲平台进行销售。因此,正确理解和应对KYC审核对于卖家来说至关重要。 注册完成后立即触发:新注册的卖家可…

const关键字

修饰常量 const int a 10; int const a 10; 常量指针 以下两种方式等价 const int *a; int const *a; 常量指针说的是不可以通过指针改变指向内容的值,但是可以重新指向新的地址, 因此一般用作函数参数,防止内部通过指针地址中保存的值void test(…

Netty篇章(1)—— 核心原理介绍

终于进入到Netty框架的环节了,前面介绍了大量的Java-NIO的内容,核心的内容Selector、Channel、Buffer、Reactor掌握了,那么学起来Netty也是水到渠成的事情。如果没有掌握前面的内容那么学Netty会非常吃力,下面讲解Netty核心原理与…

机械设计-哈工大课程学习-螺旋传动

二、摩擦类型 1、静态摩擦:这是身体静止时所经历的摩擦。换句话说,就是身体有运动倾向时的摩擦力。 2、动态摩擦:这是身体在运动时所经历的摩擦。也称为动摩擦。动摩擦有以下两种类型: ①滑动摩擦:一个物体在另一个…

【深蓝学院】移动机器人运动规划--第2章 基于搜索的路径规划--笔记

0. Outline 1. Graph Search Basis Configuration Space等概念 机器人配置: 指机器人位置和所有点的表示。 DOF: 指用于表示机器人配置所需的最小的实数坐标的数量n。 C-space: 包含机器人n维所有配置的空间。 在C-space中机器人的pose是一个点。 机器人在C-space中被表示为一…

stm32中的SPI

SPI的简介 文章目录 SPI的简介物理层协议层基本通讯过程起始和终止信号数据有效性CPOL/CPHA及通讯模式 STM3的SPI特性及架构通讯引脚时钟控制逻辑数据控制逻辑整体控制逻辑通讯过程 代码配置实现结构体的定义SPI时钟信号的定义SPI端口定义SPI命令 flash驱动代码初始化代码(配置…

算法基础学习|双指针算法

双指针算法 代码模板 for (int i 0, j 0; i < n; i ){while (j < i && check(i, j)) j ;// 具体问题的逻辑 } 常见问题分类&#xff1a;(1) 对于一个序列&#xff0c;用两个指针维护一段区间(2) 对于两个序列&#xff0c;维护某种次序&#xff0c;比如归并…

Day34 1005k次取反最大值 134加油站 135分发糖果

1005 k次取反最大值 给定一个整数数组 A&#xff0c;我们只能用以下方法修改该数组&#xff1a;我们选择某个索引 i 并将 A[i] 替换为 -A[i]&#xff0c;然后总共重复这个过程 K 次。&#xff08;我们可以多次选择同一个索引 i。&#xff09; 以这种方式修改数组后&#xff0…

从零学Java - Stream API

Java - Stream API 文章目录 Java - Stream API什么是流(Stream)?Stream 的特点Stream使用步骤1 创建 Stream流2 中间操作3 终止操作 什么是流(Stream)? 流&#xff08;Stream&#xff09;与集合类似&#xff0c;但集合中保存的是数据&#xff0c;而Stream中保存对集合或数组…

深入MySQL窗口函数:原理和应用

在现代数据库管理系统中&#xff0c;窗口函数&#xff08;Window Functions&#xff09;已经成为处理复杂数据分析任务的关键工具。MySQL从8.0版本开始引入了对窗口函数的支持&#xff0c;这极大地增强了其在数据分析和报表生成方面的能力。本文将深入探讨MySQL窗口函数的原理、…

JVM系列-4.类加载器

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理&#x1f525;如果感觉博主的文…