• Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的


    前言

    用c#开发的时候,新建的脚本都默认继承自Monobehaviour, 因此脚本才有了自己的生命周期函数,如Awake,Start, Update, OnDestroy等。

    在相应的方法中实现游戏逻辑,引擎会适时调用。

    而Lua在这里做为c#的一个外延语言,自然是不受Unity管理的。

    不过,在前几篇文章中能看到,在XxxPanel和XxxCtrl中确实又有生命周期的影子,比如在MessagePanel.lua脚本中就存在MessagePanel.Awake和MessagePanel.OnDestroy方法。

    通过日志打印能知道,这些方法确实在相应的时候被执行了。

    那他是怎么实现的呢?

    这里就又要说到LuaBheavour脚本了。

    LuaBehaviour实现的lua脚本生命周期

    1、LuaBehaviour是一个c#脚本

    LuaBehaviour是一个c#脚本,在XxxPanel预制体被实例化的时候,被添加到了这个对象上,点击每一个实例化生成的窗口,都能看到这个脚本的存在。比如我们之前实现的LoginPanel,见下图:

    2、LuaBehaviour脚本的内容

    打开这个脚本,能直接看到Awake方法和Star方法数,从方法名称就能猜到这个应该是Monobehaviour的生命周期函数,虽然这个脚本是继承的View。

     

     打开View的定义,发现View继承Base

    继续打开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);
            }

    3、LuaBehaviour是被谁绑定的

    LuaFramework实现了很多的管理类,用于C#和Lua的对接工作,比如GameManager、LuaManager、NetworkManager等,以及PanelManager。

    在PanelManager里,我找到了用于实例化窗口的方法CreatePanel,也看到了绑定LuaBehaviour的语句。迷题解开。

     总结

    1、PanelManager实例化窗口的时候,给窗口对象绑定LuaBehaviour脚本;

    2、LuaBehaviour脚本中的生命周期函数执行,从而驱动对应的Lua脚本中的生命周期函数执行。

    遗留问题:

    在XxxPanel中的和XxxCtrl中都存在Awake,那LuaBehaviour中的Awake到底调用的是哪一个脚本上的方法呢?

    这个应该需要研究一下LuaManager。

    感悟

    持续更新博客的计划总是失败,想了想,也许是前几篇文章都写得太长了吧。

    之前每写一篇,都要准备好久,写完总是到半夜,疲惫得不行。导致后来一想到写博,就有畏难情绪,就不想写了。

    从这篇开始,每篇少写一点。希望每周都有输出,不求多,但求坚持。

  • 相关阅读:
    js 页面按钮提交后 创建显示loading div 操作完成后 再隐藏或删除 进度div
    [转]利用vertical-align:middle实现在整个页面居中
    IP地址查询
    [转]js 判断js函数、变量是否存在
    [转]RDLC报表格式化format表达式
    [转]不用安装Oracle Client如何使用PLSQL Developer
    [转]使用 YCombo 做 JS /CSS开发 合并 压缩
    [转]jQuery为控件添加水印文字
    [转]DataTable用中使用Compute 实现简单的DataTable数据的统计
    [转]Web性能监控自动化探索之路–初识WebPageTest
  • 原文地址:https://www.cnblogs.com/imteach/p/11161214.html
Copyright © 2020-2023  润新知