刚进官网的时候就注意到了,ULua这个框架是国人写的,使用的时候各种中文注释也是倍感亲切,作者还提供了视频、例子、各种提醒,生怕使用者不会用。
首先吐槽一番Lua吧,我觉得这个语言是最逗逼的语言,index从1开始、:使用成员方法、.使用静态方法、 boolean的一个值传进去变成个table...当然在做手游的时候早就体验了它的坑爹之处。
但是做热更新,它基本是不二的选择,然后我记录一下如何用github上作者提供的框架新建和销毁一个UI。
如果使用的是5.4.1版本,一开始就会遇到一个错误:
然后往上看:
- #if UNITY_5_3_x
- using UnityEngine.SceneManagement;
- #endif
把#if和#endif这两行删除就好,还是需要引入UnityEngine.SceneManagement才行。
还有就是ToLua的第二个例子:
里面文件的路径有点问题改一下就好。
接下来我来介绍一下这个框架的操作思路:
1.菜单栏Lua -> Generate All,将C# UnityEngine的一些系统类(GameObject、Camera、Light等)生成接口,提供给lua使用,这个步骤导入框架时应该会提醒你生成。生成的文件所在位置:ToLua/Source/Generate。
2.自己的文件也想提供给lua的,在Editor文件夹下有个CustomSetting类,仿造里面写就好了。
3.生成lua资源包,点开Scenes下的main场景,再点击菜单栏LuaFramework -> Build Windows Resource就能生成资源包,运行之后就可以看到该例子通过lua文件生成的UI了。
4.自己用lua文件生成UI,其实照着例子去找关键的地方就好。我提一下关键的点,首先,在Builds下新建个文件夹,再在里面建立一个UGUI的prefab,要求以Panel结尾:
其次,在Packager类中提供prefab的名字,以便资源打包:
- AddBuildMap("message" AppConst.ExtName, "*.prefab", "Assets/LuaFramework/Examples/Builds/Message");
- AddBuildMap("image" AppConst.ExtName, "*.prefab", "Assets/LuaFramework/Examples/Builds/Image");
然后在Lua文件夹下新建Controller、View的lua文件:
5.在Lua框架中添加自己的Lua文件的注册信息。
CtrlManager.lua文件:
- require "Controller/ImageCtrl"
- ctrlList[CtrlNames.Image] = ImageCtrl.New();
define.lua文件:
- CtrlNames = {
- Prompt = "PromptCtrl",
- Message = "MessageCtrl",
- Image = "ImageCtrl"
- }
-
- PanelNames = {
- "PromptPanel",
- "MessagePanel",
- "ImagePanel"
- }
6.编写View和Controller,直接放代码吧:
- --ImagePanel.lua
- local transform;
- local gameObject;
-
- ImagePanel = {};
- local this = ImagePanel;
-
- function ImagePanel.Awake(obj)
- gameObject = obj
- transform = obj.transform
- print("ImagePanel.Awake")
- end
-
- function ImagePanel.OnDestroy()
- print("ImagePanel.OnDestroy")
- end
-
- --ImageCtrl
- require "Common/define"
-
- ImageCtrl = {};
- local this = ImageCtrl;
-
- local gameObject;
- local transform;
-
- function ImageCtrl.New()
- print("ImageCtrl.New")
- return this
- end
-
- function ImageCtrl.Awake()
- print("ImageCtrl.Awake")
- panelMgr:CreatePanel('Image', this.OnCreate)
- end
-
- function ImageCtrl.OnCreate(obj)
- print("ImageCtrl.OnCreate")
- gameObject = obj
- transform = obj.transform
- end
-
- function ImageCtrl.Close()
- print("ImageCtrl.Close")
- panelMgr:ClosePanel(CtrlNames.Image)
- end
7.此时生成资源包,再运行不会报错,但是也没有效果,因为程序中没有控制生成该UI,想要生成,去看一下Game.lua,我仿造了一发:
- local imageCtrl = CtrlManager.GetCtrl(CtrlNames.Image)
- if imageCtrl ~= nil then
- imageCtrl:Awake()
- end
这样生成资源包再运行,就能看到自己的prefab出现在GuiCamera的下面了。
8.不过有个错误的啦,你想销毁该UI,然后调用了imageCtrl:Close(),但是并没有什么卵用,这是应该是BUG,这里把ImageCtrl中的Close函数改成下面的写法就好:
- function ImageCtrl.Close()
- print("ImageCtrl.Close")
- panelMgr:ClosePanel("Image")
- end
效果,按照下面Debug信息创建后销毁了自己的UI:
9.最后提一个函数传递的小坑:
- function ImageCtrl.SetActive(act)
- print(type(act))
- gameObject:SetActive(act)
- end
我写了以上方法,想使用一下代码控制UI的显示隐藏:
- local b = false
- print(type(b))
- imageCtrl:SetActive(b)
来自:http://blog.csdn.net/u012632851/article/details/62424511
大家也看到了我写的type(b)了,传递之前b是boolean,然后传递后就成了table型了。我有点印象,我去年也遇到过这个问题。
改正方法就是改一下SetAcitve这个方法:
- function ImageCtrl.SetActive(act)
- print(type(act))
- gameObject:SetActive(act[0])
- end
通过以上的学习和探索,我对ULua也有了个大体的把握,这个框架很棒,市面上要做热更新的手游基本上都用这个框架,所以深入学习一下Lua和该框架就很有必要。
不过我暂时入个门,有需要再说。书也看得差不多了,接下来我准备学习Shader和数值分析。