官方例子ShieldNode 如果改为在resources.load回调中addUserNode 节点不可见

  • 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赞