根据2D方向向量计算需暴露象限 实现Tilemap迷雾动态解锁
实现思路
首先对齐象限预设规则(和你描述的移动暴露逻辑完全匹配):
- Q1:右上象限,对应移动方向x≥0、y≥0
- Q2:左上象限,对应移动方向x≤0、y≥0
- Q3:左下象限,对应移动方向x≤0、y≤0
- Q4:右下象限,对应移动方向x≥0、y≤0
核心逻辑是通过方向向量x、y分量的符号匹配对应的象限,8方向移动的分量只有-1/0/1三种取值,不需要额外做范围校验。
代码实现
首先确保你的象限常量定义和上面的规则对齐,然后实现统一的CreateDirectionDetail方法:
private void CreateDirectionDetail(Vector2Int dir) { int xSign = Math.Sign(dir.x); int ySign = Math.Sign(dir.y); List<QuadrantDetail> quadrants = new List<QuadrantDetail>(); // 处理y轴正方向(向上)相关象限 if (ySign >= 0) { if (xSign >= 0) quadrants.Add(quadrantDetails[Constants.QUADRANT_ONE]); if (xSign <= 0) quadrants.Add(quadrantDetails[Constants.QUADRANT_TWO]); } // 处理y轴负方向(向下)相关象限 if (ySign <= 0) { if (xSign <= 0) quadrants.Add(quadrantDetails[Constants.QUADRANT_THREE]); if (xSign >= 0) quadrants.Add(quadrantDetails[Constants.QUADRANT_FOUR]); } // 下标偏移逻辑和你原有实现一致,将-1~1映射为0~2的数组索引 directionDetails[dir.x + 1, dir.y + 1] = new DirectionDetail(quadrants.ToArray()); }
如果你的DirectionDetail构造函数原本只接收2个象限参数,也可以直接按索引取值,8个方向的返回结果最多2个象限,不会超出参数限制:
// 替换上面的赋值逻辑即可 directionDetails[dir.x + 1, dir.y + 1] = new DirectionDetail(quadrants[0], quadrants.Count > 1 ? quadrants[1] : null);
调用方式
直接按你期望的方式批量初始化所有方向即可:
CreateDirectionDetail(Vector2Int.up); CreateDirectionDetail(Vector2Int.up + Vector2Int.left); CreateDirectionDetail(Vector2Int.up + Vector2Int.right); CreateDirectionDetail(Vector2Int.left); CreateDirectionDetail(Vector2Int.right); CreateDirectionDetail(Vector2Int.down); CreateDirectionDetail(Vector2Int.down + Vector2Int.left); CreateDirectionDetail(Vector2Int.down + Vector2Int.right);
可选优化
如果追求极致性能,也可以预先做一个符号到位移的映射表,因为x、y的符号组合一共只有9种(包含零向量),查表速度更快,但对于只有8个方向的初始化场景,上面的判断逻辑性能已经完全足够,可读性也更高。
内容的提问来源于stack exchange,提问作者cerestorm
相关产品推荐
相关产品推荐

