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

Unity Tiled地图如何实现敌人仅在草地非碰撞区域生成

Unity + Tiled 敌人生成点位校验高效实现方案

核心思路是把99%的校验逻辑放到编辑器离线阶段完成,运行时只做极轻量的校验,完全不会有性能卡顿,具体步骤如下:

  • Tiled端提前做分层标记
    打开你制作的Tiled地图工程,新建一个专门的独立Tile图层,命名为SpawnableArea,仅在允许生成敌人的草地区域铺设标记用的透明Tile(随便建个空Tile资源就行,不用做贴图,不影响最终渲染效果),所有水域、障碍物占位的格子都不要在这个层铺Tile。
    这个做法比运行时判断地形贴图、图层属性效率高几个量级,也不会出现判断逻辑和实际美术资源不匹配的问题。导出地图到Unity时(无论你用SuperTiled2Unity、Tiled2Unity还是Unity原生Tiled导入器),这个独立图层都会被识别为单独的Tilemap组件,不会和其他渲染图层混淆。
  • 编辑器阶段离线收集合法生成点
    给你的地图管理器组件写个编辑器扫点逻辑,地图导入完成后一键执行,把所有合法点提前序列化缓存,不用运行时重复计算,参考代码:
    public class MapSpawnManager : MonoBehaviour
    {
        // 序列化存下所有合法生成点,运行时直接读取
        public List<Vector3> cachedValidSpawnPoints = new List<Vector3>();
        
        // 编辑器菜单触发扫点,地图更新后点一次就行
        [ContextMenu("刷新合法生成点缓存")]
        void CollectValidPoints()
        {
            cachedValidSpawnPoints.Clear();
            // 找到导入的SpawnableArea层对应的Tilemap
            Tilemap spawnTilemap = transform.Find("SpawnableArea").GetComponent<Tilemap>();
            BoundsInt cellBounds = spawnTilemap.cellBounds;
            
            // 遍历所有铺了标记Tile的格子
            foreach (Vector3Int cellPos in cellBounds.allPositionsWithin)
            {
                if (!spawnTilemap.HasTile(cellPos)) continue;
                // 格子坐标转世界坐标,偏移0.5单位让点落在格子中心
                Vector3 worldPos = spawnTilemap.CellToWorld(cellPos) + new Vector3(0.5f, 0.5f, 0);
                cachedValidSpawnPoints.Add(worldPos);
            }
    
            // 提前过滤掉和静态Collider重叠的点
            float checkRadius = 0.4f; // 和你敌人的碰撞体半径匹配即可
            cachedValidSpawnPoints.RemoveAll(point => 
                Physics2D.OverlapCircle(point, checkRadius, LayerMask.GetMask("Obstacle", "Water"))
            );
        }
    }
    
  • 运行时生成逻辑
    因为大部分非法点已经在离线阶段过滤完了,运行时逻辑非常轻:
    1. 提前把cachedValidSpawnPoints列表打乱顺序,避免每次生成的敌人位置规律太明显
    2. 生成敌人时按顺序从列表里取点,如果你的游戏有动态生成/销毁的障碍物,取点时额外做一次Physics2D.OverlapCircle检测就行,因为提前过滤过绝大多数非法点,一次就能取到可用点的概率超过95%,几乎没有性能开销
    3. 取完的点如果需要重复利用,等敌人销毁后把点放回可用池即可
  • 避坑提醒
    • 不要在运行时逐帧/每次生成时遍历全地图Tilemap判断地形,大地图下这个操作的卡顿会非常明显
    • 不要靠射线检测判断地面类型,Tiled导出的地图经常有多层Tile叠放,射线检测很容易拿到错误的层信息
    • 标记层用透明Tile就行,不用额外做美术资源,不会增加包体和渲染开销

参考效果截图:
Tiled地图实际效果参考

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:36:51