You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Unity中实现玩家碰撞Tile时自动删除Tile的技术咨询

嘿,我来给你梳理下怎么实现玩家碰撞Tile时自动删除的功能~你已经搞定了鼠标点击删除的核心逻辑,现在只需要把获取Tile位置的方式换成碰撞触发的逻辑就行,具体步骤如下:

玩家碰撞自动删除Tile的实现思路

1. 配置玩家的碰撞触发组件

首先得让玩家能检测到和Tile的接触:

  • 给玩家对象添加Collider2D(比如BoxCollider2DCircleCollider2D),勾选面板里的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,设置为SpriteGrid,这样每个放置到Tilemap上的Tile都会自动生成碰撞体
  • 去Unity的标签管理器里新建一个DirtTile标签,然后给生成的Tile碰撞体统一打上这个标签(如果是批量生成的Tile,也可以通过代码批量设置标签)

额外小提示

  • 如果需要玩家持续接触时一直删除Tile,可以把OnTriggerEnter2D换成OnTriggerStay2D,不过大多数场景下Enter就足够,避免误删
  • 一定要记得在编辑器里把dirtTilemap拖拽到脚本的对应字段,不然会出现空引用报错
  • 如果你的Tilemap是动态生成的,记得确认碰撞体也会被正确创建

这样改完之后,玩家只要碰到Tile,就能自动触发删除逻辑啦,核心就是把“鼠标位置转Tile坐标”换成“碰撞位置转Tile坐标”,复用你已经写好的删除代码就行~

内容的提问来源于stack exchange,提问作者Lasse

火山引擎 最新活动