You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

根据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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:21:00