unity手游开发- 使用lua 管理UI 的框架
在我开发的手游中,UI 模块 我使用的是lua 来管理的在UI 预制体上面我们没有使用任何C# 代码来处理如下:预制体加载 - 更新 - 操作UI - UI事件等 关乎到UI上的都在lua中处理首先定义一个全局表GlobalNS = {} ,再编写一个基类 Class.lua 利用lua 的元表 setmetatablelocal Class = function (super)local cla
在我开发的手游中,UI 模块 我使用的是lua 来管理的
在UI 预制体上面我们没有使用任何C# 代码来处理如下:
预制体加载 - 更新 - 操作UI - UI事件等 关乎到UI上的都在lua中处理
首先定义一个全局表GlobalNS = {} ,再编写一个基类 Class.lua 利用lua 的元表 setmetatable
local Class = function (super)
local classType = {}
classType.ctor = false
classType.super = super
classType.__index = classType
classType.dataType = "Class"
if super then
setmetatable(classType, super)
end
return classType
end
GlobalNS["Class"] = Class
return Class
静态类
local StaticClass = function (...)
local classType = {}
classType.dataType = "Class"
return classType
end
GlobalNS["StaticClass"] = StaticClass
return StaticClass
基类已构造完成,这里需要写一个new 方法INew.lua
INew = {}
function INew:new(o)
o = o or {}
o.super = self
setmetatable(o,self)
self.__index = self
return o
end
内存分配管理代码一个非常重要的lua 文件
– 内存分配
local new = function (cls, ...)
local instance = {};
instance.dataType = "Instance";
instance.clsCode = cls;
setmetatable(instance, cls);
do
local create;
create = function(cls, ...)
if cls.super then
create(cls.super, ...);
end
if cls.ctor then
cls.ctor(instance, ...);
end
end
create(cls, ...);
end
return instance;
end
GlobalNS["new"] = new;
-- 删除空间
local delete = function (pThis)
pThis:dtor();
end
GlobalNS["delete"] = delete;
return GlobalNS;
到这一步 我们就开始写lua UI 基本类GObject,
GObject.lua
local M = GlobalNS.Class()
M.clsName = "GObject"
GlobalNS[M.clsName] = M
return M
lua 解释器代码
local M = GlobalNS.StaticClass()
M.clsName = "ClassLoader"
GlobalNS[M.clsName] = M
local this = M
function M.ctor()
end
function M.dtor()
end
function M.loadClass(path)
return require(path)
end
function M.unloadClass(path)
package.loaded[path] = nil
end
M.ctor()
return M
在GObject 的基础上编写派生类Form.lua
local M = GlobalNS.Class(GlobalNS.GObject)
M.clsName = "Form"
GlobalNS[M.clsName] = M
function M:ctor(...)
self.m_guiWin = nil -- 自己的 GameObject 根节点
self.m_id = 0 -- 自己的 Id
self.m_bExit = true; -- 点击返回按钮的时候退出还是隐藏
self.m_bReady = false; -- 是否 onReady 函数被调用
self.m_bVisible = false;
self.m_data = ...;
self.isInStack=false; --是否在栈内
self.isExitDestroy=false; --是否关闭就销毁
self.m_CanvasGroup = nil
end
function M:dtor()
end
-- 加载
function M:load()
end
-- 显示
function M:show()
GMC.m_uiMgr:showForm(self.m_id)
end
-- 加载并显示
function M:loadAndShow(data)
GMC.m_uiMgr:loadAndShow(self.m_id, data)
end
-- 隐藏
function M:hide()
GMC.m_uiMgr:hideForm(self.m_id)
end
function M:hideOther(id)
GMC.m_uiMgr:hideForm(id)
end
--销毁
function M:destroty( )
GMC.m_uiMgr:exitDestoryForm(self.m_id)
end
-- 退出
function M:exit()
self:onExit()
if self.isExitDestroy then
self:destroty()
else
self:hide()
end
end
-- 构造完成就立马调用
function M:onInit()
end
-- 资源加载完成立马调用
function M:onReady()
self.m_bReady = true
end
-- 每一次显示调用
function M:onShow()
self.m_bVisible = true;
local curIdName = GlobalNS.UIFormIDToName[self.m_id]
EventManager.Dispatch(GlobalsConst.GuideEventID.UIFormOpen,{openUIName = curIdName })
end
-- 每一次隐藏调用
function M:onHide()
self.m_bVisible = false;
end
-- 每一次退出调用
function M:onExit()
self.m_bReady = false;
end
function M:setExitDestroy(exitDestroy)
self.isExitDestroy = exitDestroy;
end
function M:isReady()
return self.m_bReady;
end
function M:isInStack()
return self.isInStack;
end
function M:isVisible()
return GlobalNS.UtilApi.IsActive(self.m_guiWin);
end
function M:setData(data)
self.m_data = data -- 这个是 UI 功能数据数据
end
-- 点击关闭按钮
function M:onCloseBtnClick()
if(self:isVisible()) then
if(self.isExitDestroy) then
self:destroty();
else
self:hide();
end
end
end
return M
Form.lua 中涵盖了管理UI 界面中的绝大部分代码,可以这样理解
ctor() – 定义变量
dtor() – 删除操作
load() – 加载
show() ,loadAndShow(),hide(),hideOther(),destroty()-- 添加调用接口
exit() --退出
onInit() – 加载出来初始化一次,只会调用一次 类似 mono中 Start()
onShow() – 每次展示都会调用 -用于每次打开时更新UI内部显示
onHide() – 每次隐藏调用
lua 管理UI 框架全部代码:
更多推荐
所有评论(0)