在cocos creator3.x 中使用代码给TileMap地图块添加碰撞体

下面是我的代码。实际上并没生效,或者我怎么准确判断有没有生效?

  // 动态设置碰撞体
  setColliders() {
    this.map = this.getComponent(TiledMap)
    let tiledSize = this.map.getTileSize();
    let layer = this.map.getLayer('layer1');
    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.wakeUp()
          let collider = tiled.node.addComponent(BoxCollider2D);

          collider.offset = new Vec2(tiledSize.width / 2, tiledSize.height / 2);
          collider.size = tiledSize;
          collider.apply();
        }
      }
    }
  }
1赞

坐标的问题

最终能正常实现了吗?我也遇到了这样的问题,BoxCollider2D碰撞盒的offset似乎没设置对

可以的话发个Demo来看看,我是在Cocos Creator 3.6.2版本下开发,也是像你上面的这个代码这来动态生成瓦片的碰撞区域,结果无效

怎么解决的?代码一样
上面有回复坐标的问题,那具体是坐标啥问题?

这个3.8 坑死了 , getTiledTileAt(i, j, true); 返回的tiled.node的坐标是世界坐标
你刚体用了这个坐标 就完了,其实刚体加上了 只不过不在障碍上

现在问题来了 要怎么弄!

可以用我这段代码

    PhysicsSystem2D.instance.debugDrawFlags = EPhysics2DDrawFlags.All;
    this.TiledMap.getComponent(UITransform).setAnchorPoint(0,0);
    const mapWidth = this.TiledMap.getComponent(UITransform).width;
    const mapHeight = this.TiledMap.getComponent(UITransform).height;
    this.TiledMap.node.setPosition(new Vec3(-mapWidth / 2, -mapHeight / 2));
    const layer = this.TiledMap.getLayer("Default");
    let layerSize = layer.getLayerSize();
    let tiledSize = this.TiledMap.getTileSize();

    for(let i = 0;i < layerSize.width;i++){
        for (let j = 0; j < layerSize.height; j++) {
            let tiled = layer.getTiledTileAt(i,j,true);

            const index = layer.vertices[layerSize.height-1-j][i].index;

            const properties = this.TiledMap._tileProperties.get(layer.tiles[index]);

            if(properties)
            {
                if(properties.collision)
                {
                    const collider = tiled.node.addComponent(BoxCollider2D);
                    collider.offset = new Vec2(tiledSize.width/2,tiledSize.height/2);
                    collider.size = tiledSize;
                    collider.apply();
                }
            }
        }
    }
1赞

getTiledTileAt(i, j, true)返回的tiled.node的本地坐标是世界坐标的值,是错误的位置;将TiledMap的锚点放在世界坐标的原点上让tiled.node的本地坐标和世界坐标在值上相等,位置就对了。

直接对tiled.node的本地坐标做偏移行不通,会带动地图块一起偏移。