Unity编辑器拓展PropertyDrawer——Editor绘制偷懒神器

写在前面

我们在使用UnityEditor自定义属性面板时,大多的时候都是直接使用继承Editor的方式实现,一个脚本类写一个Editor类,但是有很多非MonoBehaviour的类,会需要在不同的脚本上使用,这个时候需求就来了,每一个都要重复写那也太麻烦了,这个时候就可以用PropertyDrawer了。

我使用的Unity版本:Unity 2020.3.10
在这里插入图片描述

总结

PropertyDrawer的两大主要作用:
1. 用于自定义绘制可序列化的类或结构体
有需要自定义显示的又会可能在多个脚本中使用到的类或结构体都可以使用PropertyDrawer来实现,PropertyDrawer如其名,就像一个专门的属性绘制器一样,对一个类或结构体进行自定义属性绘制后,当脚本在属性面板上显示该属性时,就会调用到该自定义的绘制,不用我们再写Editor脚本去单独绘制,所以省去了大量的工作
2. 搭配PropertyAttribute可自定义Attribute
相信大家平常都有用过诸如【Header】【ToolTip】之类的Attribute,而通过PropertyAttribute+PropertyDrawer就可以自定义自己的Attribute

自定义绘制可序列化的类或结构体

这里我们使用书,书单的类来示例这个功能
Book就是我们要进行自定义绘制的类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum BookType
{
   
   
    Novel,
    Science,
    Life,
    Tool,
}
[System.Serializable]
public class Book
{
   
   
    public string name;
    public BookType type;
    public string overview;
}
public class BookList : MonoBehaviour
{
   
   
    public Book currentRead;
    public Book[] readList;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
[CustomPropertyDrawer(typeof(Book))]
public class BookDrawer : PropertyDrawer
{
   
   
    public override void OnGUI(Rect position, SerializedProperty property
<think>好的,我现在需要解决用户在Unity 2023中让检索面板中的变量名称显示为中文的问题。首先,我得确认用户的需求是什么。用户希望变量在Unity的检视面板(Inspector)中显示中文名称,而不是代码中的变量名。这可能涉及到Unity的序列化字段和自定义属性。 首先,我应该回顾一下Unity中如何自定义检视面板中的变量名称。通常,我们会使用[SerializeField]属性来让私有变量显示在检视面板,或者直接使用public变量。默认情况下,变量名会以英文显示。要让其显示为中文,可能需要使用Unity的Tooltip属性或者自定义PropertyDrawer。 不过,Tooltip属性通常用于显示提示信息,而不是直接改变变量名称。所以更可能的是需要自定义属性来覆盖默认的标签显示。这时候可能需要创建一个自定义属性,比如[Renamed]或者[Label],然后在属性绘制器中修改显示的标签名称。 接下来,我需要验证这种方法的可行性。例如,创建一个自定义属性类,继承自PropertyAttribute,然后在对应的PropertyDrawer中,重写OnGUI方法,将原本的label替换为中文名称。这样在检视面板中,该变量就会显示自定义的中文名称,而代码中的变量名保持不变。 但要注意的是,UnityPropertyDrawer需要处理EditorGUI的绘制,这属于编辑器脚本的范畴,因此需要将相关脚本放在Assets目录下的Editor文件夹中,否则不会被正确编译。另外,用户需要确保在变量上正确应用自定义属性,例如在变量声明前加上[Renamed("中文名称")]。 我还需要考虑是否有现成的插件或资源可以实现这一功能,但用户可能希望不依赖第三方插件,而是通过代码实现。因此,提供一个自定义PropertyAttribute和对应的PropertyDrawer的示例代码会比较合适。 此外,可能需要提醒用户,如果变量是public的,Unity默认会序列化并在检视面板显示变量名,而使用[SerializeField]可以让私有变量也显示出来。结合自定义标签属性,无论是public还是[SerializeField]的变量都可以显示中文名称。 最后,需要验证这个方法的步骤是否正确,包括创建属性类、创建对应的PropertyDrawer、将脚本放在Editor文件夹,以及在变量上添加属性。同时,提醒用户重启Unity或重新编译脚本以使更改生效。</think>在Unity 2023中,若要在检视面板(Inspector)中让变量显示为中文名称,可通过以下步骤实现: --- ### **步骤1:创建自定义属性** 创建一个继承自 `PropertyAttribute` 的类,用于标记需要显示中文名称的字段: ```csharp using UnityEngine; public class RenamedAttribute : PropertyAttribute { public string DisplayName { get; private set; } public RenamedAttribute(string displayName) { DisplayName = displayName; } } ``` --- ### **步骤2:创建自定义PropertyDrawer** 在 `Editor` 文件夹下新建脚本,继承 `PropertyDrawer` 并重写绘制逻辑: ```csharp using UnityEditor; using UnityEngine; [CustomPropertyDrawer(typeof(RenamedAttribute))] public class RenamedDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { // 获取自定义属性中的显示名称 RenamedAttribute renamedAttribute = (RenamedAttribute)attribute; label.text = renamedAttribute.DisplayName; // 绘制默认的Property字段,但使用修改后的label EditorGUI.PropertyField(position, property, label); } } ``` --- ### **步骤3:应用自定义属性到变量** 在需要显示中文名称的变量前添加 `[Renamed("中文名称")]` 属性: ```csharp public class ExampleScript : MonoBehaviour { [Renamed("移动速度")] public float moveSpeed; [SerializeField, Renamed("最大生命值")] private int maxHealth; } ``` --- ### **效果说明** - **原理解释**:通过自定义 `PropertyDrawer` 覆盖默认的字段标签渲染逻辑,将代码中的变量名替换为指定中文文本。 - **注意事项**: 1. 必须将 `RenamedDrawer.cs` 放在 `Assets/Editor` 文件夹中。 2. 支持 `public` 变量和 `[SerializeField]` 标记的私有变量。 3. 修改后需保存脚本并重新编译Unity工程。 --- ### **扩展方案** 若需批量管理,可结合 `Localization` 本地化系统,通过键值对动态加载不同语言的名称(需额外代码实现)。 通过以上方法,即可在不修改代码变量名的前提下,在检视面板中显示直观的中文名称。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值