网格移动系统
MCE 使用基于 Unity Tilemap 构建的基于地块的网格移动系统。玩家和 NPC 在离散网格上每次移动一个地块,碰撞检测、地形效果和跨地图切换均由网格系统处理。
核心组件
GridController
GridController 是每个场景的地块网格管理器。它:
- 维护当前场景的碰撞地图。
- 追踪哪些地块可行走、被阻挡或具有特殊属性。
- 处理基于地块的碰撞查询(角色能否移动到 X,Y 地块?)。
- 管理遭遇、传送和特殊地形的地块数据。
每个场景在其网格/Tilemap 根节点上都有一个 GridController。
MCECharacterController
MCECharacterController 处理网格上任何角色(玩家或 NPC) 的移动:
- 网格对齐移动:角色每步精确移动一个地块。
- 四方向移动:上、下、左、右。不支持对角线移动。
- 精灵图渲染:自动更新精灵图方向和行走动画。
- 碰撞检测:每次移动前查询
GridController。 - 移动速度:可配置的行走速度,支持可选的奔跑。
PlayerCharacter
PlayerCharacter 扩展了 MCECharacterController,添加了玩家特定的功能:
- 输入处理(键盘和手柄)。
- 交互触发(面向 NPC/物体时按下互动按钮)。
- 遭遇步数计数。
- 奔跑/骑行速度修正。
- 跟随怪兽协调。
GlobalGridManager
GlobalGridManager 处理跨地图导航:
- 管理在场景之间切换的传送地块。
- 处理连接地图的叠加场景加载。
- 在切换过程中保持玩家状态。
- 管理加载画面/淡入淡出过渡。
地块类型
MCE 支持多种地块行为:
| 地块类型 | 描述 | 实现方式 |
|---|---|---|
| 普通 | 标准可行走地块 | 默认 |
| 阻挡 | 不可行走 | 碰撞 Tilemap 图层 |
| 草地 | 可行走,触发遭遇检查 | EncounterTile 组件 |
| 水面 | 需要冲浪才能通过 | TileType.Water |
| 悬崖 | 只能单向通过(向下跳) | TileType.Ledge + 方向 |
| 桥梁 | 允许在不同图层的地块上行走 | TileType.Bridge |
| 滑冰(冰面) | 角色滑行直到碰到障碍物 | TileType.Slippery |
| 瀑布 | 使用特定 HM 可攀爬 | TileType.Waterfall |
| 传送 | 切换到另一个场景 | 传送配置 |
| 旋转 | 强制角色向某个方向旋转 | TileType.Spinning |
设置地图
步骤 1:创建 Tilemap 结构
MCE 地图使用标准的 Unity Tilemap 层级结构:
Grid(Grid 组件)
└── Ground(Tilemap、TilemapRenderer、排序顺序 0)
└── GroundOverlay(Tilemap、TilemapRenderer、排序顺序 1)
└── Collision(Tilemap、TilemapCollider2D)
└── Encounters(EncounterTile 组件)
└── Actors(NPC GameObject)
步骤 2:绘制地图
使用 Tile Palette(Window > 2D > Tile Palette)绘制你的地图:
- Ground 图层:基础地形(路径、草地、泥土、水岸)。
- GroundOverlay 图层:地面上的装饰(花朵、岩石、阴影)。
- Collision 图层:标记不可通行的地块(墙壁、树木、巨石)。
步骤 3:添加 GridController
- 选择 Grid 根 GameObject。
- 添加
GridController组件。 - 它将自动检测 Tilemap 图层并构建碰撞地图。
步骤 4:配置 SceneInfo
每个地图场景需要一个 SceneInfo 组件(或 SceneInfoAsset ScriptableObject):
| 字段 | 描述 |
|---|---|
| Scene Name | 地点的显示名称(显示在标题栏) |
| Region | 此地图所属的区域 |
| Scene Tag | 用于游戏逻辑的标签(例如"Cave"、"Town"、"Route") |
| BGM | 此地图的背景音乐 |
| Wild Encounters | 此地图的默认遭遇配置 |
特殊地形
桥梁
桥梁允许角色在通常不可通行的地块(如水面)上行走:
- 创建一个排序顺序更高的桥梁 Tilemap 图层。
- 在步道跨越水面的位置添加桥梁地块。
- 将这些地块的
TileType设为Bridge。 - 角色踏上桥梁时将在桥梁图层上行走。
桥梁逻辑自动处理 Z 排序——角色渲染在水面之上但在桥梁 栏杆之下。
滑冰地块(冰面)
在冰面地块上,角色沿移动方向滑行直到碰到墙壁或非冰面地块:
- 将冰面地块的
TileType设为Slippery。 MCECharacterController将覆盖输入并继续移动方向。- 添加墙壁或障碍物以创建冰面谜题布局。
悬崖
悬崖是单向地块——角色可以跳下但不能爬回:
- 将
TileType设为Ledge并配置方向(角色跳跃的方向)。 - 角色越过悬崖时播放短跳动画。
- 悬崖通常用于在路线中创建捷径。
瀑布
瀑布可以使用相应的 HM 或特性攀爬:
- 将瀑布地块的
TileType设为Waterfall。 - 配置所需的特性或 HM。
- 当玩家面对瀑布并使用该特性时,角色上升。
跨地图切换
传送设置
连接两个地图:
-
在源地图的边缘或门口放置一个传送地块或传送 Actor。
-
配置传送参数:
- Target Scene:要加载的场景。
- Target Position:玩家在目标场景中出现的位置(地块坐标)。
- Target Direction:传送后玩家面对的方向。
- Transition Type:淡入淡出、门、洞穴入口等。
-
GlobalGridManager处理场景切换:- 屏幕淡出。
- 卸载当前场景。
- 以叠加方式加载目标场景。
- 将玩家放置在目标位置。
- 屏幕淡入。
地图连接(无缝)
对于直接连接的地图(例如路线 1 在北端连接路线 2):
- 沿整个连接边缘放置传送地块。
- 将所有传送设为相同的目标场景和对应位置。
- 使用快速淡入淡出进行过渡。
玩家移动配置
在 PlayerCharacter 组件上:
| 字段 | 描述 | 默认值 |
|---|---|---|
| Walk Speed | 行走时每秒移动的地块数 | 4 |
| Run Speed | 奔跑时每秒移动的地块数 | 8 |
| Bike Speed | 骑行时每秒移动的地块数 | 12 |
| Can Run | 玩家是否可以奔跑(B 键) | true |
| Has Bike | 玩家是否已解锁自行车 | false |
| Step Counter | 追踪遭遇和孵蛋的总步数 | 自动 |
怪兽跟随
MCE 支持跟随系统,玩家队伍中的第一只怪兽在大世界中跟随玩家行走:
MonsterFollowerController管理跟随者的位置和精灵图。- 跟随者沿玩家的移动路径行走,延迟一个地块。
- 跟随者精灵图在
MonsterEntry中按物种配置。 - 玩家可以与其跟随者互动(转身并按互动按钮)查看趣味文字反应。
如果某个怪兽物种没有分配大世界 跟随者精灵图,跟随者将不会出现。使用 Art Studio 生成跟随者精灵表,或手动创建 4 方向行走循环图集。
最佳实践
- 保持碰撞图层一致。对所有不可通行地形使用相同的碰撞地块。
- 双向测试传送连接。确保可以从 A 到 B 以及从 B 回到 A。
- 使用 SceneTag 进行遭遇逻辑。不要硬编码地图名称,而是将地图标记为"Cave"、"Water"、"Forest"等。
- 优化大型地图。非常大的 Tilemap(>200x200)可能影响性能。考虑拆分为多个连接的场景。
- 使用手柄测试。网格移动在键盘和手柄上都应该感觉灵敏。