You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何删除Tilemap瓦片?火箭碰撞销毁指定半径内瓦片

问题:碰撞时销毁Tilemap指定半径内的瓦片无效

你当前的实现无效,核心问题是不能直接用Destroy()处理TileBase对象,而且错误地用了强转坐标的方式,正确的做法是通过Tilemap的API移除对应位置的瓦片,具体修正如下:

错误原因

  1. TileBase是ScriptableObject类型,直接调用Destroy(x)不会把它从Tilemap中移除,甚至静态创建的Tile资源不应该被销毁(会导致其他地方引用失效)
  2. 直接把世界坐标强转为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:57:43