我试图在运行时将我的一个可编写脚本的磁贴添加到Unity Tilemap中。我可以在编辑器中绘制磁贴,一切看起来都很好,但我想在运行时添加它。
我尝试了实例化ScriptableObject资产本身,但它没有生成的tile资源在编辑器中所需的正确精灵。另外,我不相信我应该为每个磁贴实例化ScriptableObject资产,因为一个资产是为地图上所有相同的磁贴共享的。
Tilemap API提供了一种添加图块的方法,但没有提供如何创建图块的说明或示例。
答案 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)
假设您的ScriptableObject
从TileBase
对象继承,您可以执行以下操作:
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);
}
}
}