IEnumerable<Vector3Int> GetNeighbours(Vector3Int cell){
var yEven = cell.y % 2 == 0;
yield return cell + new Vector3Int(+1, +0, 0); //горизонтальный правый
yield return cell + new Vector3Int(-1, +0, 0); //горизонтальный левый
yield return cell + new Vector3Int(+0, +1, 0); //диагональный верхний (для чётного ряда - правый, для нечётного - левый)
yield return cell + new Vector3Int(+0, -1, 0); //диагональный нижний (для чётного ряда - правый, для нечётного - левый)
yield return cell + yEven
? new Vector3Int(-1, +1, 0) //чётный ряд, диагональный верхний левый
: new Vector3Int(+1, +1, 0); //нечётный ряд, диагональный верхний правый
yield return cell + yEven
? new Vector3Int(-1, -1, 0) //чётный ряд, диагональный нижний левый
: new Vector3Int(+1, -1, 0); //нечётный ряд, диагональный нижний правый
}
或者,例如,像这样(如果您需要,例如,一个数组):
Vector3Int[] GetNeighbours(Vector3Int cell) => new [] {
cell + new Vector3Int(+1, +0, 0),
cell + new Vector3Int(+0, +1, 0),
cell + new Vector3Int(-1, +0, 0),
cell + new Vector3Int(+0, -1, 0),
cell + cell.y % 2 == 0 ? new Vector3Int(-1, +1, 0) : new Vector3Int(+1, +1, 0),
cell + cell.y % 2 == 0 ? new Vector3Int(-1, -1, 0) : new Vector3Int(+1, -1, 0)
};
我自己想出来的。
TL;博士
所以(如果需要惰性评估):
或者,例如,像这样(如果您需要,例如,一个数组):
这里发生了什么?
这与 Unity 和 Tilemap 无关,它基本上是关于使用直角坐标作为六边形网格。在规则网格中,单元格排列如下:
像这样的六边形(也是矩形,但伪装得很好):
也就是说,奇数行向右移动,使得每个单元格的相邻单元格不超过六个。沿 x 轴(水平)的邻居将始终以相同的方式计算,因为 他们在同一行。Y(对角线)中不同行的邻居的计算方式不同。因为行在不同方向上相对于彼此移动。