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

Unity3D网格系统检测跨多Tile GameObject的实现问题

解决1×3 GameObject覆盖多Tile的检测问题

嘿,这个问题我熟!咱们来一步步搞定它~之前只检测到中间Tile,大概率是你的代码只拿了对象的中心坐标去匹配Tile,而1×3的GameObject其实横跨了三个Tile,所以得换个思路:用对象的包围盒来找出所有被覆盖的Tile。

下面是具体的实现步骤和代码示例:

1. 获取GameObject的世界空间包围盒

不管你的对象有没有旋转、缩放,用Renderer.bounds或者Collider.bounds都能拿到准确的包围盒,这个包围盒会完整包裹住整个对象,完美适配对象的实际尺寸。

2. 把包围盒的边界转换为Tile坐标

你需要一个方法把世界坐标转换成你的网格Tile坐标。如果是Unity的TileMap,直接用官方提供的Tilemap.WorldToCell就行;如果是自定义网格,自己写转换逻辑也很简单。

3. 遍历所有被包围盒覆盖的Tile

先算出包围盒覆盖的Tile范围(最小和最大Tile坐标),然后循环遍历这个范围内的所有Tile,标记它们的状态即可。

代码示例(Unity TileMap场景)

using UnityEngine;
using UnityEngine.Tilemaps;

public class TileCoverageDetector : MonoBehaviour
{
    public Tilemap targetTilemap; // 在Inspector里拖入你的TileMap组件

    void Update()
    {
        // 获取当前对象的包围盒
        Bounds objectBounds = GetComponent<Renderer>().bounds;

        // 转换包围盒的最小/最大点到TileMap的Cell坐标
        Vector3Int minCell = targetTilemap.WorldToCell(objectBounds.min);
        Vector3Int maxCell = targetTilemap.WorldToCell(objectBounds.max);

        // 遍历所有覆盖的Cell
        for (int x = minCell.x; x <= maxCell.x; x++)
        {
            for (int y = minCell.y; y <= maxCell.y; y++)
            {
                Vector3Int cellPos = new Vector3Int(x, y, 0);
                // 可选:检查这个Cell是否存在Tile
                if (targetTilemap.HasTile(cellPos))
                {
                    // 这里加入你的状态设置逻辑,比如标记Tile为被覆盖
                    Debug.Log($"Tile at {cellPos} is covered by this object");
                    // tile.SetCoveredState(true);
                }
            }
        }
    }
}

自定义网格的坐标转换方法

如果是你自己实现的网格系统,写个简单的转换方法就行:

private Vector2Int WorldToTile(Vector3 worldPos)
{
    // 假设每个Tile的尺寸是1x1,网格原点在(0,0)
    // 根据你的实际网格尺寸调整除法部分
    int tileX = Mathf.FloorToInt(worldPos.x / yourTileSizeX);
    int tileY = Mathf.FloorToInt(worldPos.y / yourTileSizeY);
    return new Vector2Int(tileX, tileY);
}

关键小提醒

  • 如果对象有旋转,bounds会自动适配旋转后的形状,不用担心检测不准;
  • 要是你的Tile是3D的(Z轴有延伸),记得把Z轴的坐标也加入遍历逻辑;
  • 可以把检测逻辑放到OnTriggerEnter或者FixedUpdate里,根据你的游戏需求调整触发时机。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:19:34