直接点击Clone or download ,然后点击download ZIP
我介绍的版本具体是May 21 ,2018版 其他版本的可能不会有我所说的一些毛病出现。
//-------------2018-05-26------------- (1)更新tolua#到May 21, 2018版
一、LuaFramework的资源更新流程如下图:
游戏工程资源目录是在我们点击了Build Window Resources 后 自动对 .../Assets/LuaFramework/Lua下的文件 和 在代码中Packages.es 指定的 打包资源 进行打包 放入 .../Assets/StreamingAssets目录下,若没有这个目录它会自动创建。
这里所说的资源是指 .lua文件 (必须是放入.../Assets/LuaFramework/Lua下的文件),在代码中指定打包的U3D资源。
二、LuaFramework框架打包流程:
Package.cs 类 的BuildWindowsResource方法 是我们扩展到Unity编辑器菜单上的BuildWindowResources功能方法。
这个方法会自动帮我们在工程下创建StreamingAssets文件夹并且将打包的资源放入到该文件夹下。
LuaBundleMode为true时,会将 .../Assets/LuaFramework/Lua下的全部lua文件打包,放入StreamingAssets/Lua文件夹下,
为false时,就不会打包,而是直接拷贝全部lua文件到StreamingAssets/Lua下。
发布出去前,一定要确保LuaBundleMode为true,切记,在编辑模式下,我们都改为false。
改为false的话 我们就不需要每次更新lua代码都必须按Build Window Resources了。
ExampleMode为true时,只会打包框架自带的资源,如果要打包自己的资源,请进入HandleExampleBundle改写里面的方法,其中AddBuildMap是用来添加打包资源的,第一个参数是包名(自定义的,获取的时候需要用到),第二个参数是资源类型,第三个参数是资源所在工程的路径。
注意:AddBuildMap一定要模仿框架自带的去写,不然会出错。
三、LuaFramework框架获取资源方法:
进入ResourceManager.cs方法:
public void LoadPrefab(string abName, string assetName, Action<UObject[]> func) {
LoadAsset<GameObject>(abName, new string[] { assetName }, func);
}
public void LoadPrefab(string abName, string[] assetNames, Action<UObject[]> func) {
LoadAsset<GameObject>(abName, assetNames, func);
}
public void LoadPrefab(string abName, string[] assetNames, LuaFunction func) {
LoadAsset<GameObject>(abName, assetNames, null, func);
}
这3个方法都是可以加载AB包指定资源的。
基本上,第一个参数是包名(带后缀.unity3d)第二个参数是资源名称(预制体名称,可以指定一个数组,意味着从一个包加载多个资源),第三个参数:Action<UObject[]>一个C#无返回值委托方法,传入委托的参数是UObject[]数组,可以理解为是加载出来的预制体数组,加载完资源后会进入这个委托,让它处理一些加载完成后的事情,LuaFunction是Lua那边的方法,它一样也有一个object[]来存储加载出来的预制体,在lua方法上处理。
在lua代码,一般是通过 LuaHelper的GetResManager 来获取ResourceManager 然后调用方法。
详细一点的解释,就是通过这个框架解析出的LuaHelperWrap脚本来调用GetResManager获取ResrouceManager的。
至于为什么,能直接这样获取,可以自己慢慢看框架 ,也许能懂,我就不看了- -。
四、加载面板流程
首先,Main.cs 脚本中在Start里,启动了StartUp,触发了StartUpCommand命令,初始化了全部管理器,其中GameManager是我们要讨论的,它会在Init方法执行CheckExtractResource 该方法会去检查c:/luaframework是否存在(Windows系统才会这样的,其他的会相应地在别的地方检查 我就不说明了)若存在,进入OnUpdateResource方法,它会去检查c:/luaframework下的文件是否与服务器上的文件一样,若不一样,则更新c:/luaframework下的文件为最新文件,更新完了后会直接return,注意下面有一个方法OnExtractResource,这个是相当于 (一)里面说的①操作,即检查c:/luaframework是否存在,若不存在,则不会进入OnUpdateResource方法,而是进入OnExtractResource,去执行解压StreamingAssets下的文件到这个c:/luaframework下。若执行了OnUpdateResource方法,那么会进入OnResourceInited方法,初始化ResourceManager,之后进入GameManager的OnInitialize。
OnInitialize会调用LuaManager的InitStart,其实就是启动Lua框架,Lua入口文件是Main.lua文件,肯定会执行Main.lua文件的Main方法,但是,这不是重点,重点是它还会调用Util.CallMethod("Game", "OnInitOK"); 执行Game.lua的OnInitOK方法。
Game.lua的OnInitOK方法,调用this.InitViewPanels();实现requires View/XxxPanel即引用2个Panel的lua代码 , 调用 CtrlManager.Init();实现了将PromptCtrl和MessageCtrl的创建和保存,它会放入一个叫ctrlList的lua表中,该表在CtrlManager.lua文件,这样,我们就能够通过CtrlManager来根据Ctrl名称获取相应的Ctrl了。在OnInitOK方法中,对PromptCtrl进行了初始化,即Awake方法的调用。在PromptCtrl.lua 的Awake方法中,它会调用PanelManager的CreatePanel方法,指定一个名称和回调方法,注意这个名称千万不要写错,它与我们打包出去的那个PromptPanel预制体有关的,打包时,如果面板预制体名称叫PromptPanel,而且必须是XxxxPanel的形式,必须后面有Panel!!注意了。那么包名,必须叫prompt,不要问我为什么,因为...框架内定的,除非你去改动内定的东西。这样子,我们在CreatePanel那里指定的名称是Prompt,必须写Prompt,不要写错!大小写也不要写错!然后你就创建出了一个PromptPanel了,那个创建时会对这个Panel进行一些位置调整,以及加一个很重要的脚本上去 LuaBehaviour 脚本,之后,它会调用回调方法OnCreate(obj) obj是那个创建出来的面板,我们通过LuaBehaviour的AddClick方法来给PromptPanel的按钮添加点击事件!
疑惑点1:PromptPanel.lua脚本的Awake方法谁调用的?我很仔细地查看所有这一路过来的代码都没发现谁哪个方法调用了它,若没有人调用Awake方法,那么就获取不到Panel的按钮了。
疑惑点2:PromptPanel有UIPanel脚本么?在PromptCtrl.OnCreate方法中,居然去获取这个组件了。
总体流程大致如上,有2个疑惑点 我没有看明白 ,哪位高手看懂了,麻烦 说一下。。。直接写评论告诉下 头晕- -