Unity中如何删除Tilemap瓦片?火箭碰撞销毁指定半径内瓦片
问题:碰撞时销毁Tilemap指定半径内的瓦片无效
你当前的实现无效,核心问题是不能直接用Destroy()处理TileBase对象,而且错误地用了强转坐标的方式,正确的做法是通过Tilemap的API移除对应位置的瓦片,具体修正如下:
错误原因
TileBase是ScriptableObject类型,直接调用Destroy(x)不会把它从Tilemap中移除,甚至静态创建的Tile资源不应该被销毁(会导致其他地方引用失效)- 直接把世界坐标强转为int得到单元格坐标,会因为Tilemap的锚点、缩放等出现位置偏差,应该用Tilemap自带的坐标转换方法
修正后的代码
public void OnCollisionEnter2D(Collision2D collision) { // 将火箭的世界坐标转换为Tilemap的单元格坐标 Vector3Int centerPos = Tl.WorldToCell(transform.position); // 定义3x3的范围(半径1的正方形区域,可按需调整尺寸) BoundsInt destroyBounds = new BoundsInt(centerPos - new Vector3Int(1,1,0), new Vector3Int(3,3,1)); // 遍历范围内的每个单元格位置 foreach (Vector3Int cellPos in destroyBounds.allPositionsWithin) { // 移除该位置的瓦片 Tl.SetTile(cellPos, null); // 仅当你的TileBase是动态创建的实例时,才需要加这行销毁(静态资源别加) // Destroy(Tl.GetTile(cellPos)); } Destroy(gameObject); }
关键说明
- 用
Tl.WorldToCell()转换坐标,确保获取的是Tilemap中正确的单元格位置 - 遍历
destroyBounds.allPositionsWithin获取每个单元格坐标,能精准对应到要移除的位置 SetTile(cellPos, null)是Tilemap移除瓦片的标准方式,会直接从地图中清除该位置的瓦片显示
内容的提问来源于stack exchange,提问作者user21182433
相关产品推荐
相关产品推荐

