使用反射功能在Unity运行状态通过Inspector面板修改字段和调用方法
使用反射功能在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面板修改字段和调用方法的更多相关文章
- C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法
使用反射(Reflect)获取dll文件中的类型并调用方法 需引用:System.Reflection; 1. 使用反射(Reflect)获取dll文件中的类型并调用方法(入门案例) static v ...
- XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)
XML序列化 #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...
- Unity编辑器重写Inspector面板,面板中编辑的数据不触发场景发生变化的问题。
今天开始协助主程一起制作新框架.主程让我写关于新版UI框架注册UI预制体用的快捷编辑器. 现学现写,总算完成了. 可以直接把选中的预制体添加到UIController的数组中,期间涉及到改变大小.所以 ...
- 让Unity的Inspector面板支持字符限制(restrict)功能
今天在优化红点组件,笔者打算将红点id由10进制改为16进制处理,就打算将红点id字段由uint类型改成string类型,用于填写16进制的字符(因为在Inspector面板里,uint/int类型字 ...
- Unity编辑器环境在Inspector面板中显示变量
Serialize功能Unity3D 中提供了非常方便的功能可以帮助用户将 成员变量 在Inspector中显示,并且定义Serialize关系. 简单的说,在没有自定义Inspector的情况下所有 ...
- 一种实现C++反射功能的想法(一)
Java的反射机制很酷, 只需知道类的名字就能够加载调用. 这个功能很实用, 想象一下, 用户只需指定类的名称, 就可以动态绑定类型, 而且只需通过字符串指定, 字符串的使用可以使得用户的修改只需修改 ...
- Unity 自定义Inspector面板时的数据持久化问题
自定义Inspector面板的步骤: Unity内创建自定义的Inspector需要在Asset的任意文件夹下创建一个名字是Editor的文件夹,随后这个文件夹内的cs文件就会被放在vstu生成的Ed ...
- C#开发Unity游戏教程之游戏对象的行为逻辑方法
C#开发Unity游戏教程之游戏对象的行为逻辑方法 游戏对象的行为逻辑——方法 方法(method),读者在第1章新建脚本时就见过了,而且在第2章对脚本做整体上的介绍时也介绍过,那么上一章呢,尽管主要 ...
- Java反射-修改字段值, 反射修改static final修饰的字段
反射修改字段 咱们从最简单的例子到难, 一步一步深入. 使用反射修改一个private修饰符的变量name 咱们回到主题, 先用反射来实现一个最基础的功能吧. 其中待获取的name如下: public ...
随机推荐
- 2018.11.17 bzoj4259: 残缺的字符串(fft)
传送门 fftfftfft套路题. 我们把aaa ~ zzz映射成111 ~ 262626,然后把∗*∗映射成000. 考虑对于两个长度都为nnn的字符串A,BA,BA,B. 我们定义一个差异函数di ...
- Codeforces Round #542(Div. 2) CDE 思维场
C https://codeforces.com/contest/1130/problem/C 题意 给你一个\(n*m\)(n,m<=50)的矩阵,每个格子代表海或者陆地,给出在陆地上的起点终 ...
- Mybatis-Plus 实战完整学习笔记(三)------导入MybatisPlus环境
1.dao层接口引入 package com.baidu.www.mplus.mapper; import com.baidu.www.mplus.bean.Employee; import com. ...
- linux cp操作,每天学习一点
指令名称:cp(copy)功能介绍:将一个文件复制至另一个文件,或将数个文件复制至另一目录. 语法格式: cp [options] source dest cp [options] source.. ...
- VIP之CVI CVO
3. VIP CVI CVO 在开始时,对于CVI和CVO是不知道应该怎样去调试的,就是不知道应该从哪里去确认是对还是错. 关于这一点从再次看到关于数据包的格式才明朗的.去分析CVI和输出 ...
- crontab使用环境变量
两种方式: 1)直接在crontab中定义变量,如: A=123 * * * * * echo $A > /tmp/a.txt 注意在定义变量时不能使用$引用其它变量,如下面的做法错误: A=1 ...
- MATLAB拟合正态分布
clear;clc;close all format compact %% 正态分布的拟合 % 生成随机数 num = 50; y = randn(1000,1); x = 1:num; y = hi ...
- day34(注解)
注解 注解和注释的区别: 注释:是给程序员看的. 注解:是给虚拟机识别的. 注解的作用: 1.代替配置文件 2.标识一个方法,代替一个特殊功能. JDK当中的提供的注解: 标识重写方法 @Overri ...
- linux下修改root密码以及找回密码的方法
以root身份登陆,执行: # passwd 用户名 (修改密码) # useradd 用户名 (添加用户) 具体示例如下:[root@bogon ~]# passwd root Changing p ...
- java重定向与请求转发的区别
最近工作不算太忙,今天在这里对java中的重定向和请求转发稍作总结,希望能帮助到大家. 请求转发: request.getRequestDispatcher().forward(); 重定向: res ...