1.Mono的机制
Unity启动时候会调用所有继承自MonoBehavior的类的相关函数,比如Awake,Start,然后每帧会调用Update,那么怎么组织这个调用关系,难道Unity是将所有继承自Mono的类通过反射获取到相关函数,然后统一调用,但是这样效率如何,内存开销大不大,假如是在全局的函数中将所有的继承自Mono的Start等类似的方法存起来统一调用,每帧驱动的时候调用Update
Type t = mono.GetType();
MethodInfo mf = t.GetMethod("Start", BindingFlags.Instance | BindingFlags.NonPublic);
mf.Invoke(mono, null);
2.通过反射调用函数的私有方法
usingSystem;
usingSystem.Reflection;
//======================
publicobjectCallNonPublicMethod(objectinstance, stringmethodName, object[] param)
{
Type type = instance.GetType();
MethodInfo method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic);
objectresult;
try
{
result = method.Invoke(instance, param);
}
catch(TargetInvocationException ex)
{
throwex.InnerException;
}
returnresult;
}
3.Mono机制中函数的调用顺序和生命周期
Awake:绑定的gameobject不被隐藏就会调用,MonoTest脚本是否被设置为false并不影响其执行
OnEnable:脚本被激活时调用,在Start之前被调用
Start::绑定的gameobject和MonoTest都不能被设置为false,在Update的前一帧被调用
Update:每帧执行,受帧率波动的影响,每帧的执行 时间不固定,以维持一秒钟的总执行时间和帧数不变
LateUpdate:每帧的最后执行,也就是在这一帧要做的最后的工作放在这个函数中
FixedUpdate:每帧之间的执行间隔固定
OnGUI:渲染事件,每帧执行多次
函数运行周期图->Awake,Enable,Start等用来初始化的函数
->物理系统如碰撞等(可能一阵内执行多次)
->Input等键鼠输入
->yield协程
->动画Animation
->场景渲染各种Render函数(可以看到渲染在一帧的位置实际是比较靠后的)
->OnDrawGizmos,OnGUI等编辑器和UI的渲染函数
->一帧结束后,OnDisabel, OnDestroy
网友评论