我正在使用 Isometric Tilemap 来制作我的游戏地图。
我正在使用统一 2018 3.5f 版本。
但是每个指南都说只使用调色板,但我的游戏瓷砖地图有点动态。因此,我可以在运行时(动态地)在 tilemap 中添加、更改和删除图块。我必须从地图 xml 文件中读取瓦片数据。所以我可以通过编程添加瓷砖。作为参考,有一个“setTile()”方法。但是没有关于使用它的正确示例。我应该先创建 tile 游戏对象并将其拖到 prefabs 文件夹中以使其成为 tile prefab。我必须像这样使用?
setTile(position , TilePrefab.Instantiate());
Run Code Online (Sandbox Code Playgroud)
我可以得到一些关于如何使用 setTile 以编程方式添加图块的示例。而且我是 unity 的新手,所以如果你介意的话,请提供更多关于 tilemap 的提示或建议(随便什么)。
ugl*_*ote 26
这似乎根本不是一个“新手”问题。很明显,您只想以编程方式而不是通过编辑器放置磁贴。
我遇到了同样的问题,因为我想根据地形生成器填充我的瓷砖。令我惊讶的是,文档在这方面如此缺乏,而且那里的每个教程似乎都假设您是手工编写磁贴布局。
以下是对我有用的内容:
第一个片段没有回答你的问题,但这是我的测试代码,以棋盘格图案放置交替的瓷砖(我只有两个瓷砖,“水”和“土地”)
for (int x = 0; x < 10; x++)
{
    for (int y = 0; y < 10; y++)
    {
        Vector3Int p = new Vector3Int(x,y,0);
        bool odd = (x + y) % 2 == 1;
        Tile tile = odd ? water : land;
        tilemap.SetTile(p, tile);
    }
}
Run Code Online (Sandbox Code Playgroud)
为了获得 a 的实例Tile,我发现有两种不同的方法有效:
方法 1:使用 Editor 将 Tiles 连接到属性
在MonoBehaviour您编写代码以编程方式生成 tile 布局的类中,公开一些公共属性:
public Tile water;
public Tile land;
Run Code Online (Sandbox Code Playgroud)
然后在 Unity Inspector 中,将出现这些字段。如果您按下这些属性旁边的小靶心,它将打开一个“选择平铺”窗口,您应该能够在其中看到您之前添加到平铺调色板的任何平铺
方法 2:以编程方式从 Resources 文件夹中的 Texture 创建 Tile
如果您有很多不同的磁贴类型,如上所述手动连接属性可能会变得乏味和烦人。
此外,如果您有一些想要在代码中利用的图块的智能命名方案,则使用第二种方法可能更有意义。(例如,也许您有四种水和四种土地,分别称为 water_01、water_02、water_03、water_04、land_01 等,然后您可以轻松编写一些代码来加载所有纹理“water_”+n 的 n 从 1 到numVariants)。
以下是我从另存为的 128x128 纹理加载和创建 Tile 的方法Assets/Resources/Textures/water.png:
Tile water = new Tile();
Texture2D texture = Resources.Load<Texture2D>("Textures/water") as Texture2D;
water.sprite = Sprite.Create(texture,
    new Rect(0, 0, 128, 128), // section of texture to use
    new Vector2(0.5f, 0.5f), // pivot in centre
    128, // pixels per unity tile grid unit
    1,
    SpriteMeshType.Tight,
    Vector4.zero
);
Run Code Online (Sandbox Code Playgroud)
        小智 7
一年后我偶然发现了这个问题,并且不得不对uglycoyote的答案进行调整以使其与RuleTiles一起使用,所以我想我应该发布我必须做出的更改,以防万一其他人找到这个答案。
好消息是您也可以通过这种方式实现 RuleTiles!Tile我必须创建属性,而TileBase不是创建属性,如下所示:
public TileBase water;
public TileBase grass;
Run Code Online (Sandbox Code Playgroud)
另外,在同一个类中,创建一个Tilemap属性并将其公开,如下所示:
public Tilemap tileMap;
Run Code Online (Sandbox Code Playgroud)
现在,进入检查器并将图块(无论是 RuleTiles 还是普通图块)拖动到公开的图块属性中,然后将图块地图从层次结构视图拖动到公开的tileMap 属性中。这为您提供了此类中对该tileMap 对象的引用。
从这里开始,就像创建一个for循环来填充图块地图一样简单:
for(int x = 0; x < 10; x++) {
    for(int y = 0; y < 10; y++) {
        tileMap.SetTile(new Vector3Int(x, y, 0), grass);
    }
}
Run Code Online (Sandbox Code Playgroud)
例如,上面将创建一个仅包含草块的 10x10 地图,但您可以在嵌套for循环内执行任何您想要的操作。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           10745 次  |  
        
|   最近记录:  |