在Unity中从Tilemap获取邻居

时间:2018-11-15 13:50:21

标签: c# unity3d

我正在使用六角形图块,并试图在每个图块上存储数据; localPos,worldPos,名称等,我尝试访问的内容之一是双方的直接邻居。 我从这里开始使用脚本开始:

https://medium.com/@allencoded/unity-tilemaps-and-storing-individual-tile-data-8b95d87e9f32

但是我找不到有关存储邻居的任何信息。我假设它可能与BoundsInt或cellBounds有关,但不确定并且文档目前受到限制。

我尝试做的一件事是使用世界位置创建游戏对象,并将其放置在应该放置的位置,但是我想可能会使它过于复杂。

其他人对此有好运吗?

2 个答案:

答案 0 :(得分:1)

我在寻找获取给定图块的 6 个邻居的公式时发现了这个问题。 对于这个网格:

enter image description here

原来公式取决于当前节点的y坐标是偶数还是奇数。这是对我有用的代码;

static Vector3Int
    LEFT = new Vector3Int(-1, 0, 0),
    RIGHT = new Vector3Int(1, 0, 0),
    DOWN = new Vector3Int(0, -1, 0),
    DOWNLEFT = new Vector3Int(-1, -1, 0),
    DOWNRIGHT = new Vector3Int(1, -1, 0),
    UP = new Vector3Int(0, 1, 0),
    UPLEFT = new Vector3Int(-1, 1, 0),
    UPRIGHT = new Vector3Int(1, 1, 0);

static Vector3Int[] directions_when_y_is_even = 
      { LEFT, RIGHT, DOWN, DOWNLEFT, UP, UPLEFT };
static Vector3Int[] directions_when_y_is_odd = 
      { LEFT, RIGHT, DOWN, DOWNRIGHT, UP, UPRIGHT };

public IEnumerable<Vector3Int> Neighbors(Vector3Int node) {
    Vector3Int[] directions = (node.y % 2) == 0? 
         directions_when_y_is_even: 
         directions_when_y_is_odd;
    foreach (var direction in directions) {
        Vector3Int neighborPos = node + direction;
        yield return neighborPos;
    }
}

答案 1 :(得分:0)

如果遵循上面的文章,也许使每个对象调用的另一个函数都能做到这一点。让函数将GameObjects或位置本身存储在您选择的某些数据结构内的当前“ anchor”图块中。尽管这可能比较麻烦,但可以提供更大的灵活性。

TL; DR
在GameTile中,为存储的邻居添加另一个数据结构。然后创建一个私有函数实例化邻居,或者在被跟踪的x和y位置直接创建邻居。然后将实例化的邻居存储到数据结构中。