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

如何简化网格角色攻击覆盖3格位置的方向判断代码?

简化网格角色攻击Tile覆盖逻辑

我有一个网格中的角色,攻击会固定覆盖3个Tile,Tile位置依赖角色位置。现有代码能正常运行,但逻辑重复过多,想找更简洁无重复的实现方式(不用switch语句),其中角落方向的处理比较棘手。原代码如下:

Vector3Int fromPoint = Vector3Int.zero;
Vector3Int direction = Vector3Int.RoundToInt(Vector3.Normalize(atPoint - fromPoint));

retiacalTiles.Add(atPoint);

if (direction == Vector3Int.up)
{
    retiacalTiles.Add(atPoint + Vector3Int.left);
    retiacalTiles.Add(atPoint + Vector3Int.right);
}
if (direction == Vector3Int.up + Vector3Int.right)
{
    retiacalTiles.Add(atPoint + Vector3Int.left);
    retiacalTiles.Add(atPoint + Vector3Int.down);
}
if (direction == Vector3Int.right)
{
    retiacalTiles.Add(atPoint + Vector3Int.up);
    retiacalTiles.Add(atPoint + Vector3Int.down);
}
if (direction == Vector3Int.right + Vector3Int.down)
{
    retiacalTiles.Add(atPoint + Vector3Int.left);
    retiacalTiles.Add(atPoint + Vector3Int.up);
}
if (direction == Vector3Int.down)
{
    retiacalTiles.Add(atPoint + Vector3Int.left);
    retiacalTiles.Add(atPoint + Vector3Int.right);
}
if (direction == Vector3Int.left + Vector3Int.down)
{
    retiacalTiles.Add(atPoint + Vector3Int.right);
    retiacalTiles.Add(atPoint + Vector3Int.up);
}
if (direction == Vector3Int.left)
{
    retiacalTiles.Add(atPoint + Vector3Int.up);
    retiacalTiles.Add(atPoint + Vector3Int.down);
}
if (direction == Vector3Int.left + Vector3Int.up)
{
    retiacalTiles.Add(atPoint + Vector3Int.right);
    retiacalTiles.Add(atPoint + Vector3Int.down);
}

优化方案

观察原逻辑的规律后,可以通过方向分量判断统一处理所有情况,彻底消除重复代码:

Vector3Int fromPoint = Vector3Int.zero;
Vector3Int direction = Vector3Int.RoundToInt(Vector3.Normalize(atPoint - fromPoint));

retiacalTiles.Add(atPoint);

Vector3Int offset1, offset2;

// 处理对角线方向(x和y分量都非0)
if (direction.x != 0 && direction.y != 0)
{
    offset1 = new Vector3Int(-direction.x, 0, 0);
    offset2 = new Vector3Int(0, -direction.y, 0);
}
// 处理轴向方向(仅x或仅y分量非0)
else
{
    if (direction.y != 0)
    {
        // 上下方向,附加左右两个Tile
        offset1 = Vector3Int.left;
        offset2 = Vector3Int.right;
    }
    else
    {
        // 左右方向,附加上下两个Tile
        offset1 = Vector3Int.up;
        offset2 = Vector3Int.down;
    }
}

retiacalTiles.Add(atPoint + offset1);
retiacalTiles.Add(atPoint + offset2);

逻辑说明

  1. 对角线方向:比如up+right((1,1,0)),对应的附加偏移是-x(-1,0,0)和-y(0,-1,0),完全匹配原逻辑中的left和down
  2. 轴向方向:如果是上下方向(y分量非0),附加左右偏移;如果是左右方向(x分量非0),附加上下偏移,和原逻辑行为完全一致

这种方式只用两次分支判断,没有重复的Add操作,后续维护成本更低。

内容的提问来源于stack exchange,提问作者FlamesWillBurst

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 21:37:33