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

版本:unity 5.4.1  语言:C#

 

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

 

首先吐槽一番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)

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

 

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

function ImageCtrl.SetActive(act)
	print(type(act))
	gameObject:SetActive(act[0])
end

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

 

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


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值