UE4页面管理

关卡

Level 分为主Level和子Level,主Level就是Scene, 子Level 应用其他页面3D场景需要或者是LevelStreamLevel加载配置
Level创建出来需要绑定一个主页面,主页面会放在ViewList的第一层,ViewList是来存储二级界面的数据对象

页面

Page 分为MainPage, FuncPage,LitePage;Page属于Scene的子元素
MainPage(一级界面)比如战斗界面的手操面板,世界主界面的手操面板,和Level 紧密联系在一起,共生共存;该面板存储在ViewList的首位
FuncPage(二级界面)比如点击主界面的仓库按钮,进入仓库界面,仓库界面就属于二级界面,该面板对象会放置在ViewList的里;
LitePage(三级界面)比如点击仓库界面,弹出装备详情面板等,该面板会放在二级界面里LiteList里; 三级界面为最小的页面单位;

区分二级界面和三级界面

一般是模块的主界面定义为二级界面,在二级界面上的操作弹出的界面就是三级界面,三级界面一般可以认为为内容比较简单的非全屏弹出页面,比如弹出框;比如:点击英雄按钮进入英雄列表界面,英雄列表界可以定义为二级界面,点击英雄,进入英雄主界面,也是二级界面,点击英雄装备界面,也是二级界面,点击装备详情界面的Icon弹出物品详情,就定义为三级界面,具体看页面的内容的定义;

相互关系

1.一级界面的Show和Hide 会受到仅仅会受到二级界面的影响,二级界面可以相互响应Hide和Over, 三级界面仅可以影响二级界面的数据和UI的刷新
2.Level的切换回影响所有的页面,所有的页面都会执行Over;

PageEnum.lua
--页面生命状态
PageActive =
{
    Ctor    = "Ctor",
    Over    = "Over",
    Show    = "Show",
    Hide    = "Hide",
}
PageActive = Enum("PageActive", PageActive)

--页面类型
PageCellType =
{
    MainPage     = "MainPage",    --一级界面
    FuncPage     = "FuncPage",    --二级界面 
    LitePage     = "LitePage",    --三级界面
}
PageCellType = Enum("PageCellType", PageCellType)

--页面路径组成
PagePathPart =
{
    PathPrefix     = "Game.View.Ctrl.",    
    PathSuffix     = "Ctrl",    
}
PagePathPart = Enum("PagePathPart", PagePathPart)

--页面指令
PageActionType =
{   
    Nothing      = "Nothing", 
    HideLastPage = "HideLastPage", 
    OverLastPage = "OverLastPage",
    DelLastPage  = "DelLastPage",
}
PageAction = Enum("PageActionType", PageActionType)
PageCore.lua
require "Game.View.PageEnum"
local PageScene = require "Game.View.PageScene"
local PageCore = {}

PageCore.LoginScene = "Page01Scene"
PageCore.HomeScene = "Page02Scene"

function PageCore:Ctor()
    self.SceneList      = {} --仅存儲场景界面
    self.CurScene       = false               
    self.CurView        = false 
    self.CurLite        = false       
    self.CurPath        = ""
end

function PageCore:Destroy()
end

function PageCore:EnterScene(SceneName, CtorArgs)
    if self.CurScene and self.CurScene.SceneName == SceneName then
        PrintTrace("Page:The current scene is already open !")
        return 
    end

    if SceneName == PageCore.LoginScene then
        self:__PushScene(SceneName, CtorArgs)
    else
        self:__DestoryCurScene()
        SceneMgr:OpenScene(SceneName, function() 
            self:__PushScene(SceneName, CtorArgs)
        end)
    end
end

function PageCore:BackScene()
    if #self.SceneList == 1 then
        PrintTrace("Page:A scene must be kept in the game !")
        return
    end
    self:__PopScene()

    local SceneName = self.SceneList[#self.SceneList].SceneName
    SceneMgr:OpenScene(SceneName, function() 
        self.CurScene = self.SceneList[#self.SceneList]
        self.CurView = self.CurScene:GetTopView()
        self.CurView:ReOpenView()
        self:PrintPath()
    end)
end

function PageCore:GoHomeScene()
    for Index, SceneObj in pairs(self.SceneList) do
        SceneObj:Destroy()
    end
    self.SceneList = {}
    self.CurScene  = false               
    self.CurView   = false 
    self.CurLite   = false 
    self:EnterScene(PageCore.HomeScene)
end

function PageCore:OpenView(ViewName, CtorArgs, PageType, PageAction)
    PageAction = PageAction or PageActionType.Nothing
    if self.CurScene:IsViewOpened(ViewName) then
        PrintTrace(string.format("Page: %s have been Opened !", ViewName))
        return 
    end
    local CurView = self.CurScene:PushView(ViewName, CtorArgs, PageType, PageAction)
    if PageType == PageCellType.LitePage then
        self.CurLite = CurView
    else
        self.CurView = CurView
    end
    self:PrintPath()
end

function PageCore:BackView()
    local CurView = self.CurScene:PopView()
    if CurView then
        if CurView.PageType == PageCellType.LitePage then
            self.CurLite = CurView
            self.CurLite:ReOpenView()
        else
            self.CurView = CurView
            self.CurView:ReOpenView()
        end
    else
        self.CurScene:GetTopView():ReOpenView()
        PrintTrace("Page: A page must be kept in the scene!")
    end
    self:PrintPath()
end

function PageCore:PrintPath(OutTag)
    if OutTag == nil then OutTag = "" end
    PrintTrace("<<------PageStack BGN-------->>"..OutTag)
    PrintTrace(self.SceneList)
    PrintTrace("<<------PageStack END-------->>"..OutTag)
end

function PageCore:__PushScene(SceneName, CtorArgs)
    self.CurScene = NewClass(PageScene):Init(SceneName, CtorArgs)
    table.insert(self.SceneList, self.CurScene)
    self.CurView = self.CurScene:GetTopView()
    self:PrintPath()
end

function PageCore:__DestoryCurScene()
    if self.CurScene then
        self.CurScene:Destroy()
    end
end

function PageCore:__PopScene()
    local PopScene = table.remove(self.SceneList)
    PopScene:Destroy()
    PopScene = nil
end

PageCore = RegisterClass("PageCore", PageCore, ClassObject)
return PageCore
PageScene.lua
local PageScene = {}
local PageView  = require "Game.View.PageView"

function PageScene:Ctor()
    self.SceneName      = ""
    self.ViewList       = {} --仅存儲2級界面
    self.State          = PageActive.Ctor
end

function PageScene:Destroy()
    for Index, ViewObj in pairs(self.ViewList) do
        ViewObj:Destroy()
    end
end

function PageScene:Init(SceneName, CtorArgs)
    self.ViewList  = {}
    self.SceneName = SceneName
    local LiteName = string.gsub(SceneName, "Scene", "")
    table.insert(self.ViewList, NewClass(PageView):Init(LiteName, CtorArgs, PageCellType.MainPage))
    return self
end

function PageScene:PushView(ViewName, CtorArgs, PageType, PageAction)
    self.ViewList[#self.ViewList]:UpdateActive(PageAction)
    if PageAction == PageActionType.DelLastPage then
        table.remove(self.ViewList):Destroy()
    end
    --
    local CurView = NewClass(PageView):Init(ViewName, CtorArgs, PageType)
    if PageType == PageCellType.LitePage then
        self.ViewList[#self.ViewList]:PushView(CurView)
    else
        table.insert(self.ViewList, CurView)
    end
    return CurView
end

function PageScene:PopView()
    local CurView = nil
    local ViewCell = #self.ViewList
    CurView = self.ViewList[ViewCell]
    if ViewCell > 1 then
        if CurView:PopView() then
            local LiteView = CurView:GetTopView()
            if LiteView then
                return LiteView
            else
                return CurView
            end
        else
            local CloseView = table.remove(self.ViewList)
            CloseView:Destroy()
            CloseView = nil
            return self.ViewList[#self.ViewList]
        end
    elseif ViewCell == 1 then
        if CurView:PopView() then
            local LiteView = CurView:GetTopView()
            if LiteView then
                return LiteView
            else
                return nil
            end
        else
            return nil
        end
    else
        error("Page:There is at least one element in the viewlist !")
    end
end

function PageScene:IsViewOpened(ViewName)
    for Index, ViewObj in pairs(self.ViewList) do
        if ViewObj.ViewName == ViewName then
            return true
        end
    end
    return false
end

function PageScene:GetTopView()
    return self.ViewList[#self.ViewList]
end

PageScene = RegisterClass("PageScene", PageScene, ClassObject)
return PageScene
PageView.lua
local PageView = {}

function PageView:Ctor()
    self.ViewName       = ""
    self.PageType       = ""
    self.ViewId         = false
    self.CtorArgs       = false
    self.LiteList       = {}--仅存儲三級界面
    self.State          = PageActive.Ctor
end

function PageView:Init(ViewName, CtorArgs, PageType)
    self.ViewName       = ViewName
    self.CtorArgs       = CtorArgs or false
    self.PageType       = PageType

    if PageType == PageCellType.LitePage then
        self.ViewId     = ViewMgr:AddMultiView(ViewName, CtorArgs)
    else
        ViewMgr:AddSingleView(ViewName, CtorArgs)
    end
    return self
end

function PageView:Destroy()
    self:__Over()
end

function PageView:ReOpenView()
    if self.State == PageActive.Over then
        self:__ReOpen()
    elseif self.State == PageActive.Hide then
        self:__Show()
    elseif self.State == PageActive.Ctor then
        PrintTrace("Page: No need to reopen the page!")
    end

end

function PageView:PushView(LiteView)
    table.insert(self.LiteList, LiteView)
end

function PageView:PopView()
    if #self.LiteList > 0 then
        table.remove(self.LiteList):Destroy()
        return true
    else
        return false
    end
end

function PageView:UpdateActive(PageAction)
    if PageAction == PageActionType.HideLastPage then
        self:__Hide()
        return
    end
    if PageAction == PageActionType.OverLastPage or PageActionType.DelLastPage then
        self:__Over()
        return
    end
end

function PageView:GetTopView()
    if #self.LiteList > 0 then
        return self.LiteList[#self.LiteList]
    else
        return nil
    end
end

function PageView:__Hide()
    if self.PageType == PageCellType.LitePage then
        ViewMgr:HideMultiView(self.ViewId)
    else
        ViewMgr:HideSingleView(self.ViewName)
    end
    self.State = PageActive.Hide

    for Index, ViewObj in pairs(self.LiteList) do
        ViewObj:__Hide()
    end
end

function PageView:__Show()
    if self.PageType == PageCellType.LitePage then
        ViewMgr:ShowMultiView(self.ViewId)
    else
        ViewMgr:ShowSingleView(self.ViewName)
    end
    self.State = PageActive.Show

    for Index, ViewObj in pairs(self.LiteList) do
        ViewObj:__Show()
    end
end

function PageView:__ReOpen()
    if self.PageType == PageCellType.LitePage then
        self.ViewId = ViewMgr:AddMultiView(self.ViewName, self.CtorArgs or nil)
    else
        ViewMgr:AddSingleView(self.ViewName, self.CtorArgs or nil)
    end
    self.State = PageActive.Ctor

    for Index, ViewObj in pairs(self.LiteList) do
        ViewObj:__ReOpen()
    end
end

function PageView:__Over()
    if self.PageType == PageCellType.LitePage then
        ViewMgr:RemoveMultiView(self.ViewId)
    else
        ViewMgr:RemoveSingleView(self.ViewName)
    end
    self.State = PageActive.Over

    for Index, ViewObj in pairs(self.LiteList) do
        ViewObj:__Over()
    end
end

PageView = RegisterClass("PageView", PageView, ClassObject)
return PageView
SceneMgr .lua
SceneMgr = {}

function SceneMgr:Ctor()
    self.CallBack = 0
end

function SceneMgr:Destroy()
end

function SceneMgr:OpenScene(MapName, CallBack)
    self.CallBack = CallBack
    CSceneMgr.Instance():OpenScene(MapName)
end

function SceneMgr:LoadComplete(MapPath)
    self.CallBack()
end

SceneMgr = RegisterClass("SceneMgr", SceneMgr, ClassObject)
SceneMgr = NewClass(SceneMgr)
return SceneMgr
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容