-
Creator 版本: 3.8.3
initScene (prefab: Prefab) { resources.load("tilemap/shieldNode", Prefab, (err2, prefab2) => { if (!!err2) { error(err2); } else { error("nonono") const posArr = [v2(-249, 96), v2(-150, 76), v2(-60, 54), v2(-248, -144), v2(-89, -34)]; const tmpP = new Vec3(); for (let i = 0; i < posArr.length; i++) { const shieldNode = instantiate(prefab2); shieldNode.setPosition(posArr[i].x, posArr[i].y); this.tiledLayer!.addUserNode(shieldNode); this.shieldNodeMap.set(i,shieldNode); shieldNode.on(Node.EventType.TOUCH_MOVE, (event:EventTouch) => { const deltaMove = event.getUIDelta(); shieldNode.getPosition(tmpP); tmpP.x += deltaMove.x; tmpP.y += deltaMove.y; shieldNode.setPosition(tmpP); }); } } });}
找到原因了 addUserNode的实现中 未调用markForUpdateRenderData 手工调用一下即可
也许这样实现是为了防止同一帧中反复addUserNode 导致反复markForUpdateRenderData ?
但看实现中是有判断dirtyVersion的:
public markDirtyRenderer (uiRenderer: UIRenderer | UIMeshRenderer): void {
if (uiRenderer._dirtyVersion !== this._dirtyVersion && uiRenderer._internalId !== -1) {
this._dirtyRenderers.push(uiRenderer);
uiRenderer._dirtyVersion = this._dirtyVersion;
}
}
1赞