Unity 3D ULua 基于UGUI的初次使用的心得与体会

发表于2017-11-06
评论0 4.4k浏览

刚进官网的时候就注意到了,ULua这个框架是国人写的,使用的时候各种中文注释也是倍感亲切,作者还提供了视频、例子、各种提醒,生怕使用者不会用。

 

首先吐槽一番Lua吧,我觉得这个语言是最逗逼的语言,index从1开始、:使用成员方法、.使用静态方法、 boolean的一个值传进去变成个table...当然在做手游的时候早就体验了它的坑爹之处。

 

但是做热更新,它基本是不二的选择,然后我记录一下如何用github上作者提供的框架新建和销毁一个UI。

 

如果使用的是5.4.1版本,一开始就会遇到一个错误:



然后往上看:

  1. #if UNITY_5_3_x  
  2. using UnityEngine.SceneManagement;  
  3. #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的名字,以便资源打包:

  1. AddBuildMap("message"   AppConst.ExtName, "*.prefab""Assets/LuaFramework/Examples/Builds/Message");  
  2. AddBuildMap("image"   AppConst.ExtName, "*.prefab""Assets/LuaFramework/Examples/Builds/Image");  

然后在Lua文件夹下新建Controller、View的lua文件:



5.Lua框架中添加自己的Lua文件的注册信息。

CtrlManager.lua文件:

  1. require "Controller/ImageCtrl"  
  2. ctrlList[CtrlNames.Image] = ImageCtrl.New();  

define.lua文件:

  1. CtrlNames = {  
  2.     Prompt = "PromptCtrl",  
  3.     Message = "MessageCtrl",  
  4.     Image = "ImageCtrl"  
  5. }  
  6.   
  7. PanelNames = {  
  8.     "PromptPanel",    
  9.     "MessagePanel",  
  10.     "ImagePanel"  
  11. }  

6.编写View和Controller,直接放代码吧:

  1. --ImagePanel.lua  
  2. local transform;  
  3. local gameObject;  
  4.   
  5. ImagePanel = {};  
  6. local this = ImagePanel;  
  7.   
  8. function ImagePanel.Awake(obj)  
  9.     gameObject = obj  
  10.     transform = obj.transform  
  11.     print("ImagePanel.Awake")  
  12. end  
  13.   
  14. function ImagePanel.OnDestroy()  
  15.     print("ImagePanel.OnDestroy")  
  16. end  
  17.   
  18. --ImageCtrl  
  19. require "Common/define"  
  20.   
  21. ImageCtrl = {};  
  22. local this = ImageCtrl;  
  23.   
  24. local gameObject;  
  25. local transform;  
  26.   
  27. function ImageCtrl.New()  
  28.     print("ImageCtrl.New")  
  29.     return this  
  30. end  
  31.   
  32. function ImageCtrl.Awake()  
  33.     print("ImageCtrl.Awake")  
  34.     panelMgr:CreatePanel('Image', this.OnCreate)  
  35. end  
  36.   
  37. function ImageCtrl.OnCreate(obj)  
  38.     print("ImageCtrl.OnCreate")  
  39.     gameObject = obj  
  40.     transform = obj.transform  
  41. end  
  42.   
  43. function ImageCtrl.Close()  
  44.     print("ImageCtrl.Close")  
  45.     panelMgr:ClosePanel(CtrlNames.Image)  
  46. end  

7.此时生成资源包,再运行不会报错,但是也没有效果,因为程序中没有控制生成该UI,想要生成,去看一下Game.lua,我仿造了一发:

  1. local imageCtrl = CtrlManager.GetCtrl(CtrlNames.Image)  
  2. if imageCtrl ~= nil then  
  3.     imageCtrl:Awake()  
  4. end  

这样生成资源包再运行,就能看到自己的prefab出现在GuiCamera的下面了。

 

8.不过有个错误的啦,你想销毁该UI,然后调用了imageCtrl:Close(),但是并没有什么卵用,这是应该是BUG,这里把ImageCtrl中的Close函数改成下面的写法就好:

  1. function ImageCtrl.Close()  
  2.     print("ImageCtrl.Close")  
  3.     panelMgr:ClosePanel("Image")  
  4. end  

效果,按照下面Debug信息创建后销毁了自己的UI:



9.最后提一个函数传递的小坑:

  1. function ImageCtrl.SetActive(act)  
  2.     print(type(act))  
  3.     gameObject:SetActive(act)  
  4. end  

我写了以上方法,想使用一下代码控制UI的显示隐藏:

  1. local b = false  
  2. print(type(b))  
  3. imageCtrl:SetActive(b)  
来自:http://blog.csdn.net/u012632851/article/details/62424511

大家也看到了我写的type(b)了,传递之前b是boolean,然后传递后就成了table型了。我有点印象,我去年也遇到过这个问题。

 

改正方法就是改一下SetAcitve这个方法:

  1. function ImageCtrl.SetActive(act)  
  2.     print(type(act))  
  3.     gameObject:SetActive(act[0])  
  4. end  

通过以上的学习和探索,我对ULua也有了个大体的把握,这个框架很棒,市面上要做热更新的手游基本上都用这个框架,所以深入学习一下Lua和该框架就很有必要。

 

不过我暂时入个门,有需要再说。书也看得差不多了,接下来我准备学习Shader和数值分析。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引