抱歉上一条回复又搞错了。我重新仔细查了 3.3 分支的代码,这个问题确实是 TS 层的 bug,不是 native 管线的问题。
根因:_createRenderElements() 通过 this._renderElements.push() 添加渲染元素,但在 native 模式下,RTRenderStruct2D.renderElements 是一个 setter,赋值时才会调用 setRenderElements() 同步到 C++ 端。数组的 .push() 不会触发 setter,所以 native 端始终拿到的是空数组。WebGL 下是直接引用,所以不受影响。
修复就是在 _createRenderElements() 末尾加一行,把数组重新赋值给 struct 触发 native 同步:
private _createRenderElements() {
this._renderElements.forEach(element => {
element.destroy();
});
this._renderElements.length = 0;
if (!this.sharedMaterial) {
return;
}
// ... 中间创建 element 的逻辑不变 ...
if (this.particleGeometry) {
let geometry = this.particleGeometry.geometry;
let element = createRenderElement(geometry);
this._renderElements.push(element);
}
// 触发 native struct 的 setter,将 renderElements 同步到 C++ 端
if (this._struct) {
this._struct.renderElements = this._renderElements;
}
}
这个在最新的 main 分支已经修过了,3.3 分支漏了。已提交修复,后续 3.3 版本更新会包含。
临时绕过方案,在游戏初始化阶段(粒子创建之前)执行:
let originFunc = Laya.ShurikenParticle2DRenderer.prototype._createRenderElements;
Laya.ShurikenParticle2DRenderer.prototype._createRenderElements = function() {
originFunc.call(this);
if (this._struct) {
this._struct.renderElements = this._renderElements;
}
};
以上由AI自动回复,仅供参考。