使用反射功能在Unity运行状态通过Inspector面板修改字段和调用方法

效果展示

一个很简单的组件脚本

运行状态在Inspector面板可以随便修改字段和调用方法

方法调用日志

设计由来

  • 最近在学习反射
  • 结合游戏开发过程遇到比较难受的事情

应用场景

  • 游戏特别庞大、电脑特别垃圾、重新运行一次Unity需要等待几十秒的情况下

  • 你需要修改一个组件字段或者调用一个方法展示一个动画等等

  • 这个时候你肯定渴望可以直接修改字段或者直接调用某个方法

  • 反射就可以实现

  • 修改实例对象所有的字段包括私有字段

  • 调用实例对象所有的方法包括私有方法

  • 总结一下:就是可以瞎几把修改组件字段和调用组件方法

反射可以做哪些事

  • 获取类的所有字段属性方法包括私有的

  • 修改类的所有字段包括私有的

  • 修改类的所有属性包括私有的

  • 调用类的所有方法包括私有的

  • 实例化一个类(这个工具用不到)

制作流程

  • 新建一个继承MonoBehaviour的类 ReflectionMonoBehaviour

  • 在类的Start方法获取挂在游戏对象上的其他组件实例

  • 新建一个的Editor类 ReflectionMonoBehaviourEditor

  • 自定义编辑脚本Inspector面板

  • 通过上面获取的组件实例

  • 反射出所有的字段、属性、方法

  • 然后在Inspector面板显示出来

  • 通过在Inspector面板修改、点击按钮

  • 使用反射修改、调用组件实例

使用到的反射方法


using System.Reflection; //获取实例组件的Type
Type type = 实例对象.GetType(); //获取实例组件的所有字段(BindingFlags限制枚举)
FieldInfo[] allFieldInfo = type.GetFields(BindingFlags.NonPublic | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Static); //获取实例组件的所有方法(BindingFlags限制枚举)
MethodInfo[] allMemberInfo = type.GetMethods(BindingFlags.NonPublic | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Static); //获取字段的类型(int string float 等等)
FieldInfo.FieldType //获取方法的所有参数
MethodInfo.GetParameters() //获取参数的类型
ParameterInfo.ParameterType //修改实例组件的字段
Field.fsieldInfo.SetValue(实例对象, 值) //方法实例组件的方法
Method.methodInfo.Invoke(实例对象, 所有参数);

工具待完善

目前只支持一些类型的字段修改和调用方法

如果有需要可以自己修改 很简单的

源码例子地址

源码:https://github.com/QiangZou/ZouQiang/tree/master/Assets/ZouQiang/Tool/ReflectionMonoBehaviour

例子:https://github.com/QiangZou/ZouQiang/tree/master/Assets/ZouQiangExample/ReflectionMonoBehaviour

使用反射功能在Unity运行状态通过Inspector面板修改字段和调用方法的更多相关文章

  1. C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法

    使用反射(Reflect)获取dll文件中的类型并调用方法 需引用:System.Reflection; 1. 使用反射(Reflect)获取dll文件中的类型并调用方法(入门案例) static v ...

  2. XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)

    XML序列化   #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...

  3. Unity编辑器重写Inspector面板,面板中编辑的数据不触发场景发生变化的问题。

    今天开始协助主程一起制作新框架.主程让我写关于新版UI框架注册UI预制体用的快捷编辑器. 现学现写,总算完成了. 可以直接把选中的预制体添加到UIController的数组中,期间涉及到改变大小.所以 ...

  4. 让Unity的Inspector面板支持字符限制(restrict)功能

    今天在优化红点组件,笔者打算将红点id由10进制改为16进制处理,就打算将红点id字段由uint类型改成string类型,用于填写16进制的字符(因为在Inspector面板里,uint/int类型字 ...

  5. Unity编辑器环境在Inspector面板中显示变量

    Serialize功能Unity3D 中提供了非常方便的功能可以帮助用户将 成员变量 在Inspector中显示,并且定义Serialize关系. 简单的说,在没有自定义Inspector的情况下所有 ...

  6. 一种实现C++反射功能的想法(一)

    Java的反射机制很酷, 只需知道类的名字就能够加载调用. 这个功能很实用, 想象一下, 用户只需指定类的名称, 就可以动态绑定类型, 而且只需通过字符串指定, 字符串的使用可以使得用户的修改只需修改 ...

  7. Unity 自定义Inspector面板时的数据持久化问题

    自定义Inspector面板的步骤: Unity内创建自定义的Inspector需要在Asset的任意文件夹下创建一个名字是Editor的文件夹,随后这个文件夹内的cs文件就会被放在vstu生成的Ed ...

  8. C#开发Unity游戏教程之游戏对象的行为逻辑方法

    C#开发Unity游戏教程之游戏对象的行为逻辑方法 游戏对象的行为逻辑——方法 方法(method),读者在第1章新建脚本时就见过了,而且在第2章对脚本做整体上的介绍时也介绍过,那么上一章呢,尽管主要 ...

  9. Java反射-修改字段值, 反射修改static final修饰的字段

    反射修改字段 咱们从最简单的例子到难, 一步一步深入. 使用反射修改一个private修饰符的变量name 咱们回到主题, 先用反射来实现一个最基础的功能吧. 其中待获取的name如下: public ...

随机推荐

  1. ios alloc init 和 new 的区别

    1.在实际开发中很少会用到new,一般创建对象咱们看到的全是[[className alloc] init] 但是并不意味着你不会接触到new,在一些代码中还是会看到[className new], ...

  2. 2019.01.24 bzoj2310: ParkII(轮廓线dp)

    传送门 题意简述:给一个m*n的矩阵,每个格子有权值V(i,j) (可能为负数),要求找一条路径,使得每个点最多经过一次且点权值之和最大. 思路:我们将求回路时的状态定义改进一下. 现在由于求的是路径 ...

  3. 2018.11.06 NOIP训练 简单的计数问题(计数dp)

    传送门 直接f[i][j]f[i][j]f[i][j]表示已经到第iii个位置已经找到jjj个的方案数. 简单转移一下就行了. 代码

  4. nginx自动启动脚本

    #!/bin/bash#nginx - this script starts and stops the nginx daemin # # chkconfig: - 85 15 # descripti ...

  5. new命令简化的内部流程

    构造函数返回对象的一些问题: function fn(name,age){ this.name = name; this.age = age; //return 23; 忽略数字,直接返回原有对象 / ...

  6. python中的分号

    很多编程语言是以分号作为一行代码的的结束标志,但是在Python中不是这样的,而是靠缩进来识别程序结构. Python中一行代码以分号结束,并不是必须的,准确来说是不被推荐的,因为加上分号就是画蛇添足 ...

  7. php 获取当前在线用户数量

    <?php //在线人数统计 $filename='online.txt';//数据文件 $cookiename='VGOTCN_OnLineCount';//cookie名称 $onlinet ...

  8. MySQL连接查询(多表查询)

    基本含义 连接就是指两个或两个以上的表(数据源) “连接起来成为一个数据源”. 连接语法的基本形式:from 表1 [连接方式] join 表2 [on 连接条件]; 连接的结果可以当做一个“表”来使 ...

  9. SSM_CRUD新手练习(5)测试mapper

    上一篇我们使用逆向工程生成了所需要的bean.dao和对应的mapper.xml文件,并且修改好了我们需要的数据库查询方法. 现在我们来测试一下DAO层,在test包下新建一个MapperTest.j ...

  10. VS中的调试相关的技巧

    1. 可以设置断点的命中条件: