1.新手系统的功能是除了配置之外独立于活动的?
ActivitySystem 提供了活动时间、活动 ID、部分数据和通用拍脸打开能力;但新手奖励如何组合页签、显示入口、判断奖励状态、展示主界面,是 NoviceReward 自己管理的。
新手奖励在业务归属、入口、主界面和主要状态判断上,是一个独立的 NoviceReward 系统;但部分配置、活动有效期、七日签到数据及拍脸打开方式复用了 ActivitySystem。就是说,不要因为配置里出现了:activityId,ActivityMainConfig,activityType,slapFace,ActivityModel就把整个新手奖励当成普通活动去读。
独立的部分
项目中有独立的新手奖励实现:
独立 Model:NoviceRewardModel.lua
独立主界面:UI_NoviceReward_MainView.lua
独立大厅入口:UI_Lobby_RightUp_NewBieReward.lua
独立配置访问层:NoviceRewardConfTable.lua
独立 UI 目录:System/NoviceReward/
2.拍脸是什么?
“拍脸”就是达到条件后自动弹到用户面前的强展示窗口。它通常受场景、优先级、平台、等级、频率和业务状态共同控制。
3.新手奖励整体结构和拍脸整体结构?
1 2 3 4 5 6 7 8
| 新手奖励配置 ↓ NoviceRewardConfTable / ActivityTable ↓ NoviceRewardModel ↓ 大厅入口 / 新手奖励主界面 / 各子页签
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 登录完成、返回大厅等场景 ↓ PushFaceModel 收集符合条件的拍脸配置 ↓ PushFace_SevenDayBP.NeedShow() ↓ NoviceRewardModel 判断有没有未领取奖励 ↓ PushFace_SevenDayBP.HandleShow() ↓ ActivityModel:ShowPushFaceActivity(activityId) ↓ 打开对应的新手七日奖励页面
|
4.配置表的UIName的挂在名称是UI_SevenDayBP_MainView,但是实际读取的是UI_SevenDayFreeCheckIn_MainView,走的代码的替换逻辑
### 5.奖励导航的结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| UI_NoviceReward_MainView 新手奖励顶层窗口 ├─ w_list_TagList 左侧页签列表 │ ├─ UI_NoviceReward_Tab 奖励导航 │ ├─ UI_NoviceReward_Tab 新手7天礼 │ └─ UI_NoviceReward_Tab 新手任务送 │ └─ w_namedSlot_SubPage 右侧动态页面挂点 │ 配置表存在排序,默认加载奖励导航 │ ├─ UI_NoviceNavigation_View 奖励导航页面 │ └─ w_List_Info 奖励导航卡片列表 │ └─ UI_NoviceNavigation_Item1 奖励导航卡片 │ ├─ UI_SevenDayBP_MainView 七日礼付费版 ├─ UI_SevenDayFreeCheckIn_MainView 七日礼免费版 ├─ UI_Task_NoviceTaskPage 新手任务页 └─ UI_Model_GameGuide_V2 玩法任务页
|
6.调用链一: 进入新手奖励,默认线上奖励导航
UI_NoviceReward_MainView:OnOpen()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| UI_Lobby_RightUp_NewBieReward 大厅新手奖励入口 └─ OnClickedBtnNoviceReward() 点击新手奖励按钮 └─ UIManager:OpenWindow() └─ UI_NoviceReward_MainView 打开新手奖励顶层窗口 └─ OnOpen(Data) ├─ self.Data = Data 保存外部传入参数 ├─ self.m_PageInfo = {} 初始化一级页签列表 ├─ OnInitializedEvent() 绑定返回按钮等事件 │ ├─ InitData() 初始化页面数据 │ └─ OnRefreshPanelData() │ ├─ GetResNoviceRewardTabData() │ │ 读取“新手奖励系统页签”配置 │ │ │ ├─ 遍历 ResNoviceRewardTabData │ │ ├─ CheckNoviceTabActiveStatus(value, true) │ │ │ 检查一级页签能否显示 │ │ │ │ │ ├─ GetExtendPageInfoByTask(pageValue) │ │ │ 补充活动、任务数据 │ │ │ │ │ ├─ 七日礼页面判断 │ │ │ ├─ isSevendDayBPUMG = true │ │ │ │ └─ UI_SevenDayBP_MainView │ │ │ └─ isSevendDayBPUMG = false │ │ │ └─ UI_SevenDayFreeCheckIn_MainView │ │ │ │ │ └─ table.insert(self.m_PageInfo, pageValue) │ │ │ ├─ table.sort(self.m_PageInfo) 按 sortId 排序 │ └─ 设置 index、maxIndex 生成运行时页签下标 │ ├─ InitEvent() 注册页签事件 │ ├─ Event_OnChangeNoviceTab │ │ └─ OnChangeTabInfo() Item1 跳转使用 │ └─ UI_CommonComp_Tab_Click │ └─ OnSelectedTabChanged() 公共 Tab 切换使用 │ └─ InitUI() └─ BindTimer(0.05) └─ RefreshUI(jumpUIName) ├─ jumpUIName 为空 │ └─ firstPage = self.m_PageInfo[1] │ └─ UI_NoviceNavigation_View │ ├─ SetCommonTabSelectInfo(viewTag, 1) │ 默认选中第一个 Tab │ ├─ ListSetDatasByFrame(w_list_TagList, m_PageInfo) │ └─ 创建多个 UI_NoviceReward_Tab │ └─ UI_NoviceReward_Tab:OnOpen(Data) │ └─ RefreshRightPage(UI_NoviceNavigation_View) ├─ 查找对应 PageInfo ├─ self.m_CurrentUIName = │ UI_NoviceNavigation_View │ └─ AddWidgetAsyn() └─ UI_NoviceNavigation_View:OnOpen(PageInfo) ├─ OnInitializedEvent() ├─ InitData() ├─ InitEvent() └─ InitUI() └─ RefreshUI() ├─ GetResNoviceRewardPageData() │ 读取“新手导航页签”配置 │ ├─ 遍历 PageData │ ├─ IsInVersion() │ ├─ CheckNoviceTabActiveStatus( │ │ value, false) │ └─ 加入 self.OpenPageList │ ├─ 按 sortId 排序 └─ RefreshListInfo() ├─ GetTaskPageCfgDBySystemId() │ ├─ 查询 PageA │ └─ 查询 PageB │ ├─ 检查任务、奖励状态 ├─ 生成 self.OpenPageListAB └─ ListSetDatasByFrame( w_List_Info, OpenPageListAB) └─ UI_NoviceNavigation_Item1 └─ OnOpen(Data)
|
7.调用链二:点击导航卡片 Item1 跳转页签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| UI_NoviceNavigation_View 当前处于奖励导航页面 └─ w_List_Info 奖励导航卡片列表 └─ UI_NoviceNavigation_Item1 某一张奖励导航卡片 └─ w_btn_Go “前往”按钮 └─ OnClickedBtnGo() ├─ GetResNoviceRewardPageDataById( │ self.Data.systemId) │ 根据 systemId 查询目标页面 │ ├─ ResNoviceRewardPageCfg.uiName 得到配置中的目标 UI │ ├─ GetIsSevenDayBPOpen() 七日礼特殊处理 │ ├─ isSevendDayBPUMG = true │ │ └─ UI_SevenDayBP_MainView │ └─ isSevendDayBPUMG = false │ └─ UI_SevenDayFreeCheckIn_MainView │ └─ DispatchEvent( Event_OnChangeNoviceTab, uiName) └─ UI_NoviceReward_MainView └─ OnChangeTabInfo(uiName) ├─ 遍历 self.m_PageInfo ├─ 根据 uiName 找到目标 PageInfo └─ DispatchEvent( UI_CommonComp_Tab_Click, PageInfo) │ ├─ UI_NoviceReward_MainView │ └─ OnSelectedTabChanged(PageInfo) │ ├─ SetCurRechageTab(PageInfo) │ ├─ 根据 PageInfo.index 查找页面 │ ├─ RefreshRightPage(PageInfo.uiName) │ │ ├─ RemoveChildWidget( │ │ │ w_namedSlot_SubPage) │ │ │ 移除 UI_NoviceNavigation_View │ │ │ │ │ ├─ 更新 self.m_CurrentUIName │ │ └─ AddWidgetAsyn() │ │ └─ 目标页面:OnOpen(PageInfo) │ │ │ └─ CachePageStatus( │ PageInfo.uiName, true) │ └─ 所有 UI_NoviceReward_Tab └─ OnSelectBtnIdxUpdate(PageInfo) ├─ 目标 Tab │ ├─ SetCommonTabSelectInfo() │ ├─ AnimationPlayForward() │ └─ 切换成选中状态 │ └─ 其他 Tab └─ 切换成未选中状态 UI_CommonComp_Tab_Click 是事件广播。主界面和所有 Tab 都会收到,监听者之间不依赖固定执行顺序。
|
8.调用链三:直接点击左侧 Tab 切换页签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| UI_NoviceReward_MainView 新手奖励顶层窗口 └─ w_list_TagList 左侧 Tab 列表 └─ UI_NoviceReward_Tab 用户点击的目标 Tab └─ w_btn_CheckIn Tab 点击按钮 └─ OnClickedBtnCheckIn() ├─ IsLocked() │ ├─ true │ │ ├─ _ShowLockedTips() │ │ └─ return │ │ │ └─ false │ ├─ 普通页签 │ └─ OnClickedBtnCallBack() │ └─ UI_Model_GameGuide_V2 ├─ CheckGameGuideIsOpen() ├─ CheckPakIsReadyByGroupId() └─ 资源准备完成 └─ OnClickedBtnCallBack() │ ├─ GetCommonTabSelectInfo(viewTag) │ ├─ 判断是否已选中 │ ├─ 已选中 │ │ ├─ isHasSelect = true │ │ ├─ GetRedDotIdListByTagId() │ │ └─ 没有红点操作则 return │ │ │ └─ 未选中 │ └─ SetCurSelectActivityInfo(nil) │ └─ DispatchEvent( UI_CommonComp_Tab_Click, self.Data, isHasSelect) │ ├─ UI_NoviceReward_MainView │ └─ OnSelectedTabChanged(self.Data) │ ├─ SetCurRechageTab(self.Data) │ ├─ PageInfo = │ │ m_PageInfo[self.Data.index] │ │ │ ├─ RefreshRightPage(PageInfo.uiName) │ │ ├─ RemoveChildWidget() │ │ ├─ 更新 m_CurrentUIName │ │ └─ AddWidgetAsyn() │ │ └─ 目标页面:OnOpen(PageInfo) │ │ │ └─ CachePageStatus() │ └─ 所有 UI_NoviceReward_Tab └─ OnSelectBtnIdxUpdate(self.Data) ├─ 当前目标 Tab │ ├─ SetCommonTabSelectInfo() │ ├─ 播放选中动画 │ └─ 显示选中状态 │ └─ 其他 Tab └─ 显示未选中状态
|
本文从 LearnByCompany 原始文档 自动同步。