每个Tilemap平铺数据存储和检索

问题描述 投票:1回答:1

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

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

  1. 不要使用Unity的Tilemap,而是手动构建tile,而不是通过GameObjects和sprites列表。然后将我可能需要的任何类型的模型作为脚本附加到所述GO上。这样可以非常简单地为每个磁贴添加逻辑。缺点是构建地图会更烦人。
  2. 使用Unity的Tilemap,但手动跟踪代码中的每个特殊节点磁贴。毋庸置疑,这不是一个非常有吸引力的工作流程,因为每当地图发生变化时,变化都需要反映在代码映射/列表/数组中
  3. 覆盖Unity的Tiles(就像2d extras包一样)并为每个特殊的tile创建一个规则tile。在阅读图块并编译字典时,请检查图块的类型,并根据您当前正在查看的图块类型指定任何特殊属性。规则图块可以是可视图块,也可以绘制在视觉图块图下方的图块图上,该图块仅用于存储其上方地图的信息。
  4. (3.1)执行与上面相同的操作,但不使用特殊规则切片,而是将任何特殊切片分隔到他们自己的特殊Tilemaps上。然后读取每个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属性,但我还没有看到任何使用它的例子。

unity3d
1个回答
1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.