从策划需求到活动上线 — 完整工作流程

一、收到策划需求后,第一步做什么?

1.1 需求拆解

拿到策划文档后,先回答以下 6 个关键问题:

# 问题 答案决定什么 示例
1 活动有几种界面? 单页 or 多Tab 签到1页 / 任务+兑换2页
2 核心交互是什么? 选哪个模板 任务列表→TaskView / 线性兑换→ExchangeLinearView
3 有没有商城兑换? 是否配 activityShopType 有→关联商城mallId
4 有没有任务系统? 是否配 activityTaskGroup 有→任务组ID
5 有没有独立网络通知? 是否需要写子模型+协议 有→子模型BindNotify / 无→复用通用接口
6 有没有自定义UI交互? 纯换皮 or 写实例代码 纯展示→零代码 / 有按钮交互→写实例

1.2 模板选型决策树

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
策划需求核心功能是什么?
│
├─ 只有标题+背景+时间,纯展示
│ → UniversalView(通用模板)
│
├─ 任务列表
│ ├─ 普通+分页签 → TaskView(任务列表模板)
│ ├─ 逐个解锁 → TaskByTaskView
│ └─ 每日刷新 → DailyTaskView(砸蛋模板)
│
├─ 兑换
│ ├─ 线性进度 → ExchangeLinearView ★最常用
│ ├─ 带任务进度展示 → TaskProgressExchangeView
│ └─ 步进随机 → DrawLinearView
│
├─ 抽奖
│ ├─ 纯抽奖 → LotteryDrawViewNew
│ ├─ 召集+抽奖 → InvitationLotteryView
│ └─ 抽Buff → LotteryBuffView
│
├─ 签到
│ ├─ 普通 → SignInView
│ └─ 分组签到任务 → SignInTaskView
│
├─ 答题 → QuizTrialView / QuizExchangeLinearView
├─ 拼图 → PuzzleView
├─ 走格子 → GridWalkingView
├─ 连线 → LineDrawingView
├─ 寻宝 → TreasureExchangeView
├─ 神秘商店 → MysteriousShopView
└─ 以上都不是 → UniversalView + 自定义

二、完整工作流程(7 步)

Step 1: 需求分析与确认

你做的事:

  1. 读完策划文档
  2. 填写需求拆解表(上面的 6 个问题)
  3. 确定模板选型
  4. 列出需要的配置项清单
  5. 跟策划确认:
    • 活动ID分配了没有?
    • 任务组ID在TaskConfData里配好了没有?
    • 商城ID在MallCommodityConf里配好了没有?
    • 美术资源(背景图、标题图)CDN地址有了没有?
    • 活动时间确定了吗?

交付物:一份确认好的需求拆解表


Step 2: 配置表填写

你做的事:在对应 Excel 中新增一行活动记录

文件:Editor/letsgo_common/excel/xls/H_活动中心配置.xlsx

必须确认的字段:

字段 值 谁提供 说明
id 30999 策划/服务端 活动唯一ID
activityType ATLinearRedeem 策划 玩法类型
activityName 春日兑换 策划 活动名
activityUIDetail UI_ActivityTemplate_ExchangeLinearView 你决定 ★ 指向选定的模板
tagId 1 策划 在哪个Tab展示
activityShopType 142 策划 关联商城
activityTaskGroup 570011,570021 策划 任务组ID
backgroundUrl spring_bg.astc 策划/美术 背景图+标题图CDN地址
timeInfo begin/end 策划 活动时间
clientParams [“每日任务”,”兑换商店”] 你决定 Tab名列表
platforms 1,2,3,4 策划 支持平台
lowVersion 1.5.61.25 策划 最低版本

操作:

  1. 打开 Excel,找到对应 sheet
  2. 末尾新增一行,填写字段
  3. 保存
  4. 执行导表

导表命令:

1
2
3
cd D:\LetsGoEditor\Editor\letsgo_common
# 执行项目导表工具
python export_table.py

验证:检查 server/data/ActivityMainConfigForLetsGo_common.txt 中是否有新增的 id: 30999


Step 3: UMG 蓝图协调

谁做:美术创建蓝图 + 你设置 View 属性

3a. 跟美术沟通

告诉美术以下信息:

1
2
3
4
5
6
7
8
9
10
11
1. 蓝图名:UI_ActivityTemplate_ExchangeLinearView(或自定义实例名)
2. 父类:MoeLuaWidget
3. 保存路径:/Game/Feature/System/Assets/CommercialRes/Activity/Activity_SpringExchange/Blueprints/
4. 必须包含的 Widget 列表:
- w_txt_title(标题文本)
- w_txt_ActivityTime(活动时间)
- w_img_Activity_BG(背景图)
- w_img_ActivityTitle(标题图)
- w_btn_Exchange_1(兑换按钮)← 模板特有
- w_list_Exchange(兑换列表)← 模板特有
...(根据选定的模板,提供对应Widget清单)

💡 如何确定 Widget 清单:打开对应模板的 Lua 源码,搜索 self.bp.w_ 即可找到所有引用的 Widget 名

3b. 美术交付后,你做的事

  1. 打开 UMG 蓝图
  2. 确认父类是 MoeLuaWidget
  3. 设置 View 属性:
    1
    Feature.System.Script.System.Activity.Public.Template.View.UI_ActivityTemplate_ExchangeLinearView
  4. 确认每个 Widget 名称拼写正确(区分大小写)
  5. 保存蓝图

Step 4: 编写实例代码(如需自定义逻辑)

判断:

情况 写不写代码
模板功能完全满足,只换美术 ❌ 不写
需要自定义按钮交互、数据处理 ✅ 写实例

如果需要写:

4a. 创建目录

1
2
3
4
5
Instance/SpringExchange/
├── Model/
│ └── Activity_Instance_SpringExchange_Model.lua
└── SubView/
└── UI_ActivityInstance_SpringExchange.lua

4b. 注册子模型路径

在 Public/ActivityModelPath.lua 中添加:

1
["Activity_Instance_SpringExchange_Model"] = "Feature.System.Script.System.Activity.Instance.SpringExchange.Model.Activity_Instance_SpringExchange_Model",

4c. 创建子模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
local Activity_Instance_SpringExchange_Model = _MOE.class(
"Activity_Instance_SpringExchange_Model",
_MOE.SystemSubModel
)

function Activity_Instance_SpringExchange_Model:OnInit()
self.m_activityData = nil
end

function Activity_Instance_SpringExchange_Model:OnClear()
self.m_activityData = nil
end

function Activity_Instance_SpringExchange_Model:GetActivityData()
return self.m_activityData
end

function Activity_Instance_SpringExchange_Model:SetActivityData(data)
self.m_activityData = data
end

return Activity_Instance_SpringExchange_Model

4d. 创建实例视图

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
local Parent = require("Feature.System.Script.System.Activity.Public.Template.View.UI_ActivityTemplate_ExchangeLinearView")

local UI_ActivityInstance_SpringExchange = _MOE.class(
"UI_ActivityInstance_SpringExchange",
Parent
)

function UI_ActivityInstance_SpringExchange:OnOpen(Data)
self.super:Init(self, Data)
self:OnInitializedEvent()
self:InitData()
self:InitEvent()
self:InitUI()
end

function UI_ActivityInstance_SpringExchange:InitData()
self.super:InitData()
-- 自定义逻辑
end

function UI_ActivityInstance_SpringExchange:InitUI()
self.super:InitUI()
-- 自定义UI
end

function UI_ActivityInstance_SpringExchange:OnClose()
self.super:OnClose()
end

return UI_ActivityInstance_SpringExchange

4e. 修改配置表指向实例

配置表 activityUIDetail 改为:UI_ActivityInstance_SpringExchange

在 UIWndNameToLuaPath.lua 中注册:

1
["UI_ActivityInstance_SpringExchange"] = "Feature.System.Script.System.Activity.Instance.SpringExchange.SubView.UI_ActivityInstance_SpringExchange",

Step 5: 导表

1
2
cd D:\LetsGoEditor\Editor\letsgo_common
python export_table.py

验证:

  • 无报错
  • server/data/ActivityMainConfigForLetsGo_*.txt 中包含新活动ID

常见导表错误:

  • 道具1300001不存在 → 配置表引用了不存在的道具ID,找策划确认
  • commodityId不唯一 → 商城商品ID重复,找策划确认

Step 6: PIE 测试

打开 UE4 编辑器 → Play(PIE)

测试清单:

# 测试项 怎么测 预期结果
1 活动显示 大厅→活动中心→对应Tab 活动图标/名称正确显示
2 进入界面 点击活动 线性兑换界面正常打开
3 标题 看界面顶部 活动名称正确
4 背景图 看界面背景 背景图加载成功
5 时间显示 看时间区域 开始-结束时间正确
6 Tab页签 看Tab区域 clientParams配置的Tab名正确
7 任务列表 切到任务Tab 任务正确显示,可领奖
8 兑换商店 切到兑换Tab 商品正确显示,可兑换
9 兑换功能 点击兑换按钮 扣道具→发奖励→刷新列表
10 红点 看活动入口 有新内容时显示红点
11 返回再进 返回→再次进入 数据保持,不重置
12 日志 看 Output Log 无 Lua 报错

常见问题排查:

现象 原因 解决
活动不显示 tagId/suspend/时间配置错误 检查配置表
界面打不开 UMG View属性未设置 蓝图中设置View=Lua路径
标题不显示 UMG缺少w_txt_title 蓝图中添加Widget
背景图不显示 backgroundUrl地址错误 检查CDN地址
兑换列表为空 activityShopType错误 检查商城mallId
任务为空 activityTaskGroup错误 检查任务组ID
按钮无反应 Widget名不匹配 对照模板源码检查名称
子模型nil ActivityModelPath未注册 检查key大小写和路径

Step 7: 交付与提交

  1. 代码提交:确认以下文件已修改

    • 配置表 Excel(策划也改了的话确认一致)
    • ActivityModelPath.lua(如注册了子模型)
    • UIWndNameToLuaPath.lua(如注册了实例视图)
    • 实例 Lua 文件(如创建了)
  2. UMP 蓝图:确保已保存

  3. 通知策划:告知活动已实现,请配置服务端数据并测试


三、流程总览图

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
策划给需求
│
↓
Step 1: 需求分析 ← 确认活动ID/任务组/商城/美术资源
│
↓
Step 2: 配置表填写 ← 填Excel, activityUIDetail指向模板
│
↓
Step 3: UMG蓝图 ← 美术创建, 你设View属性, 确认Widget名
│
↓
Step 4: 实例代码 ← (可选) 自定义逻辑才写
│ ├─ 注册ActivityModelPath
│ ├─ 创建子模型
│ ├─ 创建实例视图
│ └─ 注册UIWndNameToLuaPath
│
↓
Step 5: 导表 ← 执行导表工具, 确认无报错
│
↓
Step 6: PIE测试 ← 12项检查清单
│
↓
Step 7: 提交 ← 代码+蓝图, 通知策划测试

四、实际案例演示

假设策划给你这样一个需求:

做一个”夏日兑换”活动,玩家完成任务获得积分,积分在线性轨道上兑换奖励。有两个Tab:每日任务和兑换商店。活动时间 7/20-8/20。

你的操作:

步骤 操作 结果
Step 1 分析:线性兑换+任务+多Tab → 选 ExchangeLinearView 模板 模板确定
Step 2 跟策划确认:活动ID=30999, 任务组=570011, 商城=142 配置参数确认
Step 3 Excel 填写一行,activityUIDetail=UI_ActivityTemplate_ExchangeLinearView,clientParams=["每日任务","兑换商店"] 配置表完成
Step 4 跟美术沟通蓝图Widget清单,美术创建蓝图后你设View属性 UMG完成
Step 5 模板功能完全满足,不写代码 代码零修改
Step 6 导表 导表成功
Step 7 PIE 测试 12 项全通过 测试通过
Step 8 提交 完成

✅ 整个开发只花了:填配置表 + 设UMG View属性 + 测试,零代码编写


本文从 LearnByCompany 原始文档 自动同步。