-
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)
}
}
}
}
效果
卡在墙壁

放大看细节
不用tiledmap动态创建碰撞盒子,直接放置一个很长的单色精灵,添加碰撞盒子,不会卡住
类似的问题也出现在水平移动,比如碰撞区域大小16x16,人物水平速度设置成8(是碰撞区域的倍数),则非常容易卡住水平移动;
而将速度设置成6、10等,则很难被地板缝隙卡住。
目前我用的规避方法:Hero身上的碰撞盒子要比场景的大(大于16x16),保证Hero的碰撞盒子同意时间可以与墙壁两个碰撞盒子相互接触



,不过看起来好搓,

