0%

Unity_Tilemap关于SetColor等坑的记录

涉事代码

1
2
3
4
5
6
7
8
9
10
11
12
void Update()
{
if (Input.GetMouseButtonDown(0))
{
var pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Debug.Log(pos);
var posInt = tileMap.WorldToCell(pos) + new Vector3Int(0,0,10);
Debug.Log(posInt);
tileMap.SetColor(posInt,Color.red);// BUG
Debug.Log(tileMap.HasTile(posInt)+" "+tileMap.GetSprite(posInt)+" "+tileMap.GetColor(posInt));
}
}

事故描述

tileMap.SetColor(posInt,Color.red);// BUG 不工作

解决方案

  1. 刷新瓦片 tileMap.RefreshTile(posInt); ERROR
  2. 解锁瓦片 tileMap.RemoveTileFlags(posInt,TileFlags.LockColor); WORK

解决流程

先尝试在 SetColorRefreshTile 无果

接着在 SetColorRemoveTileFlags 无果

尝试移除 RefreshTile 成功

问题分析

Tile 来自 Asset 而非代码动态创建,导致 Tile 处于被锁状态

RefreshTile 会将 Tile 颜色恢复为 Asset 中配置的颜色

最终代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Update()
{
if (Input.GetMouseButtonDown(0))
{
var pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Debug.Log(pos);
var posInt = tileMap.WorldToCell(pos)+ new Vector3Int(0,0,10);
Debug.Log(posInt);
tileMap.RemoveTileFlags(posInt,TileFlags.LockColor);// WORK
tileMap.SetColor(posInt,Color.red);
// tileMap.RefreshTile(posInt); // ERROR
Debug.Log(tileMap.HasTile(posInt)+" "+tileMap.GetSprite(posInt)+" "+tileMap.GetColor(posInt));
}
}

参考资料

Unity 中基于 Tilemap 的战争迷雾实现踩坑指南 - 哔哩哔哩 (bilibili.com)

Bug - Tilemap.SetColor 问题(不执行任何操作) - Unity 论坛 — Bug - Tilemap.SetColor issue (does nothing) - Unity Forum

Tilemaps.Tilemap - Unity 脚本 API

欢迎关注我的其它发布渠道