Unity脚本中如何读取多层Tilemap获取点击位置的瓦片信息?
多Tilemap图层点击检测解决方案
核心思路
将需要检测的所有Tilemap存入一个列表,鼠标点击时遍历该列表,逐个检查对应网格位置的瓦片,收集所有存在的瓦片信息,适配后续新增的高层modifier图层需求。
实现步骤
- 替换单个
Tilemap变量为List<Tilemap>类型,在Unity Inspector面板中添加所有需要检测的图层(如地面层、房屋层、未来的modifier层)。 - 通过鼠标位置转换得到统一的网格坐标(所有Tilemap的网格坐标对齐,只需转换一次)。
- 遍历列表内的每个Tilemap,检测对应坐标是否存在瓦片,收集有效瓦片数据。
示例代码
using UnityEngine; using UnityEngine.Tilemaps; using System.Collections.Generic; public class MultiTilemapClickDetector : MonoBehaviour { // 在Inspector面板添加所有需要检测的Tilemap图层 public List<Tilemap> targetTilemaps; void Update() { if (Input.GetMouseButtonDown(0)) { // 获取鼠标世界位置,Z轴对齐Tilemap的Z值保证坐标转换正确 Vector3 worldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); if (targetTilemaps.Count > 0) { worldPos.z = targetTilemaps[0].transform.position.z; } // 转换为网格坐标 Vector3Int cellPos = targetTilemaps[0].WorldToCell(worldPos); // 遍历所有Tilemap收集瓦片 List<TileBase> clickedTiles = new List<TileBase>(); foreach (Tilemap tilemap in targetTilemaps) { TileBase tile = tilemap.GetTile(cellPos); if (tile != null) { clickedTiles.Add(tile); Debug.Log($"检测到图层[{tilemap.name}]的瓦片:{tile.name}"); // 此处可添加瓦片类型判断、业务逻辑处理 } } // 对收集到的瓦片做后续处理,比如按图层优先级执行逻辑 if (clickedTiles.Count > 0) { // 示例:优先处理上层瓦片(按列表顺序) TileBase topTile = clickedTiles[clickedTiles.Count - 1]; } } } }
注意事项
- 确保所有Tilemap的网格设置一致(单元格大小、原点对齐),否则坐标转换会出现偏差。
- 新增图层时,直接在Inspector的
targetTilemaps列表中添加即可,无需修改代码逻辑。 - 可调整列表内Tilemap的顺序,按渲染层级从下到上排列,方便优先处理高层瓦片。
内容的提问来源于stack exchange,提问作者lsKakashi
相关产品推荐
相关产品推荐

