我在cocos3.8.8中,我想用RenderTexture让UI层显示3D人物,我的方法是用相机的targetTexture 指定这个RenderTexture,用Sprite的spriteFrame也指定这个RenderTexture,达到相机看到3D人物显示到UI层上。 但是在安卓平台,当游戏开始运行没问题,当我切换到战斗场景,在切换回UI场景就报错blendState,下面是具体报错。大佬看看,我工程原来是3.8.1版本,完全正常,现在升级到3.8.8,这里就报错了,就不显示了。大佬们看看,十分感谢!
E attributionTag not declared in manifest of com.nimigame.startgame
2025-12-19 08:43:49.386 707-1044 AppOps system_server
E attributionTag not declared in manifest of com.nimigame.startgame
2025-12-19 08:43:49.629 9744-9763 Cocos com.nimigame.startgame
E 00:43:49 [ERROR]: JS: TypeError: Cannot read properties of undefined (reading ‘blendState’)
TypeError: Cannot read properties of undefined (reading ‘blendState’)
at t._updateBlendFunc (src/cocos-js/cc.js:1:627723)
at t.updateMaterial (src/cocos-js/cc.js:1:627142)
at t.changeMaterialForDefine (src/cocos-js/cc.js:1:646051)
at t._applySpriteFrame (src/cocos-js/cc.js:1:647686)
at set spriteFrame [as spriteFrame] (src/cocos-js/cc.js:1:643879)
at I.DrawModel (assets/main/index.jsc:59:3198)
at assets/main/index.jsc:59:1922
at a.dispatchEvent (assets/main/index.jsc:93:734)
at ie.startMainUI (assets/main/index.jsc:139:5778)
at ie.start (assets/main/index.jsc:139:3384)
我尝试了重新加载Sprite,更换Sprite,更换相机,更换RenderTexture,当切换场景后,在切换回UI场景要显示的时候,还是报以上错误。无奈之下请大神帮助~~
有技术人员帮忙看下吗?这个是不是引擎bug.能修复吗?
没人遇到过这种情况吗?
就是UI开始渲染你的图片的时候 那边RT得东西还没准备好。让AI给你改能改好,是引擎bug
你好,方便提供可复现的demo ?
解决了吗,我也遇到了
解决了么 我也遇到了
我也遇到一样的问题,有人解决吗
我这边也遇到了,其实就是创建了一个spriteFrame,并把对应的RenderTexture赋值给摄像机的targetTexture,跟帖子一样,首次进入是没问题的,第二次再次创建调用的时候,渲染出现材质损坏的问题,只有在原生端出现,有什么解决方案吗??
并且在3.8.2是没问题的,升级3.8.7才有的问题
能否提供可复现的demo ?
我用极简代码也复现了
这个PR会导致崩溃,以下是崩溃关键日志
05-29 15:46:05.629 4971 5007 E Cocos : 15:46:05 [ERROR]: [SE_ERROR] (C:/ProgramData/cocos/editors/Creator/3.8.8/resources/resources/3d/engine/native/cocos/bindings/jswrapper/v8/ScriptEngine.cpp, 1020): _onPassesUpdated is not a function: undefined
你好,可以提供下复现demo?
import { _decorator, Component, Node, Button, view, RenderTexture, Camera, director, Director, Sprite, SpriteFrame } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('test')
export class test extends Component {
btnCaputre!: Button
btnClose!: Button
start() {
this.btnCaputre = this.node.getChildByName("capture").getComponent(Button)
this.btnClose = this.node.getChildByName("close").getComponent(Button)
this.btnCaputre.node.on(Button.EventType.CLICK, () => {
this.capture();
})
this.btnClose.node.on(Button.EventType.CLICK, () => {
this.close();
})
}
async capture() {
const node = new Node("_capture");
const sprite = node.addComponent(Sprite);
node.setParent(this.node);
const renderTexture = new RenderTexture();
renderTexture.initialize({
width: Math.floor(view.getVisibleSize().width),
height: Math.floor(view.getVisibleSize().height)
});
const spriteFrame = new SpriteFrame();
spriteFrame.packable = false;
spriteFrame.texture = renderTexture;
const cameras = director.getScene().getComponentsInChildren(Camera).filter(camera => camera.node.activeInHierarchy);
for (const cam of cameras) {
cam.targetTexture = renderTexture;
}
await new Promise<void>((r, j) => director.once(Director.EVENT_AFTER_RENDER, r));
for (const cam of cameras) {
cam.targetTexture = null;
}
sprite.spriteFrame = spriteFrame;
}
close() {
const _capture = this.node.getChildByName("_capture")
if(!_capture || !_capture.isValid)
return;
const sprite = _capture.getComponent(Sprite)
if(!sprite || !sprite.isValid)
return;
const spriteFrame = sprite.spriteFrame;
sprite.spriteFrame = null;
const renderTexture = spriteFrame.texture;
spriteFrame.destroy();
renderTexture.destroy();
_capture.removeFromParent();
_capture.destroy();
}
}
弄两个按钮,然后来回点击,大概率复现。
这边实测,点击一次截图,再点击销毁,挂个1分钟,再点击截图就崩溃
你好,有下文吗?
是用388原始代码? android用什么机型?
我这边用388原始代码,在windows, android 都没复现。
是原始代码,打包到mumu模拟器12运行的,怀疑是v8那边的对象被GC了