在我开发的手游中,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 框架全部代码:

luaCore.zip

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐