【问题标题】:Per Tilemap Tile Data Storage & Retrieval每个 Tilemap Tile 数据存储和检索
【发布时间】:2019-03-25 00:21:35
【问题描述】:

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

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

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

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

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

  4. (3.1) 执行与上述相同的操作,但不使用特殊规则图块,而是将任何特殊图块分隔到它们自己的特殊图块地图上。然后通读每个图块地图并编译一个字典,记录任何特殊图块及其特殊属性。

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

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图块是墙,也是无法通过的,显示出地图的边界(最终产品地图大小可能会有所不同)

游戏将使用广度优先搜索算法来实现战术风格的回合制移动,因此我知道哪些图块会因某种原因成为障碍是至关重要的。

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

附加信息

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

【问题讨论】:

  • 如何在您的 tilemap 通用瓦片上创建一层,为 X 瓦片创建一层,为水瓦片创建一层等?
  • 是的,这就是我在第 4 点中所暗示的。感谢您的洞察力。你认为这是做事的好方法吗?
  • 我想我在我的游戏中正在做一些与你相似的事情,这就是我正在做的事情。我正在使用 A* 算法进行代理寻路,因此我必须在我的代码中知道我的代理允许继续前进的图块。当我加载一个场景时,我会解析场景的瓦片地图并根据该信息创建一个探路者网格。我还没有制作只能通过某些类型的代理的水/空气类型的图块,但是您可以通过附加一个脚本来解决这个问题,该脚本标记哪些类型的单元可以传递给每个图块层。
  • 我也很难在网上找到很多关于 Unity 瓦片地图的信息。
  • 我做了很多研究。似乎没有很多人在做你和我正在努力完成的事情。感谢您的洞察力。我会让这家伙一试,看看结果如何。

标签: unity3d


【解决方案1】:

你可以在你的瓦片地图中为每种类型的基本地形设置一个图层,并为每个地形图层附加一个脚本,指定允许哪些类型的单位进入属于该图层的瓦片。一些空间可能有重叠的瓦片层。例如,山脉可能有一个“土地”板块和一个“山”板块。

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

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

【讨论】:

    猜你喜欢
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    相关资源
    最近更新 更多