《渡》开发文档
一款像素风叙事解谜手游。玩家扮演摆渡人,引导六位逝者完成未了心愿,在莫比乌斯环式的叙事中,最终完成摆渡人的自我救赎。
| 项目 | 信息 |
|---|---|
| 引擎 | Unity 2022 LTS |
| 平台 | iOS / Android/ pc |
| 分辨率 | 480×270 → 等比缩放适配 |
| 开发周期 | ~16周 (2025.6.9–2025.9.21) |
| 开发规模 | 1人 |
一、技术选型
1.1 为什么选 Unity
- 跨平台移动端导出:iOS + Android 一次开发双端发布,Unity 对移动端 IL2CPP、纹理压缩、触摸输入的支持成熟
- 非对话玩法需求:本项目包含填色、拼图、拖拽、寻物等交互,Ren’Py 等视觉小说引擎无法胜任
- 像素渲染友好:天然支持 Point Filter、Pixel Perfect Camera、Tilemap,无需额外渲染管线
- 生态成熟:移动端性能分析工具(Profiler、Frame Debugger)、Asset Store 素材丰富
1.2 核心架构决策
| 决策 | 理由 |
|---|---|
| 单例 GameManager(DontDestroyOnLoad) | 跨场景全局状态管理,存档/读档/章节解锁全部由单点控制 |
| SceneLoader 统一接管所有跳转 | 确保转场效果一致,避免 SceneManager.LoadScene 裸调用的不一致 |
| 存档用 JSON | 可读可调试,Unity JsonUtility 直接支持,无需引入第三方库 |
| Canvas + RawImage 做全屏特效 | Fade/溶解/模糊 都覆盖在 UI 层,不影响游戏世界相机 |
二、术语定义
| 术语 | 含义 |
|---|---|
| 渡口 Hub | 序章场景,玩家的基地。陈列信物、翻名册、选择章节、查看进度 |
| 名册 | B 交给玩家的逝者名册,记录六位逝者信息,完成章节后解锁新页 |
| 信物 | 每个逝者的代表物品,完成章节后出现在渡口的对应柱子上 |
| faceNoise | 玩家的面孔噪声值(0~8),代表记忆破碎程度,决定转场效果和展示记忆恢复程度 |
| 像素溶解 | faceNoise ≥ 6 时启用的转场效果,噪声图驱动的像素逐渐消失/显现 |
| 模糊聚焦 | faceNoise 3~4 时启用的转场效果,画面从模糊逐渐清晰 |
| 光点系统 | 渡口 Hub 的视觉进度指示,解锁章节越多光点越亮越密 |
| 莫比乌斯环 | 本作的叙事结构,摆渡人即是最后一个逝者,首尾相连 |
三、游戏设计
3.1 世界观与叙事框架
莫比乌斯环叙事结构——玩家从渡口出发,依次引导六位逝者完成心愿,最后发现第七个逝者就是自己。
3.2 人物关系
| 角色
| A(摆渡人/玩家)
| B(引路人/NPC)
| Ch1 失聪音乐家
| Ch2 绝症少年
| Ch3 公交车司机
| Ch4 战地记者
| Ch5 阿兹海默老人
| Ch6 乡村教师
3.3 章节设计
| 章节 | 核心玩法 | 结局 |
|---|---|---|
| 序章 | 渡口场景 + B 出现交名册 + 翻名册引导 + 像素对话框 | 1 |
| Ch1 失聪音乐家 | 色盘填色 | 1 |
| Ch2 绝症少年 | 病房寻物 + 六物成镜 | 1 |
| Ch3 公交车司机 | 光影气泡拖拽 | 1 |
| Ch4 战地记者 | 照片取舍 | 3 |
| Ch5 阿兹海默老人 | 拼图 × 遗忘机制 | 3 |
| Ch6 乡村教师 | 一轴一格时间轴归位 | 1 |
| Ch7 摆渡人自渡 | 逆流而上 + B 渡 A | 1 |
3.4 渡口 Hub 功能
- 信物陈列(完成章节后上柱)
- 名册渐进解锁(每完成一章解锁下一页)
- 光点系统(视觉进度指示)
- 章节选择(已解锁的章节可重玩)
3.5 美术规格
| 参数 | 值 |
| 设计分辨率 | 480 × 270 |
| Filter Mode | Point (no filter) —— 每张导入的图都要设 |
| Pixels Per Unit | 16 |
| 色彩模式 | 索引色 / 有限色板(像素风一致) |
| 美术总数 | 约 290 张(含角色、场景、UI、特效) |
| 作者|我自己|
具体剧本和玩法在6.16日讨论完
四、到现在已完成工作
4.1 代码文件清单
| 文件 | 位置 | 功能 |
| GameManager.cs | Scripts/Core | 单例 + 存档系统(自动/手动/分支)+ 章节状态 + 信物追踪 + 重玩模式 |
| SaveData.cs | Scripts/Core | 序列化数据结构(挂 GameManager 文件末尾) |
| MainMenu.cs |Scipts | 开始界面:继续/读档/新游戏/章节选择/退出 |
| chapertselet.cs|Scipts |章节重玩的构建
4.2 目前项目结构
Assets/ ├── Scenes/ │ └── Prologue_Hub.unity ← 当前空场景(MainCamera) ├── Scripts/ │ ├── Core/ │ │ ├── GameManager.cs ✅ │ │ ├── SceneLoader.cs │ │ │ └── UI/ │ ├── FadeScreen.cs │ ├── MainMenu.cs ✅ │ ├── chapertselet.cs ✅ │ └── ├── Shaders/ │ └── ├── Sprites/ │ ├── Chapters/ │ ├── UI/ │ └── Hub/ └── Audio/五、待办事项
5.1 立即要做(6月26日)
| # | 任务 | 说明 |
| 1 | 搭建 MainMenu 场景 | Canvas + 5个Button + 挂 MainMenu.cs + FadeCanvas 预制体 |1
| 2 | 场景加入 Build Settings | File → Build Settings → 把 Prologue_Hub 和 MainMenu 拖进去 |
| 3 | 替换 SceneManager.LoadScene | MainMenu.cs 里三处裸调用改成 SceneLoader |
5.2 本周目标(6月26–29日)
| 目标 | 内容 |
| 序章跑通 | 渡口场景 + B 出现交名册 + 翻名册点 Ch1 + 像素对话框 |
| Ch2 病房寻物 | 6 物件点击拾取逻辑 + 终场六物成镜(先代码跑通,美术用灰块代替) |
| 回到 Hub | 完成 Ch2 后回渡口,信物上柱,名册第二页解锁 |
六、跨场景通信机制
6.1 GameManager 单例
- 通过
DontDestroyOnLoad在场景切换时保持存活 - 所有场景通过
GameManager.Instance访问全局状态 Awake()中已有重复检测,确保每个场景只有一个实例
6.2 关键数据流
Prologue_Hub → Chapter_02 流程: ┌──────────────┐ 翻名册点Ch2 ┌────────────┐ │ Prologue_Hub │ ─────────────────→ │ Chapter_02 │ │ │ │ │ │ 读取存档 │ │ 拾取6物件 │ │ 显示已解锁 │ │ 完成拼镜 │ └──────────────┘ └─────┬──────┘ ↑ │ │ TransitionManager │ │ .GoToScene("Prologue_Hub") │ └──────────────────────────────────┘ GameManager 写入: - chapterStates["Ch2"] = true - collectedTokens["绝症少年"] = "六物成镜" - 自动存档 save_auto.json6.3 回渡口后的状态同步
Prologue_Hub 的Start()读取GameManager.Instance.chapterStates:
chapterStates["Ch2"] == true→ 信物上柱、名册第三页解锁、对应光点点亮chapterStates["Ch1"] == true→ 同理(序章完成后解锁第二页)- 重玩模式:已解锁章节可重复进入,不覆盖已有存档(分支存档 branch_xxx.json)
6.4 场景间数据传递
- 不需要传参:所有状态存在 GameManager,目标场景自己读
- 转场入口唯一:
TransitionManager.Instance.GoToScene("场景名") - 存档时机:进入新场景前自动存档,退出章节时手动存档点
七、技术备忘
7.1 关键常量
| 参数 | 值 |
| 设计分辨率 | 480 × 270 |
| 输出缩放 | 等比缩放,短边撑满 |
| Canvas Scaler | Scale With Screen Size, Reference 480×270 |
| Filter Mode | Point (no filter) |
| Pixels Per Unit | 16 |
| Unity 版本 | 2022 LTS |
7.2 移动端适配
| 适配项 | 方案 |
| 分辨率适配 | Canvas Scaler 的 Reference Resolution 设为 480×270,Match 0.5 |
| 安全区 | iPhone X+ 刘海屏:Canvas 子节点加 SafeArea 组件自动偏移 |
| 宽高比差异 | 16:9 与 19.5:9 之间差异小,480×270 设计区域居中,两侧留黑或补背景 |
| 性能基准 | iPhone 6s / 骁龙 660 以上,目标 60fps |
7.3 触控交互
- 世界空间点击:
Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position)) - UI 点击:Unity 自带
EventSystem+IPointerClickHandler,移动端自动兼容 - 拖拽:
IDragHandler/IBeginDragHandler,替换 PC 的OnMouseDrag - 长按:手动计时 TouchPhase.Stationary 时长 ≥ 0.5s
- 多点触控:Ch3 光影拖拽可能需要,用
Input.touchCount > 1处理
7.4 移动端性能指标
| 指标 | 上限 |
| Draw Call | < 50 |
| 纹理内存 | < 200MB |
| 顶点数 | < 10K(像素风天然低) |
| 纹理格式 | ASTC (iOS) / ETC2 (Android) |
| 后处理 | 关闭(像素风无需 Bloom/Motion Blur) |
7.5 转场系统
| faceNoise | 转场效果 | 含义 |
| 4~6 | 像素溶解 | 记忆破碎严重 |
| 2~3 | 模糊聚焦 | 记忆模糊但可追回 |
| 0~1 | 无过渡 | 记忆清晰,直接跳转 |
调用方式:
StartCoroutine(TransitionManager.Instance.GoToScene("Chapter_02"));7.6 存档系统
| 存档类型 | 文件名 | 用途 |
| 自动存档 | save_auto.json | 进入新场景自动触发 |
| 手动存档 | save.json | 玩家手动保存(章节中特定点位) |
| 分支存档 | branch_xxx.json | 多结局重玩时保留不同分支 |
7.7 场景命名规范
Prologue_Hub ← 序章+渡口合一
Chapter_01 ← Ch1 失聪音乐家
Chapter_02 ← Ch2 绝症少年
Chapter_03 ← Ch3 公交车司机
Chapter_04 ← Ch4 战地记者
Chapter_05 ← Ch5 阿兹海默老人
Chapter_06 ← Ch6 乡村教师
Chapter_07 ← Ch7 摆渡人自渡
八、测试计划
8.1 PC Editor 阶段
| 阶段 | 内容 | 通过标准 |
| 单元测试 | 每个章节场景独立 Play,手动走完核心流程 | 无报错,状态正确写入 GameManager |
| 集成测试 | 序章→Ch2→回Hub→Ch3,连续切换场景 | 信物/名册/光点状态一致,存档可读可写 |
| 全流程 | 7章 + 序章连续打通 | 无卡死,所有结局可达 |
8.2 移动端真机测试
| 阶段 | 内容 | 通过标准 |
| 分辨率 | iPhone SE (4"), iPhone 14 Pro (6.1"), iPad (9.7") | Canvas 缩放正确,无裁切/变形 |
| 触控 | 所有交互类型(点击/拖拽/长按) | 无延迟,多点触控无冲突 |
| 安全区 | iPhone X+ 刘海屏 | 按钮不被遮挡 |
| 性能 | Profiler 监控 | 稳定 60fps,Draw Call < 50,无 GC spike |
| 构建 | iOS Xcode + Android Gradle | 构建无报错,APK/IPA 可安装运行 |
九、风险与对策
| 风险 | 对策 |
| 14周完不成七章 | 第6周(8月初)检查:如果跑通章节少于 4 章 → 启动 uni-app 备选方案 |
| 美术量太大(~290张) | 代码阶段全用灰块代替,美术集中到 9月画 |
| 像素溶解噪声图没素材 | 用 Unity 自带 Perlin Noise 生成或网上找免费噪声纹理 |
| GameManager DontDestroy 跳场景重复 | Awake 里已有判断,确保每个场景只有一个 |
| 移动端触控输入未适配 | 8月 W1 集中替换所有Input.GetMouseButtonDown为Input.GetTouch|
| iOS 审核被拒 | 剧情内容提前检查敏感词,避免政治/宗教隐喻 |
| Android 碎片化适配 | 测试 3 款以上主流机型 + 限定最低 Android 8.0 |
十一、备选方案(uni-app)
如果 8月初第6周检查时主项目进度不达标(少于 4 章完成):
技术方案
| 项目 | 选择 |
| 框架 | uni-app + Vue 3 |
| 平台 | 微信小程序(iOS + Android 基于此分发) |
| 内容形态 | 世界观展示 + 剧情文本 + 简易 H5 互动 |
模块规划
首页
└── 六角色设定 + 概念图展示
剧情页
└── 每个角色故事文本版(原游戏剧本改编)
互动页(简易 H5)
└── 寻物:图片热点点击
└── 拼图:CSS transform 格子拖拽
└── 填色:Canvas 色盘点击
关于
└── 开发者信息 + 跳转原项目链接
*最后更新:2025年6月24日*