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。
感悟
持续更新博客的计划总是失败,想了想,也许是前几篇文章都写得太长了吧。
之前每写一篇,都要准备好久,写完总是到半夜,疲惫得不行。导致后来一想到写博,就有畏难情绪,就不想写了。
从这篇开始,每篇少写一点。希望每周都有输出,不求多,但求坚持。
Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的的更多相关文章
- Unity3D热更新之LuaFramework篇[05]--Lua脚本调用c#以及如何在Lua中使用Dotween
在上一篇文章 Unity3D热更新之LuaFramework篇[04]--自定义UI监听方法 中,我对LuaBehaviour脚本进行了扩展,添加了两个新的UI监听方法,也提到最好能单写一个脚本处理此 ...
- Unity3D热更新之LuaFramework篇[07]--怎么让unity对象绑定Lua脚本
前言 在上一篇文章 Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的 中,我分析了由LuaBehaviour来实现lua脚本生命周期的方法. 但在实际使用中 ...
- Unity3D热更新之LuaFramework篇[10]--总结篇
背景 19年年初的时候,进到一家新单位,公司正准备将现有的游戏做成支持热更的版本.于是寻找热更方案的任务就落在了我头上. 经过搜索了解,能做Unity热更的方案是有好几种,但是要么不够成熟,要么不支持 ...
- Unity3D热更新之LuaFramework篇[02]--用Lua创建自己的面板
在上篇文章 Unity3D热更新之LuaFramework篇[01]--从零开始 中,我们了解了怎么获得一个可用的LuaFramework框架. 本篇将我会先介绍一下如何配置Lua开发环境,然后分析在 ...
- Unity3D热更新之LuaFramework篇[03]--prefab加载和Button事件
在上一篇文章 Unity3D热更新之LuaFramework篇[02]--用Lua创建自己的面板 中,我介绍了LuaFramework加载面板的方法,但这个方法并不适用于其它Prefab资源,在这套框 ...
- Unity3D热更新之LuaFramework篇[09]--资源热更新与代码热更新的具体实现
前言 在上一篇文章 Unity3D热更新之LuaFramework篇[08]--热更新原理及热更服务器搭建 中,我介绍了热更新的基本原理,并且着手搭建一台服务器. 本篇就做一个实战练习,真正的来实现热 ...
- Unity3D热更新之LuaFramework篇[04]--自定义UI监听方法
时隔一个多月我又回来啦! 坚持真的是很难的一件事,其它事情稍忙,就很容易说服自己把写博客的计划给推迟了. 好在终于克服了自己的惰性,今天又开始了. 本篇继续我的Luaframework学习之路. 一. ...
- Unity3D热更新之LuaFramework篇[08]--热更新原理及热更服务器搭建
前言 前面铺垫了这么久,终于要开始写热更新了. Unity游戏热更新包含两个方面,一个是资源的更新,一个是脚本的更新. 资源更新是Unity本来就支持的,在各大平台也都能用.而脚本的热更新在iOS平台 ...
- Unity3D热更新之LuaFramework篇[01]--从零开始
前言 因工作关系,需要对手头的项目进行热更新支持.了解后发现,Lua的几个变种:XLua.ToLua(原uLua)和Slua都可以做Unity热更,而ToLua更是提供了一个简易的热更框架--LuaF ...
随机推荐
- 关于 Swift 中的 Array.contains 方法
Swift 2.0 中对语言进行了又一次的改进,这次将整个语言变得更加面向对象化,比如在 Swift 1.x 中如果要判断某个元素是否在数组中,就需要用到 contains 函数: if contai ...
- 带参跳转其他controller
public class GoToOtherController : Controller { public ActionResult Index() { var vm = new GetValueF ...
- WPF利用VisualTreeHelper遍历寻找对象的子级对象或者父级对象
原文:WPF利用VisualTreeHelper遍历寻找对象的子级对象或者父级对象 简介 本文将完整叙述我利用VisualTreeHelper实现题述功能的全部过程,想直接看函数实现的朋友可以跳到函数 ...
- MeasureOverride 和 ArrangeOverride
原文:MeasureOverride 和 ArrangeOverride FrameworkElement.MeasureOverride方法实现当在派生类中重写时,测量子元素在布局中所需的大小,然后 ...
- laravel在wamp中输入地址后总是无法访问
在wamp中的apache中conf的httpd.conf #LoadModule rewrite_module modules/mod_rewrite.so 改为 LoadModule rewrit ...
- comtextMenu 如何正确的响应MouseLeave事件
今天给菜单加上这个事件,发现弹出菜单后 鼠标怎么动都不会触发 mouseLeave事件 解决方法是 在菜单loaded事件中,利用visualTreeHelper 访问他内部的border控件,把这个 ...
- WPF svg 转 xmal
原文:WPF svg 转 xmal 今天wpf里面要用矢量图,美工出的是svg格式的,需要将svg格式的转换为xaml 1.第一个尝试是安装Inkscape,这个软件可以直接将svg另存为xaml,但 ...
- 深入浅出RPC——浅出篇 深入篇
本文转载自这里是原文 近几年的项目中,服务化和微服务化渐渐成为中大型分布式系统架构的主流方式,而 RPC 在其中扮演着关键的作用. 在平时的日常开发中我们都在隐式或显式的使用 RPC,一些刚入行的程序 ...
- WPF判断两个PNG图片是否碰撞
这个方法有几个前提 1.两个Image必须在一个Canvas中 2.两个Image的Canvas.Top和Canvas.Left必须赋值 上一篇讲了判断一个PNG图片某个点是否透明 这个基本类似的方法 ...
- 《C标准库》阅读笔记
<assert.h>的断言函数适合于用来调试,实际产品中难以使用. #define NDEBUG 可禁用断言. #undef NDEBUG 可打开断言. 我自己写的一个例子: #inclu ...




