千家信息网

如何用反射来实现将自定义类型显示在Unity的Inspector上

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,这期内容当中小编将会给大家带来有关如何用反射来实现将自定义类型显示在Unity的Inspector上,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。最近准备在Unit
千家信息网最后更新 2025年12月01日如何用反射来实现将自定义类型显示在Unity的Inspector上

这期内容当中小编将会给大家带来有关如何用反射来实现将自定义类型显示在Unity的Inspector上,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

最近准备在Unity调试移植的FixedB2CSharp,整个库是基于定点数的,所以首先需要将定点数序列化显示在Inspector上,没想到一脚就踩进了坑里。

一般来说,要实现我这个需求,用PropertyDrawer就好了,照着Unity的API手册改一改也就能用了。但是,我这个定点数类型还是有些不一样的,以下是关键部分代码的节选:

[Serializable]public struct Fix64{    public long RawValue { get; }    //...    public static explicit operator float(Fix64 value){        //...    }}

我可以说想尽办法也没能从SerializedProperty这个类型中直接获取到Fix64类型的目标值,所以我左思右想,既然是编辑器脚本,直接上反射试试?

说干就干,先看看API手册,怎么才能拿到目标值的引用?一般来说,这种引用都是object,所以先去看看SerializedProperty里没有object类型的成员,确认过眼神,没有。

思考一下,SerializedProperty是什么?他是想要显示在Inspector上的一个属性,和MonoBehaviourScriptableObject等类型不同,他是像Vector2一样的非UnityEngine.Object类型,所以我们拿到他所在类的实例,再通过反射去查找这个属性,不就获取到了他的值了吗?

所以我们首先通过property.serializedObject.targetObject拿到了实际上我们在Inspector上显示的UnityEngine.Object类型,然后又有了property.propertyPath提供的目录,我们很轻松的就通过反射拿到了他的父级类型的实例,为了测试,我这里写了一个MonoBehaviour脚本:

public class EditorGUITest: MonoBehaviour {   public FixedDt typeafae21;   public float xf = 1616;}[Serializable]public class FixedDt {   public Fix64 afafafafa;   public Fix64 f2wfsfaeaf;}

最终我们拿到了EditorGUITest的成员typeafae21,类型为FixedDt的实例。

最后我们通过property.name这个属性,反射获得想要的值。

思路有了代码就很简单,这里直接上完整代码:

[CustomPropertyDrawer(typeof(Fix64))]public class Fix64Drawer : PropertyDrawer {   // Draw the property inside the given rect   public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) {      using (new EditorGUI.PropertyScope(position, label, property)) {         var parent = GetParentObjectOfProperty(property.propertyPath, property.serializedObject.targetObject);         var type = parent.GetType();         var pi = type.GetField(property.name);         var o = pi.GetValue(parent);         var value = (Fix64) o;         value = EditorGUI.FloatField(position, label, (float) value);         pi.SetValue(parent,value);      }   }   private object GetParentObjectOfProperty(string path, object obj) {      while (true) {         var fields = path.Split('.');         if (fields.Length == 1) {            return obj;         }         var fi = obj.GetType()                  .GetField(fields[0], BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);         obj = fi.GetValue(obj);         path = string.Join(".", fields, 1, fields.Length - 1);      }   }}

上述就是小编为大家分享的如何用反射来实现将自定义类型显示在Unity的Inspector上了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

类型 反射 代码 实例 属性 点数 一般来说 内容 成员 手册 目标 目标值 脚本 分析 不同 左思右想 没想到 专业 中小 关键 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 改变数据库表列的属性 国智网络安全 网络安全北京邮电大学 网络安全供应链安全 怀旧服部落服务器有什么用 算力感知网络技术白皮书下载 乌鲁木齐装修网络安全 平台电商软件开发报价 网络安全从哪里开始学 uu加速器英国服务器用什么节点 想要学习网络安全专业 成都美图网络技术有限公司 网络安全知识班会主持 廊坊市讯峰网络技术有限公司 江苏网络技术咨询代理商 上海net软件开发费用是多少 SVD服务器产品线管理部 服务器加速时间怎么设置 乡镇贯彻网络安全的具体措施 集美游戏软件开发 宝塔数据库备份用户权限表 网络安全管理人员培训考试题 嵌入式底层软件开发实训报告 云服务器安全 物联网对于网络安全的意 历史趋势曲线数据库 网络安全监控中心效果图 怎么进入网站的数据库 安全接入服务器地址上海 财务网络安全报告
0