引擎版本:Godot 4.8.dev(当前环境)| 渲染器:2D CanvasItem | 地图规模:单张超大 TileMapLayer
模块总览依赖图
P0(地基) P1(核心功能) P2(扩展/打磨)
─────────────────────────────────────────────────────────────────────────────
GameManager (Autoload)
│
├──► WorldMapManager ───► ZoneSystem ──────────────────────────────────► DayNightAtmosphere
│ │
│ ├──► CollisionManager
│ │
│ └──► CameraController ───────────────────────────────────────► CameraZoom
│
├──► PlayerController
│ │
│ └──► InteractionSystem ──► DoorSystem ──► BuildingInteriorSystem ──► MultiLevelSupport
│ │
│ └──► WorldOverviewMap
│
└──► UIManager ────────────────────────────────────────────────────────► CustomMarkerSystem
P0 模块(地基,必须最先做)
模块 1:GameManager(全局游戏状态管理)
| 项目 | 内容 |
|---|
| 开发目标 | 全局单例 Autoload,管理游戏生命周期、场景加载状态、玩家数据总线 |
| Godot 节点 | Node(Autoload 注册为 GameManager) |
| 功能要点 | • 全局信号总线(player_spawned、zone_entered、map_changed)<br>• 游戏状态枚举(MENU / PLAYING / PAUSED / MAP_OPEN)<br>• 玩家坐标持久缓存(供 UI、总览地图查询)<br>• 全局设置(音量、分辨率、控制模式) |
| 依赖项 | 无(最先创建) |
模块 2:WorldMapManager(超大世界地图底座)
| 项目 | 内容 |
|---|
| 开发目标 | 单张超大连续 TileMap 地图,含六大区域 + 道路 + 远景 |
| Godot 节点 | Node2D(根节点)<br>├─ TileMapLayer(Ground 地面层,TileSet 含 6 区域 tile)<br>├─ TileMapLayer(Deco 装饰层:草、花、石头)<br>├─ TileMapLayer(Obstacle 阻挡层:山、大树、水域、建筑墙基)<br>├─ TileMapLayer(Road 道路层,绘制区域间连接路)<br>├─ Node2D(远景层:视差滚动山脉云雾)<br>└─ Node2D(ZoneMarkers:6 个区域的 Area2D 触发器) |
| 功能要点 | • TileSet 制作:统一 16×16 或 32×32 像素网格<br>• 地图尺寸预估:至少 400×300 tile(根据内容量调整)<br>• 六大区域物理划分(Area2D + CollisionShape2D 矩形区域)<br>• 远景山脉用 ParallaxBackground 或纯 ColorRect + Shader 云雾效果<br>• TileMapLayer 的 collision_layer / collision_mask 精确控制阻挡 |
| 优先级 | P0 |
| 依赖项 | GameManager |
模块 3:CollisionManager(碰撞与阻挡)
| 项目 | 内容 |
|---|
| 开发目标 | 统一管理世界阻挡逻辑,山体/建筑/大树/水域/边界 |
| Godot 节点 | 嵌入 WorldMapManager 中<br>• TileMapLayer(Obstacle 层,启用碰撞)<br>• StaticBody2D(世界边界 4 面墙)<br>• CollisionShape2D(矩形,包围整个地图外缘) |
| 功能要点 | • Godot 4.x TileMapLayer 自带碰撞通道,直接在 TileSet 里给阻挡 tile 勾 Collision<br>• 水域:单独 TileSet 图层 + CollisionPolygon2D,或用 Area2D 做浅水/深水区分<br>• 世界边界:StaticBody2D 围四边,玩家 CharacterBody2D 撞上去自然停止<br>• 建筑外墙:TileMapLayer 绘制墙体 tile(带碰撞),室内墙独立处理 |
| 优先级 | P0 |
| 依赖项 | WorldMapManager |
模块 4:PlayerController(玩家移动与碰撞)
| 项目 | 内容 |
|---|
| 开发目标 | 角色在开放世界自由移动,支持键盘 + 点击移动,受碰撞约束 |
| Godot 节点 | CharacterBody2D<br>├─ Sprite2D(或 AnimatedSprite2D,像素角色 4 向行走动画)<br>├─ CollisionShape2D(CapsuleShape2D 或 RectangleShape2D,脚底对齐)<br>├─ Camera2D(当前模式:position_smoothing_enabled=true)<br>├─ RayCast2D(脚底检测,可拓展地形区分)<br>└─ State(脚本内状态机:Idle / Walk / Run / EnterBuilding) |
| 功能要点 | • 键盘 WASD / 方向键 → move_and_slide() 四向移动<br>• 点击移动:get_global_mouse_position() + create_navigation_agent() 或简单 _unhandled_input 中设置目标点 + Tween 匀速行进(有碰撞检查则停下)<br>• 相机跟随:Camera2D 直接挂在 Player 下,当前够用;P2 再拆成独立 CameraController<br>• 朝向判定:根据移动方向 flip Sprite2D(水平方向)+ 切换 4 向动画帧<br>• 碰撞层设置:Player collision_layer=1, 与 Obstacle 层 mask 对齐 |
| 优先级 | P0 |
| 依赖项 | CollisionManager |
P1 模块(核心玩法,依赖 P0 地基)
模块 5:CameraController(独立相机系统)
| 项目 | 内容 |
|---|
| 开发目标 | 从 Player 节点剥离,支持跟随 + 边界限制 + 过渡动画 |
| Godot 节点 | Camera2D(独立 Node,不挂 Player 下) |
| 功能要点 | • make_current() 激活<br>• position_smoothing_enabled = true,smooth_amount 0.05~0.1<br>• limit_left/right/top/bottom 绑定地图边界,防止看空<br>• 跟随 Player:_process 中 global_position = player.global_position + 偏移<br>• 建筑内切换:进入室内后 limit 收缩到建筑范围,淡出淡入过渡<br>• zoom 属性预留给 P2 总览/缩放功能 |
| 优先级 | P1 |
| 依赖项 | PlayerController、WorldMapManager |
模块 6:InteractionSystem(通用交互框架)
| 项目 | 内容 |
|---|
| 开发目标 | 统一的"靠近 → 交互提示 → 按键触发"模式,门、NPC、工作台共用 |
| Godot 节点 | 纯脚本框架(无需独立场景),PlayerController 内嵌入<br>• Area2D(Player 脚下交互检测区域)<br>• CollisionShape2D(圆形,半径 48~64 px) |
| 功能要点 | • Player 身上的 Area2D 监控 body_entered / body_exited<br>• 可交互物体统一实现 IInteractable 接口(interact() 方法 + prompt_text 属性)<br>• 最近交互对象高亮 + UI 弹出提示("按 E 进入")<br>• Input.is_action_just_pressed("interact") 触发 |
| 优先级 | P1 |
| 依赖项 | PlayerController |
模块 7:DoorSystem(建筑门交互)
| 项目 | 内容 |
|---|
| 开发目标 | 建筑入口门,靠近显示"进入"提示,按键进入室内 |
| Godot 节点 | 每个门一个实例<br>StaticBody2D(门框阻挡)<br>├─ Sprite2D(门贴图)<br>├─ CollisionShape2D(阻挡玩家进入门内)<br>└─ 挂载 IInteractable 脚本 + Area2D(可选,精细触发) |
| 功能要点 | • 正常状态:门作为 StaticBody2D 阻挡玩家穿过<br>• 交互触发:interact() 发出信号 door_entered,携带 building_id<br>• 进出方向:记录进入方向,退出时面朝正确方向<br>• 门的视觉状态:关闭 / 打开(Sprite2D 切换) |
| 优先级 | P1 |
| 依赖项 | InteractionSystem |
模块 8:BuildingInteriorSystem(无缝室内系统)
| 项目 | 内容 |
|---|
| 开发目标 | 玩家进入建筑不切场景,墙体自动半透明/隐藏,家具可交互 |
| Godot 节点 | Node2D(BuildingRoot,每栋建筑一个实例)<br>├─ TileMapLayer(建筑内墙层)<br>├─ TileMapLayer(建筑内墙 Collision 层)<br>├─ TileMapLayer(家具装饰层)<br>├─ Area2D(建筑范围触发器)<br>├─ DoorSystem[](所有门实例)<br>└─ Workbench[](家具交互物,工作台等) |
| 功能要点 | • 不切场景核心:室内外 TileMapLayer 在同一 Node2D 树下,切换时仅改 TileMapLayer 的 modulate.a 和 Collision 是否启用<br>• 墙体遮挡逻辑:<br> - 在 BuildingRoot 上挂一个 ShaderMaterial,实时检测 Camera2D 中心是否在建筑 Area2D 内<br> - 若 Camera 在室外、Player 也在室外 → 内墙层 modulate.a = 1.0(正常显示)<br> - 若 Player 在建筑 Area2D 内 → 内墙层 + 外墙 TileMapLayer modulate.a = 0.3~0.5 半透明,玩家能看到内部<br> - 彻底隐藏墙体也可:内墙层 visible = false<br>• 家具:StaticBody2D(阻挡)+ Sprite2D + IInteractable(工作台打开 UI 等)<br>• 多层建筑:P2 模块,P1 先做单层<br>• 建筑边界碰撞:建筑外墙 TileMapLayer 带碰撞,内墙独立控制 |
| 优先级 | P1 |
| 依赖项 | DoorSystem、CameraController、WorldMapManager |
模块 9:ZoneSystem(区域识别系统)
| 项目 | 内容 |
|---|
| 开发目标 | 玩家进入不同区域时弹出区域名称提示(森林、农场、村庄、河流、工坊、城堡山谷) |
| Godot 节点 | 嵌入 WorldMapManager<br>• Area2D(6 个区域各一个,覆盖区域范围)<br> └─ RectangleShape2D<br> └─ 区域元数据脚本(zone_name、zone_color、zone_icon) |
| 功能要点 | • Area2D body_entered 检测 Player → 触发 zone_entered 信号<br>• 防重入:记录 current_zone_id,同一区域内反复进入不重复弹<br>• 区域边界模糊区:Area2D 之间可有 1~2 tile 重叠,信号触发时优先最具体区域<br>• 弹出 UI:UIManager 接管,底部或顶部淡入 |
| 优先级 | P1 |
| 依赖项 | WorldMapManager、PlayerController、UIManager |
模块 10:WorldOverviewMap(总览地图系统)
| 项目 | 内容 |
|---|
| 开发目标 | 玩家随时按 M 打开世界总览,显示整张地图缩略图 + 玩家位置 + 重要地点标记 + 拖拽缩放 |
| Godot 节点 | CanvasLayer(Overlay,最顶层)<br>├─ Control(全屏半透明背景遮罩)<br>├─ SubViewport / TextureRect(地图缩略图渲染)<br>├─ Camera2D(专门用于渲染总览世界的正交相机,挂在独立 WorldOverview 场景上)<br>├─ Node2D(MarkersContainer)<br>│ ├─ Sprite2D(Player 当前位置标记,红色箭头)<br>│ ├─ Sprite2D[](重要地点标记:城堡、工坊、桥梁等)<br>│ └─ Sprite2D[](自定义目标点标记)<br>└─ Control(UI 层:缩放按钮、关闭按钮) |
| 功能要点 | • 总览渲染方案:创建独立 WorldOverview.tscn,内容是同一张 WorldMapManager 的 TileMapLayer,但用一个超大 Camera2D 从正上方完整拍摄 → 渲染到 SubViewport → TextureRect 显示<br>• 拖动平移:InputEventMouseButton(右键按住)偏移总览相机位置,不影响主游戏<br>• 缩放:InputEventMouseWheel 改总览 Camera2D 的 zoom<br>• 玩家位置实时标记:每帧把 Player 的 global_position 转换为总览坐标更新箭头 Sprite2D<br>• 重要地点标记:ZoneSystem 触发时记录坐标,总览上绘制固定图标<br>• 开关:Input.is_action_just_pressed("toggle_map") → 切换 CanvasLayer.visible<br>• 开关时暂停 / 恢复:GameManager.state = PAUSED / PLAYING |
| 优先级 | P1 |
| 依赖项 | GameManager、WorldMapManager、ZoneSystem、PlayerController |
模块 11:UIManager(UI 管理中枢)
| 项目 | 内容 |
|---|
| 开发目标 | 统一管理所有游戏 UI:按钮、弹出提示、交互提示、区域名称 |
| Godot 节点 | CanvasLayer(独立 UI 层,总 index 设高)<br>├─ Control(HUD 根节点,全屏锚点)<br>│ ├─ Button(总览地图开关按钮)<br>│ ├─ Label(坐标显示,可选)<br>│ └─ PanelContainer(交互提示容器,靠近门时显示"按 E 进入")<br>├─ Control(ZoneBanner,底部弹出区域名)<br>└─ Control(MapCanvasLayer,WorldOverviewMap 的父层) |
| 功能要点 | • 交互提示:订阅 InteractionSystem 的信号,动态更新 PanelContainer 文字 + 显示/隐藏<br>• 区域名称弹窗:订阅 ZoneSystem 的 zone_entered,Label 淡入显示 2~3 秒后淡出<br>• 总览开关按钮:绑定 WorldOverviewMap 的 visible 切换<br>• 全部 UI 使用 Godot Theme 统一像素风风格 |
| 优先级 | P1 |
| 依赖项 | GameManager、InteractionSystem、ZoneSystem、WorldOverviewMap |
P2 模块(扩展 / 打磨)
模块 12:MultiLevelBuilding(多层建筑支持)
| 项目 | 内容 |
|---|
| 开发目标 | 建筑内楼梯上下层切换,每层独立 TileMapLayer |
| Godot 节点 | BuildingRoot 下增加<br>• TileMapLayer[](每层一套内墙 + 家具层)<br>• Area2D[](楼梯触发器)<br>• Camera2D(每层独立 limit,切层时过渡动画) |
| 功能要点 | • 楼梯 Area2D 触发切层 → 切换当前层 TileMapLayer 的 visible<br>• Camera2D limit 平滑过渡到新层范围 |
| 优先级 | P2 |
| 依赖项 | BuildingInteriorSystem、CameraController |
模块 13:CustomMarkerSystem(玩家自定义目标标记)
| 项目 | 内容 |
|---|
| 开发目标 | 玩家在总览地图上右键点击放置自定义目标点,地图上显示标记 |
| Godot 节点 | 嵌入 WorldOverviewMap<br>• Node2D(CustomMarkers 容器)<br>• Sprite2D + Label(每个标记实例) |
| 功能要点 | • 总览地图上右键 → 记录坐标 → 生成标记 Sprite2D + 可编辑 Label<br>• 数据存 GameManager.custom_markers 数组 |
| 优先级 | P2 |
| 依赖项 | WorldOverviewMap、GameManager |
模块 14:DayNightAtmosphere(昼夜与氛围)
| 项目 | 内容 |
|---|
| 开发目标 | 远景山脉云雾 + 昼夜色调渐变 + 区域氛围微调 |
| Godot 节点 | 嵌入 WorldMapManager<br>• ParallaxBackground(远景山脉 + 云雾层)<br>• ColorRect(全屏昼夜色调遮罩,挂 Camera2D 下的 CanvasLayer)<br>• Shader(云雾动画) |
| 功能要点 | • ParallaxBackground 多层不同 scroll_base_offset 产生深度感<br>• ColorRect modulate 根据游戏时间 Tween 颜色(白天偏蓝、黄昏偏橙、夜晚偏紫) |
| 优先级 | P2 |
| 依赖项 | WorldMapManager、CameraController |
模块 15:WorldBoundaryIndicator(世界边界视觉提示)
| 项目 | 内容 |
|---|
| 开发目标 | 玩家靠近地图边缘时视觉提示,防止"卡墙"体验差 |
| Godot 节点 | 嵌入 WorldMapManager 的 CollisionManager |
| 功能要点 | • 边界 CollisionShape2D 同时作为 Area2D,Player 靠近时触发<br>• UI 弹出提示 + 轻微屏幕边缘颜色加深 |
| 优先级 | P2 |
| 依赖项 | CollisionManager、PlayerController、UIManager |
开发阶段建议
Week 1 (P0 全部)
└─ GameManager → WorldMapManager → CollisionManager → PlayerController
(先画一张空白地图 + 玩家能动 + 撞墙停下 = 可玩 Demo)
Week 2 (P1 核心)
└─ CameraController → InteractionSystem → DoorSystem → BuildingInteriorSystem
ZoneSystem → UIManager
(玩家能进门、区域弹名、交互提示齐全 = 完整交互 Demo)
Week 3 (P1 最后 + P2 开始)
└─ WorldOverviewMap(总览地图)
MultiLevel → CustomMarker → Atmosphere → BoundaryIndicator
关键节点选型总结:
| 场景 | 推荐节点 | 替代/备注 |
|---|
| 超大地图地面 | TileMapLayer | Godot 4.x 新 API,比旧 TileMap2D 更灵活 |
| 玩家角色 | CharacterBody2D | 2D 游戏标准选择,自带 move_and_slide |
| 相机跟随 | Camera2D | PlayerController 内嵌或独立 CameraController |
| 交互检测 | Area2D | 挂 Player 身上,检测周围 IInteractable |
| 建筑门 | StaticBody2D | 平时阻挡,交互时可开门动画 |
| 墙体半透明 | modulate.a + ShaderMaterial | 比切换 visible 更平滑 |
| 总览地图 | SubViewport + Camera2D | 独立渲染通路,不影响主游戏 |
| 远景 | ParallaxBackground | 多层视差产生深度感 |