Unity2D运行时Tilemap绘制Tile:Scene视图可见,Game视图无显示
解决Unity运行时Tilemap绘制Tile在Game视图不显示的问题
核心问题分析
运行时通过代码绘制的Tile仅在Scene视图可见,Game视图不显示,但编辑模式手动放置的Tile正常,且已排除排序层问题,大概率是鼠标坐标转换时的Z轴偏差导致Tile被放置在Tilemap的渲染平面外。
解决方案
1. 修正鼠标世界坐标的Z轴(最可能解决问题)
ScreenToWorldPoint会使用屏幕坐标的Z值(默认0)转换世界坐标,而2D正交相机通常在Z轴负方向,导致转换后的世界坐标Z与Tilemap所在平面(通常Z=0)不一致,WorldToCell会计算到错误的Cell层,Game视图无法渲染该层的Tile。
修改代码中的坐标转换部分:
if (Input.GetMouseButton(0)) { Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); // 强制将Z轴设置为Tilemap所在平面的Z值(根据你的Tilemap位置调整,通常为0) mouseWorldPos.z = tilemap.transform.position.z; Vector3Int cellPos = tilemap.WorldToCell(mouseWorldPos); tilemap.SetTile(cellPos, tile); tilemap.RefreshTile(cellPos); }
2. 确保Tile渲染数据被正确刷新
如果单块Tile刷新无效,尝试替换RefreshTile为全局刷新(仅在必要时使用,避免性能问题):
tilemap.SetTile(cellPos, tile); // 替换单个刷新为全局刷新 tilemap.RefreshAll();
3. 检查Tilemap Renderer的设置
在Inspector中选中Tilemap的Tilemap Renderer组件:
- 确保Use Per Tile Data选项处于勾选状态,保证运行时设置的Tile能读取自身渲染数据
- 确认Tilemap组件的Cell Size与Tile的尺寸匹配,避免Tile被压缩或偏移
4. 显式设置Tile的渲染标志
部分情况下,Tile的默认标志会导致渲染异常,可添加代码强制开启渲染:
tilemap.SetTile(cellPos, tile); // 清除所有可能限制渲染的Tile标志 tilemap.SetTileFlags(cellPos, TileFlags.None); tilemap.RefreshTile(cellPos);
内容的提问来源于stack exchange,提问作者Bry793
相关产品推荐
相关产品推荐

