每个图块图块数据存储和检索

时间:2019-03-25 00:21:36

标签: unity3d

我有一个场景,我需要了解有关tilemap中所有tile的某些信息。从我所做的研究和其他人提出的问题来看,这可能不是最容易的事情。

据我所知,我面临3种可能的选择:

  1. 不要使用Unity的Tilemap,而是通过GameObjects和Sprite列表手动构建瓦片。然后将我可能需要的带有自定义值的任何类型的模型作为脚本附加到所述GO。这将使向每个图块添加逻辑变得非常简单。不利的一面是,构建地图会更加烦人。

  2. 使用Unity的Tilemap,但手动跟踪代码中的每个特殊节点图块。不用说,这不是一个非常有吸引力的工作流程,因为任何时候地图更改,更改都需要反映在代码map / list / array

  3. 中。
  4. 覆盖Unity的Tiles(就像2d extras包一样),并为每个特殊的tile创建一个规则tile。在阅读磁贴并编写字典时,请检查磁贴的类型并根据您当前正在查看的磁贴的类型分配任何特殊属性。规则图块可以是可视图块,也可以画在仅用于存储其上方地图信息的可视图块地图下的图块地图上。

  5. (3.1)进行与上述相同的操作,但不要使用特殊的规则图块,而是将任何特殊的图块分离到其自己的特殊Tilemap上。然后通读每个tilemap并编译一个字典,该字典跟踪任何特殊的tile及其特殊属性。

当前我正在使用以下内容:

private void GetWorldTiles ()   { 
    tiles = new Dictionary<Vector3, WorldTile>();       
    foreach (Vector3Int pos in Tilemap.cellBounds.allPositionsWithin)       {
        var localPlace = new Vector3Int(pos.x, pos.y, pos.z); 
        if (!Tilemap.HasTile(localPlace)) continue;
        var tile = new WorldTile
        {   
            LocalPlace = localPlace,
            WorldLocation = Tilemap.CellToWorld(localPlace),
            TileBase = Tilemap.GetTile(localPlace),
            TilemapMember = Tilemap,
            Name = localPlace.x + "," + localPlace.y,
            Cost = 1 // Cost is needed for pathfinding. Other properties may also exist such as "isSpawnPoint", or what have you.
        };                      
        tiles.Add(tile.WorldLocation, tile); //tiles is a Dictionary<string, WorldTile>
    }
}

上面的代码摘自这个简短的教程here

我地图的内容将是半随机的。例如,玩家角色将在每个地图上具有专用的生成点,但是敌人角色将在允许其生成的任何图块上随机生成。某些瓷砖也将生成诸如宝物箱之类的东西,而其他瓷砖将具有特殊的属性,例如只有水单位才能穿越的水瓷砖等。

现在,这是一个简单的地图,所有的精灵都作为占位符。简而言之,六边形图块是障碍物,而X形图块是也无法通过的墙,显示了地图的边界(最终产品地图的大小可能会有所不同)

Simple Example Tilemap

该游戏将使用广度优先搜索算法,以允许战术风格的基于回合的移动,因此至关重要的是,我知道哪些瓷砖会由于某种原因而成为障碍。

如果您有任何问题,我很乐意回答。

其他信息

我还看到Tiles引用了gameObject属性,但是我还没有看到使用此示例的任何示例。

1 个答案:

答案 0 :(得分:1)

对于每种类型的基本地形,您的磁贴图中可以有一个图层,然后在每个地形图层上附加一个脚本,该脚本指定允许哪些类型的单位输入属于该图层的瓦片。一些空间可能具有重叠的图块层。例如,山脉可能有一个“陆地”图块和一个“山”图块。

然后,当您进行寻路计算时,您仅考虑具有至少一个图块的空间(以防止单位从地图上移动),并且允许单位类型输入该空间上的每种图块类型。像这样:

public class TerrainLayer : MonoBehaviour
{
    public bool canAirUnitsEnter;
    public bool canLandUnitsEnter;
    public bool canSeaUnitsEnter;
}

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

相关问题