今天测试反射的时候突发奇想 调用了untiy 里面的生命周期 !!!
可能就有人会问 什么是反射?
C# 反射(Reflection)超详细解析_c# reflection-CSDN博客 可以参考
https://www.cnblogs.com/OtusScops/p/16746498.html
.net 很多东西都是从 java 里面过来的 可以看看java 的
什么是反射 (Reflection)?可以用它做什么?-CSDN博客
首先 我们可以知道 C# Type 里面的属性
int memSize;//当前类的实例的内存大小
List<FieldInfo> datas;
List<MethodInfo> funcs;
一个集合里面放置所有的参数
一个集合是里面的函数方法 最基础的构成
class MethodInfo
{ string methName;
int type;//静态/普通
int offset;//函数代码指令的地址 }
函数的构成
class FieldInfo
{ string filedName;
int type;
int filedSize;//该字段内存大小
int offset;//内存偏移 }
参数
Type t = new Type();
t.addFiled("hp" , 100); //放入参数
t.addFiled("atk" , 10);
t.addMethod("GetHit" , 成员方法 , 地址); //放入函数
t.addMethod("Healing" , 成员方法 , 地址);
具体流程
好了 你已经会了
现在外面要调用Type 里面的函数 来获取具体的类
string name = "当前组件名";
Type t = System.Type.GetType(name);//它会返回name对应类的描述,这也是为什么脚本不能重名
gameObject.AddComponent(t);
ok 下一个阶段
public class Demo: MonoBehaviour //定义一个类
{
public GameObject prefab; //预制体
public int hp = 100;//血量
public int atk = 10;
public GameObject New; //新的预制体
}
private int Hurt(int atk)
{
this.hp -= dmg;
Debug.Log("Hurt");
return 11;
}
void Start()
{
Debug.Log(12);
}
我们先正常的调用反射
Type type = Type.GetType("Client");//通过字符串找到类
//利用描述实例化一个对象
var instance = Activator.CreateInstance(type);
FieldInfo fieldInfo = type.GetField("hp");//获取字段
fieldInfo.SetValue(instance, 50);//获取这个实例的字段
Debug.Log((instance as Client).hp);
//调用成员函数
MethodInfo methodInfo = type.GetMethod("GetHit", BindingFlags.NonPublic | BindingFlags.Instance);
System.Object[] funcParas = new System.Object[1];//方法所需要的方法
funcParas[0] = 10;//具体参数
System.Object ret = methodInfo.Invoke(instance, funcParas);//调用
可以反射 逻辑没问题
注意
我在这个静态函数去生成一个Cube
恭喜你已经会反射了