如何在运行时向Unity Tilemap添加可编写脚本的磁贴?

时间:2017-12-22 04:50:36

标签: unity3d

我试图在运行时将我的一个可编写脚本的磁贴添加到Unity Tilemap中。我可以在编辑器中绘制磁贴,一切看起来都很好,但我想在运行时添加它。

我尝试了实例化ScriptableObject资产本身,但它没有生成的tile资源在编辑器中所需的正确精灵。另外,我不相信我应该为每个磁贴实例化ScriptableObject资产,因为一个资产是为地图上所有相同的磁贴共享的。

Tilemap API提供了一种添加图块的方法,但没有提供如何创建图块的说明或示例。

3 个答案:

答案 0 :(得分:0)

这有点偏离我的头脑,但是昨天我正在弄乱类似的东西,点击实例化瓷砖。

Vector3Int tilePos = map.WorldToCell(mousePos);

    YourTileClass tileInstance = ScriptableObject.CreateInstance<YourTileClass>();

    Texture2D tex = Resources.Load<Texture2D>("tileTexture") as Texture2D;

    Sprite sprite = new Sprite();

    sprite = Sprite.Create(tex, new Rect(0, 0, 400, 400), new Vector2(0.5f, 0.5f));

    Tile tile = Resources.Load<Tile>("tileInstance") as Tile;

    tileInstance .sprite = sprite;

    yourTileMap.SetTile(tilePos , tile);

如果这是最好的方式,我不是100%,但它对我有用。如果这不起作用,请告诉我,我会仔细检查实际文件。

答案 1 :(得分:0)

对不起,我无法发表评论,但不知道您到目前为止已经尝试过什么,您是否尝试过在检查器中分配规则块,然后在需要时在运行时使用SetTile进行分配?从声音上看,这应该可以实现您想要做的事情

public Tilemap tilemap;
public MyRuleTile myRuleTile;

tilemap.SetTile(coordinate, myRuleTile);

答案 2 :(得分:0)

假设您的ScriptableObjectTileBase对象继承,您可以执行以下操作:

 public Tilemap tilemap; 
 public TileBase tileToDraw; //Object to draw at runtime

 //Get tilemap position from the worldposition
 Vector3Int tilemapReferencePosition = tilemap.WorldToCell(reference.transform.position);//this can be the position of another gameObject e.g your Player or MousePosition

roadTileMap.SetTile(tilemapReferencePosition, tileToDraw);

我最近在Fire Emblem风格的RPG中使用了类似的东西,我想在施放咒语之前画出可以施放咒语的所有可能方向,最后得到以下功能

public void DrawPreAttack(GameObject reference, Spell spell) {
    Vector3Int gridReferencePos = preAttackTileMap.WorldToCell(reference.transform.position);
    foreach (Vector2 direction in spell.validDirections) {
        for (int i = 0; i <= spell.maxDistance; i++) {
            preAttackTileMap.SetTile(new Vector3Int(gridReferencePos.x + (i * (int)direction.x) , gridReferencePos.y + (i * (int)direction.y) , 0), preAttackTile);
        }
    }
}