基于网格的移动系统
MCE 使用构建在 Unity Tilemap 之上的基于图块的网格移动系统。玩家和 NPC 在离散 的网格上一次移动一个图块,碰撞检测、地形效果和跨地图过渡都由网格系统处理。

玩家始终恰好位于一个图块上。没有半步,也没有图块内的位置, 正因为如此,遭遇、碰撞和跨地图过渡才是可判定的,而不是 近似的。
核心组件
GridController
GridController 是每个场景的图块网格管理器。它与 Unity 的 Grid 位于同一个 GameObject 上(它需要一个 Grid),并且:
- 找到场景的 Tilemap,并跨它们回答图块查询,从排序顺序最高的到最低的。
- 从项目的
TileData资产读取每个图块的移动类型(参见自定义图块类型)。 - 跟踪注册在网格上的角色和演员。
- 保存场景的
SceneInfo(见下文)。 - 回答碰撞查询:角色能否移动到这个图块,能否从这个图块出发?
每个地图场景在其网格根节点上有一个 GridController。
MCECharacterController
MCECharacterController 处理网格上任意角色(玩家、NPC 或怪物)的移动:
- 对齐网格的移动:角色每一步恰好移动一个图块。
- 四方向移动:上、下、左、右。没有斜向移动。
- 精灵渲染:更新精灵朝向和行走动画。
- 碰撞检查:每次移动之前查询
GridController。 - 移动速度:
Speed,单位为秒每图块(默认 0.25)。
PlayerCharacter
PlayerCharacter 在控制器之上添加玩家专属功能:
- 输入处理(键盘和手柄)。
- 交互触发(面对 NPC/对象时按下动作键)。
- 野生遭遇处理、驱虫步数和步数计数器(
GlobalGameData.StepsTaken,它同时驱动孵蛋周期和亲密度)。 - 奔跑、骑行和游泳。
- 跟随怪物的协调以及表情快捷键。
GlobalGridManager
GlobalGridManager 处理跨地图导航:
- 保存已加载网格的列表,并找到在某个世界位置有图块的网格,使角色能从一张地图走进相邻的地图。
- 以叠加方式加载当前地图的邻居,以及这些邻居的邻居(两跳深度),因此穿过中间的地图不会卸载你来的那张。
- 当角色从一个网格跨到另一个网格时,移交玩家。
图块类型
每个图块资产都有一个移动类型(TileType),在 TileData 资产中分配:
| TileType | 说明 |
|---|---|
NonExistent | 图块没有数据;视为虚空 |
Walkable | 普通地面 |
NonWalkable | 实心障碍物(墙壁、树木、岩石) |
Jumpable | 断崖:通过朝一个方向跳跃越过 |
Bridge | 桥面,层叠在其下方内容之上 |
BridgeEntrance | 地面与桥之间的过渡图块 |
Water | 需要游泳才能渡过的水 |
Waterfall | 可以攀爬的垂直水流 |
Slippery | 冰面:角色会一直滑行,直到撞上障碍物 |
WalkableNotBikable | 步行可通过,但自行车不行 |
在类型之上,图块行为(图块预制体上的组件)添加逻辑:EncounterTile 标记野生遭遇区域,OneWayJumpableTile 设置断崖方向,ForceCharacterToKeepMoving 制作传送带和洋流,还有 TallGrass、LadderUp、WaterfallEdge、WhirlwindInDirection 等。它们都在自定义图块类型中有说明。