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.mzph.cn/news/640361.shtml

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

相关文章

如何查看其他电脑的MYSQL数据库 mysql查询另一个ip数据库

文章标签如何查看其他电脑的MYSQL数据库mysql数据库服务器MySQL文章分类MySQL数据库阅读数143 1.如何通过IP访问MySQL数据库 1.1 改表法1.2 授权法 2.MySQL数据库基本命令 2.1 基本命令2.2 注释2.3 关键字2.4 实践操作 3 小结 1.如何通过IP访问MySQL数据库 1.1 改表法 如…

三、安全工程—安全架构(CISSP)

目录 一、安全工程 1.企业安全架构与系统安全架构 2.通用企业架构框架 2.1 Zachman框架

【JS逆向学习】国家加密系列-SM算法实例

SM系列 1、国家加密算法介绍 事实上从 2010 年开始,我国国家密码管理局就已经开始陆续发布了一系列国产加密算法,其中SM1、SM4、SM7、祖冲之密码(ZUC)是对称算法;SM2、SM9是非对称算法;SM3是哈希算法。目…

Django框架二

一、模型层及ORM 1.模型层定义 负责跟数据库之间进行通信 2.Django配置mysql 安装mysqlclient,mysqlclient版本最好在13.13以上 pip3 install mysqlclient DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: "mysite1",USER:root,PASSWO…

pip安装之后还是无法使用问题处理

最近由于需要使用到Python 相关功能, 记录下一些入门小技巧 1 python 下载安装 在window10 环境下载免安装版本, 并解压 安装包下载地址: https://www.python.org/ftp/python/3.12.1/python-3.12.1-embed-amd64.zip 2. 安装pip, 由于是内嵌…

【立创EDA-PCB设计基础】5.布线设计规则设置

前言:本文详解布线前的设计规则设置。经过本专栏中的【立创EDA-PCB设计基础】前几节已经完成了布局,接下来开始进行布线,在布线之前,要设置设计规则。 目录 1.间距设置 1.1 安全间距设置 1.2 其它间距设置 2.物理设置 2.1 导…

Git生成公钥

一.配置本地用户名及邮箱 # 配置用户名 git config --global user.name "用户名" # 配置邮箱 git config --global user.email "邮箱地址"以上命令执行结束后,可用 git config --global --list 命令查看配置是否成功。 二.git生成公钥 在git…

力扣hot100 合并两个有序链表 递归 双指针

Problem: 21. 合并两个有序链表 文章目录 💖 递归思路 💖 双指针 💖 递归 思路 👨‍🏫 参考地址 n , m n,m n,m 分别为 list1 和 list2 的元素个数 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) 🌎 空间复杂…

是谁说网工这行是小众行业?我帮你搜了搜……

有人说网工这行是个小众行业,很多朋友在喊岗位不够多,我帮你搜了搜,其实招聘岗位的需求真的很多: 可能你换着搜索下关键词,善用不同类型的渠道,你会有新的惊喜。 能达到这要求的,这位朋友&#…

Halcon基于灰度值的模板匹配create_temple

Halcon基于灰度值的模板匹配 基于灰度值的模板匹配适用于图像内灰度变化比较稳定,噪声比较少,且灰度差异比较明显的检测目标。这是一种不太推的匹配方法,因为该方法复杂度高,一次只能检测一个目标,耗时,且…

线程池--JAVA

虽然线程是轻量级进程,但是如果当创建和销毁的的频率非常之高,那么它也就会消耗很多的资源。 而线程池就是用来优化线程频繁创建和销毁的场景,减少线程创建、销毁的频率。 ExecutorService JAVA标准库为我们实现了线程池,Execu…

华而有实,维乐Prevail Glide带你领略风景线,成为风景线~

大家都知道呢!骑行,不仅是一种运动,更是一种生活态度。在骑行装备的世界里,一个好的坐垫对于骑行的舒适度和安全性至关重要。那今天,我要为大家推荐一款备受赞誉的坐垫——维乐坐垫美学系列-Prevail Glide。    为…

基于springboot+vue的甘肃非物质文化网站(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

pycharm创建vue项目idealTree:npm: sill idealTree buildDeps,换taobao源后还不好使?那就再换一个

心血来潮打算写个小项目,前后端分离,flask/fastapivue(具体用哪个后端还没想好),里面的功能大概就是目前所有热门的应用的合集,一键出结果的那种,然后跟随着科技趋势,不断去更新维护…

CSGO搬砖项目还能火多久?

最近放假回到老家,见了不少亲戚朋友,大家不约而同都在感叹今年大环境不好,工作不顺,生意效益不好,公司状况不佳,反问我们生意如何?为了让他们心里好受一点,我也假装附和道:也不咋地&…

组件中写选项的顺序(vue的问题)

为什么选项要有统一的书写顺序呢?很简单,就是要将选择和认知成本最小化。 副作用 (触发组件外的影响) el全局感知 (要求组件以外的知识) nameparent组件类型 (更改组件的类型) functional模板修改器 (改变模板的编译方式) delimiterscomments模板依赖 (…

JavaScript DOM表单相关操作之表单相关事件

1、焦点事件 焦点事件就是鼠标的光标事件&#xff0c;点到输入框中&#xff0c;叫做获得焦点事件&#xff0c;当鼠标离开这个输入框时叫做失去焦点事件。 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>知数SEO_专注搜…

Rust 程序设计语言学习——基础语法

Rust 语言是一种高效、可靠的通用高级语言。其高效不仅限于开发效率&#xff0c;它的执行效率也是令人称赞的&#xff0c;是一种少有的兼顾开发效率和执行效率的语言。 Rust 语言由 Mozilla 开发&#xff0c;最早发布于 2014 年 9 月。Rust 的编译器是在 MIT License 和 Apach…

Beego之Beego参数配置

1、beego参数配置 配置模块是基础模块之一&#xff0c;对不同类型的配置文件提供了一种抽象。 beego目前支持INI、XML、JSON、YAML格式的配置文件解析&#xff0c;但是默认采用了INI格式解析&#xff0c;用户可以通过简 单的配置就可以获得很大的灵活性。同时也支持以 etcd …

qml中的信号槽的几种方式

1、信号处理器 当对应的信号发射时&#xff0c;信号处理器(就是QtWidgets中的槽函数)会被qml引擎自动调用。 在qml的对象定义中添加一个信号&#xff0c;则自动在对象定义中添加一个相应的对象处理器&#xff0c;只不过没有具体的代码实现。 如下所示&#xff0c;在Rectangle类…