LuaFramework 第二章 理清加载顺序

研究了一天,大概的把lua的调用过成搞明白了,,参考了一些大佬写的教程,看的很快,总体来说,由于luaframework使用了puremvc的框架设计,使得刚接触框架的新手在初开始理解框架的时候会出现出现看不懂的情况,所以需要有人来帮忙梳理一下流程。

我主要参考了2个人的帖子,有兴趣的可以去看看
我这里就不做过多的解释了,教程里面写的很清晰了
第一个是>https://blog.csdn.net/hyf2713/article/details/51777328
第二个是>https://blog.csdn.net/adambieber/article/details/47402805

想了解的可以去认真看看

这里我就用自己的想法讲诉一下.,来整体一下思路,,有要学习的同学,也可以看看

开始游戏这里写图片描述

这个就像是说明一样,这个脚本就是启动游戏的,这个是游戏的入口,启动框架的
然后跳到 AppFacade(LuaFramework_UGUI-master\Assets\LuaFramework\Scripts\Framework\AppFacade.cs)类里面
这里写图片描述

这是一个单例 StartUp函数里面就一局脚本,sendMessageCommand(),这个方法是Facade脚本里面的方法,用过puremvc的估计都很熟悉,这句是puremvc里面发送命令的(如果你还是不懂,情自行百度)
而这个命令注册正好是在上面 InitFrameWork() 里面的 RegisterCommand(NotiConst.START_UP, typeof(StartUpCommand));

然后程序会运转到StartUpCommand 类里面
这里写图片描述

StartUpCommand类里面的 Execute方法接收到消息 之后是初始化一系列的管理脚本,把相应的脚本添加到物体上面,最后的这句 AppFacade.Instance.AddManager(ManagerName.Game);才是游戏的开始管理脚本 然后,我们看GameManager
这里写图片描述

在OnInitialize方法里面 明显的有doFile的语句,这是运行lua语言的语句,所以从这里程序开始执行lua语言 最先加载的是”Logic/Game” 这个,这是个lua的脚本,放在LuaFramework/Lua/Logic里面,(LuaFramework/Lua这个文件夹是框架中存放lua语言的,)

那么程序就开始转到lua语言里面了,Game.lua是游戏开始的lua脚本,程序运行到这里,先看上面的

require “3rd/pblua/login_pb”
require “3rd/pbc/protobuf”

local lpeg = require “lpeg”

local json = require “cjson”
local util = require “3rd/cjson/util”

local sproto = require “3rd/sproto/sproto”
local core = require “sproto.core”
local print_r = require “3rd/sproto/print_r”

require “Logic/LuaClass”
require “Logic/CtrlManager”
require “Common/functions”
require “Controller/PromptCtrl”
require “Controller/uiCtrl”

–管理器–
Game = {};
local this = Game;

local game;
local transform;
local gameObject;
local WWW = UnityEngine.WWW;

function Game.InitViewPanels()
for i = 1, #PanelNames do
require (“View/”..tostring(PanelNames[i]))
end
end

–初始化完成,发送链接服务器信息–
function Game.OnInitOK()
AppConst.SocketPort = 2012;
AppConst.SocketAddress = “127.0.0.1”;
networkMgr:SendConnect();

--注册LuaView--
this.InitViewPanels();

– this.test_class_func();
– this.test_pblua_func();
– this.test_cjson_func();
– this.test_pbc_func();
– this.test_lpeg_func();
– this.test_sproto_func();
– coroutine.start(this.test_coroutine);

CtrlManager.Init();
local ctrl = CtrlManager.GetCtrl(CtrlNames.PromptCtrl);
if ctrl ~= nil and AppConst.ExampleMode == 1 then
    ctrl:Awake();
end

logWarn('LuaFramework InitOK--->>>');

end

最上面的这些require是加载各个模块的, require “Controller/PromptCtrl”这些是加载puremvc里面作者封装的controller的脚本,(MVC里面的C的脚本)
而下面InitViewPanels里面的 require (“View/”..tostring(PanelNames[i]))是加载作者封装的界面的的脚本,这里是各个要实例化的panel的View脚本
等下再说这两个脚本的问题。这里先说程序的流程
CtrlManager.Init();
local ctrl = CtrlManager.GetCtrl(CtrlNames.PromptCtrl);
if ctrl ~= nil and AppConst.ExampleMode == 1 then
ctrl:Awake();
end
在下面有这几句代码。这里是通过CtrlManager的GetCtrl方法获取到所对应的Controller控制器,然后调用控制器里面的 Awake方法,然后程序走到便会根据你的GetCtrl()的名字获取到对应的lua脚本并去执行其中的Awake方法,这里是转到PromptCtrl.lua (LuaFramework/Lua/Controller)这个脚本里面,然后我们看这个脚本,找到里面的Awake方法(上面的require就不说了)

function PromptCtrl.Awake()
 logWarn("PromptCtrl.Awake--->>");
 panelMgr:CreatePanel('Prompt', this.OnCreate);
end
--启动事件--
function PromptCtrl.OnCreate(obj)
 gameObject = obj;
 transform = obj.transform;
 panel = transform:GetComponent('UIPanel');
 prompt = transform:GetComponent('LuaBehaviour');
 logWarn("Start lua--->>"..gameObject.name);
 prompt:AddClick(PromptPanel.btnOpen, this.OnClick);
 resMgr:LoadPrefab('prompt', { 'PromptItem' }, this.InitPanel);
end

Awake函数里面主要就一个代码 panelMgr:CreatePanel(‘Prompt’, this.OnCreate); 这句代码是调用panelMgr的CreatePanel方法,(这是个lua方法,通过解释器映射到内存的一个 lua函数,这个是在lua Genreate All 的时候自动编译。不过现在 的框架会自动编译)

这句语句调用的是C# 方法 调用的是 PanelManager(LuaFramework/Scripts/Manager) 里面的 CreatePanel方法

     public void CreatePanel(string name, LuaFunction func = null) {
       string assetName = name + "Panel";
       string abName = name.ToLower() + AppConst.ExtName;
       if (Parent.Find(name) != null) return;
       GameObject prefab = ResManager.LoadAsset<GameObject>(name, assetName);
       if (prefab == null) return;
        GameObject go = Instantiate(prefab) as GameObject;
        go.name = assetName;
        go.layer = LayerMask.NameToLayer("Default");
        go.transform.SetParent(Parent);
        go.transform.localScale = Vector3.one;
        go.transform.localPosition = Vector3.zero;
        go.AddComponent<LuaBehaviour>();

        if (func != null) func.Call(go);
        Debug.LogWarning("CreatePanel::>> " + name + " " + prefab);
</php>

然后在这里真正的实例化物体, 其中上面 PromptCtrl 里面的这句panelMgr:CreatePanel(‘Prompt’, this.OnCreate); 后面的这个this. onCreate是这个CreatePanel()的回调,this. onCreate()会在实例化完成后进行调用,然后控制界面的 点击等一系列操作,

到此,,物体实例化完成,创建出来,并通过this. onCreate 这个回调再物理实例化之后对物理进行初始化,UI的话,就添加按钮点击,初始化text等一系列操作。

最后进行显示出来这里写图片描述

新手小白出品,如有写的有问题,请及时告知!

自动生成绑定代码文件,非反射调用 大量内建基础类型支持,如枚举,委托,事件,Type, 数组,迭代器等 支持多种协同形式 支持所有unity内部类导出,支持委托类型导出 支持导出自定义,跳过某个空的基类,修改导出名称等 支持扩展函数自定义导出, 比如DoTween 支持值类型Nullable导出,包括Nullable等 支持Lua中function转委托,可以区分需要不同委托的参数的重载函数 支持c# LuaFunction对象转委托,简化调用方式。 支持无GC的多参数调用形式 支持重载函数自动折叠, 如:Convert.ToUInt32只导出double参数的函数 支持重载函数自动排序, 如:参数个数相同, object参数执行级最低, 不会出现错误匹配情况 支持导出函数重命名, 可以分离导出某个重载函数(可以导出被折叠掉的函数) 支持使用编辑器类改写导出规则 支持this数组访问,索引为int可以通过[]访问,其他可使用.get_Item或者.this:get()访问数组成员 支持委托(事件)+-lua function。支持通过函数接口的Add和Remove委托操作 支持静态反射操作, 形式同c# 支持peer表,可在lua端扩展导出的userdata 支持自定义struct压入和读取,做到无GC,并且结构成员无类型限制, 参考例子24 支持preloading, 可以通过requie后绑定wrap文件 支持int64, uint64 大量的lua数学类型,如Quaternion, Vector3, Mathf等 包含第三方lua扩展,包括luasocket, struct, lpeg, utf8, pb等库 当lua出现异常,能够同时捕获c#端和lua端堆栈,便于调试 print信息,在编辑器点击日志, 能自动打开对应lua文件 支持unity所有版本 支持Lua hook C#相代码实现,一定程度上支持利用Lua代码修改C#端代码的bug(暖更新使用说明)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值