Unity中实现玩家碰撞Tile时自动删除Tile的技术咨询
嘿,我来给你梳理下怎么实现玩家碰撞Tile时自动删除的功能~你已经搞定了鼠标点击删除的核心逻辑,现在只需要把获取Tile位置的方式换成碰撞触发的逻辑就行,具体步骤如下:
玩家碰撞自动删除Tile的实现思路
1. 配置玩家的碰撞触发组件
首先得让玩家能检测到和Tile的接触:
- 给玩家对象添加Collider2D(比如
BoxCollider2D或CircleCollider2D),勾选面板里的Is Trigger选项(我们只需要检测接触事件,不需要物理碰撞的反馈) - 给玩家对象加上
Rigidbody2D,根据你的游戏需求调整Gravity Scale(如果是2D平台游戏就保持正常重力,要是俯视类游戏可以设为0),确保触发器能正常工作
2. 编写碰撞检测脚本(挂载到玩家身上)
在脚本里监听触发器的进入事件,当玩家碰到Tile时,获取对应Tile的位置并删除:
using UnityEngine; using UnityEngine.Tilemaps; public class PlayerTileDestroyer : MonoBehaviour { public Tilemap dirtTilemap; // 在Unity编辑器里拖拽你的dirtTilemap到这里 private void OnTriggerEnter2D(Collider2D other) { // 先判断碰撞的是不是我们要删除的Tile(给Tile的碰撞体加个专属标签,比如"DirtTile") if (other.CompareTag("DirtTile")) { // 获取碰撞点的世界坐标 Vector3 contactWorldPos = other.ClosestPoint(transform.position); // 把世界坐标转换成Tilemap的单元格坐标(这步和你鼠标点击的逻辑一样!) Vector3Int tileCellPos = dirtTilemap.WorldToCell(contactWorldPos); // 删除Tile dirtTilemap.SetTile(tileCellPos, null); // 可选:如果Tile有对应的实体碰撞对象,顺便销毁它 Destroy(other.gameObject); } } }
3. 给Tile配置碰撞体和标签
- 打开你的Tile资源文件,在Inspector面板里找到
Collider Type,设置为Sprite或Grid,这样每个放置到Tilemap上的Tile都会自动生成碰撞体 - 去Unity的标签管理器里新建一个
DirtTile标签,然后给生成的Tile碰撞体统一打上这个标签(如果是批量生成的Tile,也可以通过代码批量设置标签)
额外小提示
- 如果需要玩家持续接触时一直删除Tile,可以把
OnTriggerEnter2D换成OnTriggerStay2D,不过大多数场景下Enter就足够,避免误删 - 一定要记得在编辑器里把
dirtTilemap拖拽到脚本的对应字段,不然会出现空引用报错 - 如果你的Tilemap是动态生成的,记得确认碰撞体也会被正确创建
这样改完之后,玩家只要碰到Tile,就能自动触发删除逻辑啦,核心就是把“鼠标位置转Tile坐标”换成“碰撞位置转Tile坐标”,复用你已经写好的删除代码就行~
内容的提问来源于stack exchange,提问作者Lasse




