Unity房间生成系统死胡同识别异常问题求助
问题排查与解决方案
核心问题原因
计数未重置
roomCorridorCount变量在遍历每个房间前没有重置为0,导致后续房间的计数是之前所有房间的累加值,完全偏离实际走廊连接数量。比如第一个房间统计出1条走廊,第二个房间即使有2个连接方向,计数会变成3,无法被正确判定;若第一个房间计数为2,第二个房间无连接,计数仍为2,会被误判为非死胡同。同一方向走廊重复计数
遍历所有走廊格子时,同一个房间的单一连接方向(比如右侧)如果有多个连续的走廊 tile,会被多次触发计数。例如房间右侧有3个走廊格子,代码会让roomCorridorCount加3,而实际该房间只有1个连接方向,本该是死胡同却被错误排除。
修复后的代码实现
HashSet<Vector2Int> corridors = ConnectRooms(roomCenters); HashSet<Vector2Int> deadEnds = new HashSet<Vector2Int>(); HashSet<Vector2Int> nearRoomCenter = new HashSet<Vector2Int>(); HashSet<Vector2Int> oneCorridorRooms = new HashSet<Vector2Int>(); // 定义四个方向的偏移量 Vector2Int[] directions = new Vector2Int[] { Vector2Int.right, Vector2Int.left, Vector2Int.up, Vector2Int.down }; foreach (var room in newRoomCenters) { int roomCorridorCount = 0; // 每个房间遍历前重置计数 foreach (var dir in directions) { Vector2Int checkPos = room + dir; if (corridors.Contains(checkPos)) { roomCorridorCount++; nearRoomCenter.Add(checkPos); // 每个方向只统计一次,避免重复计数 continue; } } if (roomCorridorCount == 1) { deadEnds.Add(room); oneCorridorRooms.Add(room); } } // 后续渲染逻辑保持不变 tilemapVisualizer.PaintTiles(corridors, floorMap, white); tilemapVisualizer.PaintTiles(newRoomCenters, floorMap, green); tilemapVisualizer.PaintTiles(nearRoomCenter, floorMap, orange); tilemapVisualizer.PaintTiles(oneCorridorRooms, floorMap, pink); floor.UnionWith(corridors); if(deadEnds.Count > 0) { var playerSpawnRoom = deadEnds.ElementAt(Random.Range(0, deadEnds.Count)); } Debug.Log(deadEnds.Count);
额外优化建议
如果你的房间是矩形区域(而非仅中心一个点),建议改为检查房间边缘的所有格子是否与走廊连接,而不是仅房间中心的四个方向。这样能避免因走廊连接到房间边缘而非中心,导致死胡同漏判的情况。例如:
- 先为每个房间存储其所有占据的格子集合
- 遍历房间的边缘格子,检查是否有相邻的走廊格子
- 统计该房间有多少个不同的连接方向(上下左右),若为1则判定为死胡同
内容的提问来源于stack exchange,提问作者Spacter
相关产品推荐
相关产品推荐

