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 原始文档 自动同步。