MatchMaster/assets/GameplayIntro/README.md

14 KiB
Raw Blame History

玩法介绍正式功能包

Asset Bundle 名称:gameplay_intro。

  • prefab/GameplayIntro.prefab:本关介绍面板固定布局,可在 Creator 中编辑背景、标题、滑动区域和分页器位置。
  • assets/Script/module/Tool/LevelGameplay.ts:主脚本目录中的筛选工具,从实际关卡的方块、门、地块及生成队列识别玩法,并按类型去重。主场景仅以类型引用 GameplayIntro,在分包加载完成后用组件名获取实例,避免启动时依赖尚未加载的分包脚本。
  • script/GameplayIntro.ts:绑定预制体节点,关闭按钮或外部点击关闭,相邻三页图片加载与释放。
  • script/GuideCarousel.ts:鼠标/触摸翻页、缓动回弹、最多三点分页及白点替换动画;单页隐藏分页且不绑定拖动,双页显示两点。
  • Texture/:面板背景、玩法指南标题、问号、关闭按钮及分页圆点等 UI 素材;原有中文玩法图片已清理,玩法图片统一加载公共目录。
  • assets/resources/Window_Prop/:34 组公共玩法图片,按 titleN、iconN、IntroductionN 加载。daoju26 使用素材 27,daoju27 使用素材 26。

游戏入口由 assets/Script/SceneManager.ts 控制:进入场景时按实际加载的关卡生成介绍列表,没有特殊道具就隐藏问号。首次点击 openGameplayIntro 加载本包的 prefab/GameplayIntro,实例挂到 Inspector 绑定的 tipPanel 节点;关闭后保留固定布局,释放所有玩法页图片,再次打开复用实例,按解锁关卡倒序排列后定位最左端的最新玩法;三个分页点时高亮左边第 1 点。

GameplayIntro.open(entries) 接收已经筛选的介绍列表。NEW_LEVEL.json 仅提供介绍编号和排列顺序,不再用解锁关卡或玩家进度筛选。开局方块和 spawnGates[].spawnQueue[].members 都纳入本关范围,消除后仍可查看;同类型只展示一页。木箱/快递盒/彩色木箱、普通/定次连接等按实际变体匹配,花盆借用的不可见盖板不增加快递盒介绍。

场景接线:在 GameScene 的 Top/tip 下放置问号 Sprite + Button,图片使用本包 wenhao;Button 点击事件绑定 Canvas 上的 SceneManager.openGameplayIntro。SceneManager 的 Tip Panel 属性绑定场景现有的 tipPanel。tipPanel 应作为位于游戏内容之上的居中容器,不需要添加覆盖整个屏幕的输入拦截组件。

预制体直接引用背景、标题、关闭按钮和两种分页圆点;34 种公共玩法图片由脚本按当前页及相邻页动态加载,不能把所有玩法图片拖到预制体中,以免一次加载全部图片。

测试工具位于 assets/test。当前 settings/project.json 的启动场景是 TestLayout;不需要测试时,先在 Creator 中切回正式启动场景并保存设置,再删除 assets/test 和同级 assets/test.meta。当前 HomeScene 没有 HomePropTestPanel 节点。

与已拉取 main 的改动对比

核对日期:2026-09-15。最新 origin/main(e992a8f)已快进合入当前 layout-optimization 分支。以下以 e992a8f 为基准,包含当前工作区的暂存、未暂存和未跟踪文件;本地 main(122b504)未移动,不作为本清单的对比基准。此清单是本次核对快照,后续代码变更需同步更新。

新增业务代码并非全部放在新包:面板与滑动脚本位于 gameplay_intro,测试代码位于 test,LevelGameplay.ts 位于原公共脚本目录。

GameplayIntro/
├─ assets/
│  ├─ GameplayIntro/                 【新增资源包:gameplay_intro】
│  │  ├─ script/
│  │  │  ├─ GameplayIntro.ts         面板展示、图片加载与释放
│  │  │  └─ GuideCarousel.ts         滑动翻页、分页指示
│  │  ├─ prefab/
│  │  │  └─ GameplayIntro.prefab     玩法介绍面板
│  │  ├─ Texture/                   玩法介绍美术资源
│  │  └─ README.md
│  │
│  ├─ test/                          【新增资源包:test】
│  │  ├─ script/
│  │  │  └─ TestLayoutPanel.ts       独立测试面板
│  │  ├─ scene/
│  │  │  └─ TestLayout.fire          测试场景
│  │  ├─ tests/
│  │  │  ├─ guide-carousel.cjs
│  │  │  ├─ home-prop-panel.cjs      残留测试,依赖的脚本已不存在
│  │  │  └─ preview.cjs
│  │  └─ README.md
│  │
│  ├─ Script/                        【原有脚本目录】
│  │  ├─ module/Tool/
│  │  │  └─ LevelGameplay.ts         【新增】当前关卡玩法筛选
│  │  ├─ SceneManager.ts             【修改】入口、加载、暂停与恢复
│  │  └─ ItemGuide.ts                无实际内容差异
│  │
│  ├─ NewMode/script/
│  │  └─ NewMode.ts                  无实际内容差异
│  │
│  ├─ Scene/
│  │  ├─ GameScene.fire              【修改】问号按钮及面板接线
│  │  └─ HomeScene.fire              无实际内容差异
│  │
│  ├─ gacha_bundle/img/cat.meta      【删除】
│  ├─ libs/dn-sdk-minigame.meta       【删除】
│  ├─ passCheck/script.meta           【删除】
│  └─ pause/texture.meta             【删除】
│
├─ build-templates/wechatgame/
│  └─ project.config.json            【修改】上传时忽略 cocos 目录
│
└─ settings/
   └─ project.json                   【修改】启动场景、记录时间

新增资源对应的 .meta 文件未逐一展开。原有脚本实际只改了 SceneManager.ts;新增的 LevelGameplay.ts 位于公共脚本目录。两个新资源包尚未配置为微信独立分包。

assets/custom/Json/level1961.json.meta 至 level1980.json.meta 共 20 个关卡元数据文件现已包含在 main 基准中,合并时采用 main 的 UUID;未发现资源对旧本地 UUID 的引用。.codex_tmp/prop-compare.jpg 和 .codex_tmp/texture-compare.jpg 是本地对比图片,不是业务代码。project.json、settings/services.json、settings/wechatgame.json 相对上述基准没有实际文本内容差异。

本次合入 main 的 3 个提交包含:GameScene 点击拦截组件、门生方块介绍关卡改为 1943、AB 测试 B 方案第 15 关不返回首页及版本配置更新、战令图片更新。场景合并保留了 main 的拦截组件及本地问号按钮、坐标和面板接线;这些 main 自带改动不计入本地新增功能差异。

新增正式脚本及方法职责

整体调用关系:SceneManager 控制入口和暂停恢复 → LevelGameplay 筛选本关玩法 → GameplayIntro 管理内容与图片 → GuideCarousel 处理滑动分页。

LevelGameplay.ts(公共目录)

方法 作用
getLevelGameplay(config, data) 输入全部介绍配置和当前关卡数据,扫描方块、门、特殊地块及生成队列,返回本关介绍列表;按名称去重,保留配置顺序
内部 add(id) 将编号转换为 daojuN 存入 Set,重复玩法只记录一次

该工具只读取数据。方块列表使用浅复制后再补充待生成方块,不向原数组追加内容。根据方块类型及附加属性区分普通/定次、木板/快递盒/彩色箱子等变体;花盆接收块借用的不可见盖板不额外计入箱子介绍。它不使用玩家进度或配置中的 level 筛选,也不负责显示、加载图片或暂停游戏;最终只返回在介绍配置中存在的条目。

GameplayIntro.ts(gameplay_intro 包)

挂在正式预制体根节点,负责内容、开关动画和图片资源。

方法 作用
open(entries) 复制列表并按 level 倒序排列,绑定固定节点、初始化分页,播放打开动画;空列表直接关闭
syncPages() 只保留当前页和前后相邻页的图片,优先加载当前页
picture(...) 排队加载公共标题、道具或说明图;标题和道具图等比适配,说明图保持预制体设置;丢弃失效页面的加载结果
nextImage() 依次启动图片加载任务,避免集中加载
releasePage(index) / releasePages() 清空图片显示引用、归还资源引用、隐藏页面;批量清理时同时清空待加载队列,固定节点保留复用
close() / finishClose() 播放关闭动画后释放图片、隐藏面板并发出 intro-closed,由场景判断是否恢复游戏
stopPanelAnimation() 停止开关动画并重置状态
onDisable() / onDestroy() 隐藏或销毁时清理图片和动画
previewNavigate(action) / getPreviewState() 提供测试跳页入口,以及当前页、总页数和当前配置
showMessage(value) 使用预制体的 Status 节点显示提示

GuideCarousel.ts(gameplay_intro 包)

挂在 IntroViewport,只负责手势、页面位置和圆点动画。逻辑页循环使用预制体中的三个固定页面节点。

方法 作用
initialize(...) / clear() 初始化页数、默认页、圆点及输入监听;重复打开前清理旧状态
goTo(index, animated) 限制目标页范围,更新分页高亮,发出 page-changed 通知内容加载
begin(...) / move(...) / end(...) 开始拖动、跟手移动、根据距离和速度决定翻页或回弹;首尾越界有阻力
x(event) 将屏幕坐标转为视口局部坐标,适配面板缩放
touchStart/Move/End/Cancel 将带手指 ID 的触摸事件转给拖动逻辑
mouseDown/Move/Up/Leave 处理鼠标左键拖动与离开视口结束拖动
createDot() / styleDot() 创建圆点并设置选中样式
animateDots() / resetDotAnimation() 推进或重置圆点替换动画
render() / update(dt) 应用页面位移、缩放和透明度,每帧推进吸附、回弹及圆点动画
onDisable() 结束手势和动画,避免重开后残留中间状态

原有 SceneManager.ts 的具体改动

改动位置 改动及作用
文件顶部 引入 getLevelGameplay;以 import type 引用 GameplayIntro,不产生启动时的运行时导入
新增字段 tipPanel 绑定场景容器;gameplayIntro 缓存面板控制器;levelGameplay 保存本关介绍列表
isPauseOpen() 将介绍面板加载中、显示中计入暂停判断,防止重复打开及原有流程提前恢复游戏
onLoad() 增加 refreshGameplayInfo() 调用,进场景时初始化列表和问号显隐
新增 refreshGameplayInfo() 使用已有 NEW_LEVEL 配置,未就绪则异步加载;按实际关卡筛选并缓存列表,没有介绍时隐藏问号
新增 openGameplayIntro() 检查场景、暂停、结束、商城和容器状态;暂停游戏并停止炸弹计时;通过原有动态弹窗加载器加载或复用正式面板,再传入列表
内部 resume() 回调 关闭或加载失败时,仅在无冰冻、无其他暂停、无商城暂停且游戏未结束时恢复游戏;游戏已开始才恢复炸弹计时
加载完成回调 结束加载标记;失败时尝试恢复;成功时按组件名取得面板,同一实例只绑定一次关闭回调
原空 start() 删除无内容的方法,没有移除实际业务逻辑

loadDynamicPopup() 等通用加载方法沿用原有实现。MapConroler、ItemGuide.ts、NewMode.ts 等其他原有业务脚本没有内容修改。

配套非脚本改动:GameScene.fire 新增问号按钮、tipPanel 容器及点击/属性绑定;微信构建模板增加上传忽略 cocos 目录;settings/project.json 将启动场景改为 TestLayout(UUID 8e21ec7e-3913-44ec-8f99-53ff52fe81ed)并更新记录时间。

新增测试脚本

脚本 作用
assets/test/script/TestLayoutPanel.ts 独立测试界面,支持指定本地关卡、全部玩法、重新打开和跳页;直接复用正式面板,不写玩家进度
assets/test/tests/guide-carousel.cjs 使用模拟 Cocos 环境检查筛选、分页、资源回收及场景入口的暂停恢复逻辑
assets/test/tests/preview.cjs 本地预览服务,使用 Creator 编译器及运行中的编辑器引擎/资源展示测试场景
assets/test/tests/home-prop-panel.cjs 残留道具测试;依赖的 HomePropTestPanel.ts 和 HomeScene 节点已不存在,当前不可正常运行

运行方式与移除步骤见 assets/test/README.md。本次合并后执行 node assets/test/tests/guide-carousel.cjs,全部回归项通过;同时验证了场景引用索引和双方场景改动的保留情况。未进行 Creator 真机视觉及性能验证。

可编辑的固定玩法页结构

直接打开 prefab/GameplayIntro.prefab:

IntroViewport
└─ Pages
   ├─ Page1
   │  ├─ TitleImage
   │  ├─ IconImage
   │  └─ DescriptionImage
   ├─ Page2(相同结构)
   └─ Page3(相同结构)

所有图片节点已经放在面板预制体内,SpriteFrame 留空。最下方 DescriptionImage 的大小由 Sprite 的 Size Mode、Trim 及节点尺寸/缩放控制,代码不覆盖;TitleImage 和 IconImage 仍以预制体 Width/Height 为展示区域等比适配;三页需要保持相同布局。代码仅复用三个页面、改变分页位置并动态加载图片。说明图不做代码缩放,标题和道具图保留等比适配;没有单图比例修正。翻远或关闭面板时清空图片并归还资源引用,不销毁这三个页面;面板整体销毁时由引擎销毁子节点。