如何简化网格角色攻击覆盖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);
逻辑说明
- 对角线方向:比如
up+right((1,1,0)),对应的附加偏移是-x(-1,0,0)和-y(0,-1,0),完全匹配原逻辑中的left和down - 轴向方向:如果是上下方向(y分量非0),附加左右偏移;如果是左右方向(x分量非0),附加上下偏移,和原逻辑行为完全一致
这种方式只用两次分支判断,没有重复的Add操作,后续维护成本更低。
内容的提问来源于stack exchange,提问作者FlamesWillBurst
相关产品推荐
相关产品推荐

