推荐阅读:
流程图
首先使用流程图将框架的执行顺序大致呈现给大家。为了方便大家对照代码查看,流程图中使用的是函数方法名,右侧紧挨着的是方法对应的脚本文件名;流程图中的三个点代码顺序执行右侧脚本。
项目逻辑分析
为了方便查看,这里将C#脚本和Lua脚本都打开,来看看框架的逻辑,我选用sublime和VS编辑器来分别打开lua和C#代码。
1、首先打开SimpleFramework_UGUI-0.4.1\Assets\Examples\Scenes\Login场景,除了同游的摄像机等外,还有一个名为GlobalGenerator的空物体,上面挂在额一个名为GlobalGenerator.cs脚本,可想而知GlobalGenerator.cs便是我们游戏的入口函数:
通过注释能准确锁定游戏入口为AppFacade.Instance.StartUp();
2、F12进入StartUp查看函数具体定义,F12进入SendMessageCommand,里面有SendMessageCommand的方法定义,也有RegisterCommand方法的定义。
理解了SendMessageCommand和RegisterCommand方法,从下图中我们就能理解代码的意思了,首先为NotiConst.START_UP注册了一个StartUpCommand类型的命令,然后在StartUp函数中发送了NotiConst.START_UP命令,目的是执行操作。
3、F12进入StartUpCommand中
图中的操作是为GlobalGenerator游戏物体添加AppView脚本组件,然后为其添加一系列的管理器脚本。这里我们主要分析GameManager脚本。
4、OnResourceInited函数的作用。
上面代码首先执行了Network,lua和GameManager.lua脚本。
接着调用了CallMethod,我们使用F12一直追踪,定位到如下函数:
通过这个函数分析发现:object[] panels = CallMethod(“LuaScriptPanel”);这句代码是在执行logic\GameManager.lua中的LuaScriptPanel方法,因此,我们又转到GameManager.lua中,分析LuaScriptPanel方法的作用:
结合GameManager.c和上面的代码可以看出,这里返回的是需要加载的场景面板对应的名字数组,但是统一去掉了面板名字的Panel字段,因为在C#下面的代码中查找时自动添加了该字段。
由上图我们可以看出获取到面板名字后又执行了View下对应名字的lua代码:
执行完所有的View下对应的name+Panel.lua代码,程序又回到了C#代码,此时C#代码又执行了OnInitOK,该方法位于GameManager.lua下
除去一些网络连接操作,又执行了两个Awake方法,跟踪到startCtrl.lua中:
这里Awake执行了PanelManager.cs中的CreatePanel方法:
CreatePanel方法开启了一个协成来实例化一个面板,并设置位置父节点等。
当实例化对象并设置完成后又回到lua代码中执行回调方法OnCreate,为面板中的组件添加点击事件