1 model
1 2 3 4 5 6 7 8 9 10 11
| 玩家进游戏 → FirstChargeModel 注册事件 → 任务系统初始化完成 → 请求服务器 → 服务器返回 resIds = {2, 3} → 用 resIds 读配表 ResFirstChargeConfData → configMap[2] = {title, price, taskGroupId, subViweName, ...} → configMap[3] = {title, price, taskGroupId, subViweName, ...} → 用 taskGroupId 读任务系统 → taskMap[2] = {task1, task2, ...} → taskMap[3] = {task3, task4, ...} → 派发 GET_FIRST_CHARGE_INFO 事件(通知数据就绪)
|
2 大厅图片显示
1 2 3 4 5 6 7 8 9
| 大厅 UILobbyView 加载 → 检查首充图标是否显示 → FirstChargeModel:IsVisibilityLobbyBtn() 条件1: IsInVersion() → 数据已加载 ✓ 条件2: RechargeModel:RechargeSubPageIsVisible() → 商城页签可见 ✓ 条件3: IsFirstRechargeVisible() → 功能已解锁 ✓ 条件4: not IsFinishAllFirstChargeTask() → 还有未完成任务 ✓ → 四个条件都满足 → 显示首充图标 + 刷新红点
|
3玩家点击大厅首充图标
1 2 3 4 5 6 7 8 9 10
| 玩家点击首充图标 → UI_ActivityIcon_FirstCharge:OnClickedBtnFirstCharge() → 检查资源下载 ✓ → 检查是否在匹配中 ✓ → MallModel:OpenSubViewTagByUIName("UI_Recharge_FirstChargeSubView") → 从 NewShopTag 配表查 tagId = 140000 → OpenMallView({ ShopTagId = 140000 }) → UIManager:OpenWindow("UI_NewMall_MainView", { ShopTagId = 140000 }) → 商城主界面打开,自动选中"首充"Tab
|
4商城加载首充 SubView
1 2 3 4 5 6
| 商城 UI_NewMall_MainView → 从 NewShopTag 配表读到 subViewName = "UI_Recharge_FirstChargeSubView" → AddWidget("UI_Recharge_FirstChargeSubView", slot, Data) → Data = { previewAvatar = 预览角色 } ← Mall 框架创建并传入 → 加载 SubView 蓝图 + Lua
|
5SubView 初始化
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
| │ ├→ InitData() │ → PreviewActor = Data.previewAvatar ← 存下 Mall 传入的预览角色 │ ├→ InitEvent() │ → 监听 SecondTabChanged(Tab切换) │ → 监听 GET_TASK_REWARD(领奖后刷新) │ → 监听 GET_FIRST_CHARGE_INFO(数据就绪后刷新) │ └→ InitUI() │ ├→ ReqFirstChargeTaskInfo() ← 防止未初始化,主动请求一次 │ → 如果已初始化 → 直接用缓存 │ → 如果未初始化 → 向服务器请求 │ ├→ InitTaskData() ← 从 Model 读数据 │ → FirstChargeDataMap = FirstChargeModel:GetFirstChargeTaskDataMap() │ → FirstChargeConfigData = FirstChargeModel:GetFirstChargeConfigDataMap() │ ├→ InitSecondTabUI() ← 构建 Tab 列表 │ │ │ ├→ SetFirstChargeStateList() ← 清空旧状态 │ │ │ ├→ OnUpdateTabData() ← 遍历配置,构建每个 Tab 的数据 │ │ 遍历 configMap: │ │ id=2: │ │ TagItem.id = 2 │ │ TagItem.name = "1元送橙小兔" │ │ TagItem.subViweName = "UI_Recharge_FirstChargeMain" ← 决定加载哪个Main │ │ TagItem.firstChargeData = taskMap[2] ← 任务列表 │ │ TagItem.firstChargeConfigData = configMap[2] ← 配置数据 │ │ TagItem.seqId = 1 │ │ FirstChargeModel:InitFirstChargeStateMap(2) ← 初始化状态 │ │ │ │ id=3: │ │ TagItem.id = 3 │ │ TagItem.name = "6元再送师徒双人" │ │ TagItem.subViweName = "UI_Recharge_SixChargeSubView" │ │ TagItem.firstChargeData = taskMap[3] │ │ TagItem.firstChargeConfigData = configMap[3] │ │ TagItem.seqId = 2 │ │ FirstChargeModel:InitFirstChargeStateMap(3) │ │ │ ├→ SetSelectedSecondId() ← 决定默认选中哪个 Tab │ │ → SortStateList() ← 排序(可领奖的排前面) │ │ → 取排序后第一个作为默认选中 │ │ │ └→ ListSetDatas(w_list_GiftTag, SecondTagListData) │ → ListView 自动创建 TabItem 蓝图实例 │ → 每个 TabItem 显示档位名称和图标 │ ├→ SwitchSubView() ← 加载默认选中 Tab 的详情页 │ → viewName = "UI_Recharge_FirstChargeMain" │ → RemoveChildWidget(w_nameSlot_SubView) ← 清空旧内容 │ → CurTabInfo.previewActor = PreviewActor ← 传入预览角色 │ → AddWidget("UI_Recharge_FirstChargeMain", w_nameSlot_SubView, CurTabInfo) │ → CurTabInfo = { │ id=2, name="1元送橙小兔", │ firstChargeData = {task1, task2}, ← 任务列表 │ firstChargeConfigData = {title, price, suitIds, ...}, ← 配置 │ previewActor = 预览角色, │ subViweName = "UI_Recharge_FirstChargeMain", │ } │ → 加载 Main 蓝图 + Lua │ └→ 刷新红点
|
6Main 详情页初始化
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
| UI_Recharge_FirstChargeMain:OnOpen(Data) │ Data = SubView 传来的 CurTabInfo │ ├→ InitData() │ → IsShowRechargeBtn = true ← 默认显示充值按钮 │ ├→ InitEvent() ← 注册4个事件监听 │ → 监听 FirstChargeModel_RefreshReward → 充值后隐藏按钮 │ → 监听 FirstChargeModel_ReceiveSameValueRewards → 自动领奖 │ → 监听 TASK_INFO_MAP_UPDATE_NOTICE → 刷新红点 │ → 监听 ON_CLOSE_WINDOW_IMMEDIATELY → 关窗恢复动画 │ └→ InitUI() │ ├→ InitTaskData() ← 从 Data 提取数据 │ → FirstChargeDataMap = Data.firstChargeData ← 任务列表 │ → FirstChargeConfigData = Data.firstChargeConfigData ← 配置 │ → PreviewActor = Data.previewActor ← 预览角色 │ ├→ InitListUI() ← 构建奖励列表 │ → InitListData() ← 决定用普通列表还是7天列表 │ → 奖励数量 > 5 → 用7天列表 │ → 奖励数量 ≤ 5 → 用普通列表 │ → 遍历 FirstChargeDataMap: │ → data:GetTaskIsCompletedOrFinish() → 如果已完成 → IsShowRechargeBtn = false │ → ListSetDatasByFrame(w_list_ShowRewards, uiDataList) │ → ListView 自动创建 FirstChargeItem 实例 │ → 每个 Item 显示一个奖励格子的图标、数量、领取状态 │ ├→ InitItemUI() ← 设置商品信息 │ → w_txt_name = "1元送橙小兔" ← 商品名 │ → w_txt_Price = "¥50" ← 价格 │ → w_img_Icon = 货币图标 ← 钻石图标 │ ├→ SetRechargeBtnVisibility() ← 设置充值按钮显示 │ → IsShowRechargeBtn = true → 显示充值按钮(index=0) │ → IsShowRechargeBtn = false → 显示已领取(index=1) │ ├→ InitModelUI() ← 模型预览 │ → SetModelAnim() │ → RefreshPreviewUI() ← 设置角色套装 │ → DispatchEvent(CommonModel_PreviewPlayerSuit, suitIds) │ → 派发给预览系统,给角色穿上首充套装 │ → PreviewActor:ChangePreviewCameraPos("Camera_Recharge") │ → 切换相机到首充专属视角 │ → 播放待机动画(isCycle=1 → 自循环) │ → DispatchEvent(CommonModel_ChangeIdleAnimation, actId) │ └→ 设置标题 → w_txt_TitleName = "橙小兔" → w_txt_TitleName_1 = "橙小兔"
|
7玩家充值
1 2 3 4 5 6 7 8 9 10 11 12
| 玩家点击充值按钮 → OnClickedBtnRecharge() → 埋点上报(统计点击事件) → 防抖检查(3秒冷却) → PayModel:OnProcBuyRMB({ count = 1 }) → 发起微信/支付宝支付 → 玩家完成支付 → 服务器处理: ① 充值到账(给玩家加钻石等) ② 标记首充任务为已完成 ③ 推送任务变更通知
|
8充值后的事件链
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
| 服务器处理完成后,推送一系列通知:
① TASK_INFO_MAP_UPDATE_NOTICE(任务变更) ├→ FirstChargeModel:OnUpdateReddotInfo() │ → 检查变更的任务是否包含首充的 taskGroupId │ → 是 → RefreshReddot() → 刷新4个红点 │ └→ Main:OnUpdateTaskInfo() → 检查首充任务是否有变更 → 是 → 刷新红点
② FirstChargeModel_RefreshReward(奖励刷新) └→ Main:RefreshRechargeBtnVisibility(1) → SwitcherSetActiveWidgetIndex(w_switcher_Recharge, 1) → 充值按钮区域切换到"已领取"状态 → 玩家看到充值按钮消失
③ FirstChargeModel_ReceiveSameValueRewards(等值奖励) └→ Main:OnReceiveSameValueRewards(TaskValue) → 遍历 FirstChargeDataMap → 找到匹配金额且已完成的任务 → 收集 taskId 列表 → TaskSystemModel:ReqGetTaskRewards(TaskIdList) → 向服务器请求领取奖励 → 服务器发放奖励到背包 → 推送 GET_TASK_REWARD 事件
④ GET_TASK_REWARD(领奖完成) └→ SubView:OnReqNewData() → OnUpdateTabData() ← 重新构建 Tab 列表 → 重新遍历 configMap → 重新检查任务状态 → 奖励列表刷新(已领取的标记为已领取)
|
9玩家切换 Tab
1 2 3 4 5 6 7 8 9 10
| 玩家点击"6元再送师徒双人"Tab → TabItem 点击 → 派发 FirstChargeModel_SecondTabChanged 事件 → SubView:OnSecondTabChanged(secondTagId=3) → CurTabInfo = TagInfoMap[3] → SwitchSubView() → RemoveChildWidget(w_nameSlot_SubView) ← 移除橙小兔 Main → AddWidget("UI_Recharge_SixChargeSubView", w_nameSlot_SubView, CurTabInfo) → 加载师徒详情页 → 师徒页面用不同的配置数据(price=100, rechargeCount=6)
|
10玩家关闭页面
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 玩家关闭首充页面 → SubView:OnClose() → 关闭拍脸通知(如果有) → 清空 PreviewActor → 清空 Data → Main:OnClose() → 清空所有数据容器 → 清理动画定时器 → PreviewModel:SetCurrentPreviewCameraTag("Camera_Bag") → 恢复默认相机视角 → 如果所有任务都完成了 → IsVisibilityLobbyBtn() = false → 大厅首充图标消失
|
本文从 LearnByCompany 原始文档 自动同步。