跳到主要内容

网格移动系统

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)绘制你的地图:

  1. Ground 图层:基础地形(路径、草地、泥土、水岸)。
  2. GroundOverlay 图层:地面上的装饰(花朵、岩石、阴影)。
  3. Collision 图层:标记不可通行的地块(墙壁、树木、巨石)。

步骤 3:添加 GridController

  1. 选择 Grid 根 GameObject。
  2. 添加 GridController 组件。
  3. 它将自动检测 Tilemap 图层并构建碰撞地图。

步骤 4:配置 SceneInfo

每个地图场景需要一个 SceneInfo 组件(或 SceneInfoAsset ScriptableObject):

字段描述
Scene Name地点的显示名称(显示在标题栏)
Region此地图所属的区域
Scene Tag用于游戏逻辑的标签(例如"Cave"、"Town"、"Route")
BGM此地图的背景音乐
Wild Encounters此地图的默认遭遇配置

特殊地形

桥梁

桥梁允许角色在通常不可通行的地块(如水面)上行走:

  1. 创建一个排序顺序更高的桥梁 Tilemap 图层。
  2. 在步道跨越水面的位置添加桥梁地块。
  3. 将这些地块的 TileType 设为 Bridge
  4. 角色踏上桥梁时将在桥梁图层上行走。

桥梁逻辑自动处理 Z 排序——角色渲染在水面之上但在桥梁栏杆之下。

滑冰地块(冰面)

在冰面地块上,角色沿移动方向滑行直到碰到墙壁或非冰面地块:

  1. 将冰面地块的 TileType 设为 Slippery
  2. MCECharacterController 将覆盖输入并继续移动方向。
  3. 添加墙壁或障碍物以创建冰面谜题布局。

悬崖

悬崖是单向地块——角色可以跳下但不能爬回:

  1. TileType 设为 Ledge 并配置方向(角色跳跃的方向)。
  2. 角色越过悬崖时播放短跳动画。
  3. 悬崖通常用于在路线中创建捷径。

瀑布

瀑布可以使用相应的 HM 或特性攀爬:

  1. 将瀑布地块的 TileType 设为 Waterfall
  2. 配置所需的特性或 HM。
  3. 当玩家面对瀑布并使用该特性时,角色上升。

跨地图切换

传送设置

连接两个地图:

  1. 在源地图的边缘或门口放置一个传送地块传送 Actor

  2. 配置传送参数:

    • Target Scene:要加载的场景。
    • Target Position:玩家在目标场景中出现的位置(地块坐标)。
    • Target Direction:传送后玩家面对的方向。
    • Transition Type:淡入淡出、门、洞穴入口等。
  3. 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 方向行走循环图集。

最佳实践

  1. 保持碰撞图层一致。对所有不可通行地形使用相同的碰撞地块。
  2. 双向测试传送连接。确保可以从 A 到 B 以及从 B 回到 A。
  3. 使用 SceneTag 进行遭遇逻辑。不要硬编码地图名称,而是将地图标记为"Cave"、"Water"、"Forest"等。
  4. 优化大型地图。非常大的 Tilemap(>200x200)可能影响性能。考虑拆分为多个连接的场景。
  5. 使用手柄测试。网格移动在键盘和手柄上都应该感觉灵敏。