发现在一些特定的情况下,如果让有刚体的节点的active为false, 就会出现如下错误
box2d.umd.js:2778 Uncaught Error at b2TreeNode.get (:7456/scripting/engine/bin/.cache/dev/preview/external/%2540cocos/box2d.js:521)
发现出现在如下代码中获取userData为null时抛出一个异常
while (i < this.m_pairCount) {
const primaryPair: b2Pair<T> = this.m_pairBuffer[i];
const userDataA: T = primaryPair.proxyA.userData; // this.m_tree.GetUserData(primaryPair.proxyA);
const userDataB: T = primaryPair.proxyB.userData; // this.m_tree.GetUserData(primaryPair.proxyB);
callback(userDataA, userDataB);
++i;
// Skip any duplicate pairs.
while (i < this.m_pairCount) {
const pair: b2Pair<T> = this.m_pairBuffer[i];
if (pair.proxyA.m_id !== primaryPair.proxyA.m_id || pair.proxyB.m_id !== primaryPair.proxyB.m_id) {
break;
}
++i;
}
}
排查了很久,发现box2d.ts中的如下代码可能有问题:
public BufferMove(proxy: b2TreeNode<T>): void {
this.m_moveBuffer[this.m_moveCount] = proxy;
++this.m_moveCount;
}
此处m_moveBuffer中可能已经存在了proxy, 导致后续的UnBufferMove不能完全从列表中移除proxy。
此BUG隐藏较深,危害较大,导致box2d在cocos的使用中,只要稍微复杂的带刚体节点的active=false的操作逻辑,就会出问题。
可以这样修改:
public BufferMove(proxy: b2TreeNode<T>): void {
var index = this.m_moveBuffer.indexOf(proxy);
if (index >= 0 && index < this.m_moveCount) return;
this.m_moveBuffer[this.m_moveCount] = proxy;
++this.m_moveCount;
}