涉事代码
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); Debug.Log(tileMap.HasTile(posInt)+" "+tileMap.GetSprite(posInt)+" "+tileMap.GetColor(posInt)); } }
|
事故描述
tileMap.SetColor(posInt,Color.red);// BUG
不工作
解决方案
- 刷新瓦片
tileMap.RefreshTile(posInt);
ERROR
- 解锁瓦片
tileMap.RemoveTileFlags(posInt,TileFlags.LockColor);
WORK
解决流程
先尝试在 SetColor
后 RefreshTile
无果
接着在 SetColor
前 RemoveTileFlags
无果
尝试移除 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); tileMap.SetColor(posInt,Color.red); 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