用c#开发的时候,新建的脚本都默认继承自Monobehaviour, 所以脚本才有了本身的生命周期函数,如Awake,Start, Update, OnDestroy等。c#
在相应的方法中实现游戏逻辑,引擎会适时调用。函数
而Lua在这里作为c#的一个外延语言,天然是不受Unity管理的。post
不过,在前几篇文章中能看到,在XxxPanel和XxxCtrl中确实又有生命周期的影子,好比在MessagePanel.lua脚本中就存在MessagePanel.Awake和MessagePanel.OnDestroy方法。lua
经过日志打印能知道,这些方法确实在相应的时候被执行了。spa
那他是怎么实现的呢?日志
这里就又要说到LuaBheavour脚本了。code
一、LuaBehaviour是一个c#脚本
LuaBehaviour是一个c#脚本,在XxxPanel预制体被实例化的时候,被添加到了这个对象上,点击每个实例化生成的窗口,都能看到这个脚本的存在。好比咱们以前实现的LoginPanel,见下图:
二、LuaBehaviour脚本的内容
打开这个脚本,能直接看到Awake方法和Star方法数,从方法名称就能猜到这个应该是Monobehaviour的生命周期函数,虽然这个脚本是继承的View。对象
打开View的定义,发现View继承Baseblog
继续打开Base,能直到Base确实继承自MonoBehaviour继承
显而易见的,LuaBehaviour中的Awake和Start是会被引擎调用的。而在Awake和Start中的调用语句:
Util.CallMethod(name, "Awake", gameObject);
Util.CallMethod(name, "Start");
应该就是对Lua脚本XxxPanel中相应函数的调用。
打开Util.CallMethod方法,能看到确实如此。
/// <summary> /// 执行Lua方法 /// </summary> public static object[] CallMethod(string module, string func, params object[] args) { LuaManager luaMgr = AppFacade.Instance.GetManager<LuaManager>(ManagerName.Lua); if (luaMgr == null) return null; return luaMgr.CallFunction(module + "." + func, args); }三、LuaBehaviour是被谁绑定的
LuaFramework实现了不少的管理类,用于C#和Lua的对接工做,好比GameManager、LuaManager、NetworkManager等,以及PanelManager。
在PanelManager里,我找到了用于实例化窗口的方法CreatePanel,也看到了绑定LuaBehaviour的语句。迷题解开。
一、PanelManager实例化窗口的时候,给窗口对象绑定LuaBehaviour脚本;
二、LuaBehaviour脚本中的生命周期函数执行,从而驱动对应的Lua脚本中的生命周期函数执行。
遗留问题:
在XxxPanel中的和XxxCtrl中都存在Awake,那LuaBehaviour中的Awake到底调用的是哪个脚本上的方法呢?
这个应该须要研究一下LuaManager。
持续更新博客的计划老是失败,想了想,也许是前几篇文章都写得太长了吧。
以前每写一篇,都要准备很久,写完老是到半夜,疲惫得不行。致使后来一想到写博,就有畏难情绪,就不想写了。
从这篇开始,每篇少写一点。但愿每周都有输出,不求多,但求坚持。