从TiledMap动态创建地图碰撞区域,容易卡住角色移动

  • Creator 版本: 3.7.2

  • 目标平台:chrome

  • 重现方式:tiled创建16x16的地图元素,垂直墙壁16x160,动态创建每个地图tiled的碰撞盒子BoxCollider2D,Hero撞向墙壁,并沿着墙壁垂直坠落,会卡在墙壁两个BoxCollider2D缝隙(根本没有缝隙)

  • 首个报错: 无报错

  • 之前哪个版本是正常的: 未尝试过其他版本,小白

  • 编辑器操作系统: Win11

  • 重现概率: 大于40%

碰撞盒子创建代码

start () {
    // console.log(this)
    let size = this.tiledMap.getTileSize()     // 地图最小分割单位
    let layer = this.tiledMap.getLayer("road") 
    let layersize = layer.getLayerSize();      // 整个地图大小


    for (let i = 0;i < layersize.width; i++) {
        for (let j = 0; j < layersize.height; j++) {

            let tiled = layer.getTiledTileAt(i, j, true)
            if (tiled.grid != 0) {
                let body = tiled.node.addComponent(RigidBody2D)
                body.type = ERigidBody2DType.Static
                body.group = 8
                body.fixedRotation = true

                let newside = tiled.node.addComponent(BoxCollider2D)
                newside.group = 8
                newside.size = math.size(size.width, size.height);  // 保证颗粒之间严丝合缝
                console.log("friction", newside.friction)
                newside.friction  = 0;  // 取消摩檫力
                newside.offset = new Vec2(size.width / 2, size.height / 2)
            }

        }
    }
}

效果

卡在墙壁

1

放大看细节

不用tiledmap动态创建碰撞盒子,直接放置一个很长的单色精灵,添加碰撞盒子,不会卡住

类似的问题也出现在水平移动,比如碰撞区域大小16x16,人物水平速度设置成8(是碰撞区域的倍数),则非常容易卡住水平移动;

而将速度设置成6、10等,则很难被地板缝隙卡住。

目前我用的规避方法:Hero身上的碰撞盒子要比场景的大(大于16x16),保证Hero的碰撞盒子同意时间可以与墙壁两个碰撞盒子相互接触

请问一下楼主有遇到瓦片图边缘变窄的问题吗?
https://forum.cocos.org/t/topic/147875

我的cocos 3.7.2
1、你的tilemap.tmx放入我的cocos,提示感叹号,没法加入到场景
素材放置到我的cocos里没法渲染,
2、将你的png用tiledmap打开,生成与你一样的tilmap文件,可以加入cocos工程,能加入场景,
但场景里看不到,浏览器里也看不到
3、我自己编辑的素材没有像素缺失问题。

谢谢,我再找找问题

与TiledMap无关,就算在creator手动创建多个碰撞盒子,一样也会卡在边沿
4

正常来说,不应该有这么多的BoxCollider2D,应该自己编辑合并为一个个整体或者写个合并算法的组件来处理.
可以参考: 2D 复合碰撞体 (Composite Collider 2D) - Unity 手册

也没关系.运动角色collider包围盒底部做成倒角就行.

我现在正在做组合碰撞体,创建3层TiledMap

  • road地图
  • road-v水平地图
  • road-h垂直地图

创建BoxCollider2D时,在road-v层找到连续的水平块合并,在road-h层找到连续的垂直块合并

之前的解决方案也属于倒角,改成原型 :rofl:,不过看起来好搓,
最后换成分层road-h、road-v

好了,TiledMap分层构建组合碰撞体,达到我的效果了。
至于unity的复合碰撞体,以后再看看



曲线救国,勉强解决了,
cocos好像很多坑呀,api不兼容,
creator偶尔不能渲染地图(浏览器没问题)

根据map数据自己进行区分分组吗