import { _decorator, Camera, Component, Node, RenderTexture, Sprite, SpriteFrame, Vec3 } from 'cc'; import { AliensGlobalInstance } from '../AliensGlobalInstance'; import { EventDispatcher } from 'db://assets/core_tgx/easy_ui_framework/EventDispatcher'; import { GameEvent } from '../Enum/GameEvent'; const { ccclass, property } = _decorator; /** 截图组件脚本*/ @ccclass('ScreenShot') export class ScreenShot extends Component { @property(Sprite) public sprite: Sprite = null!; _renderTex: RenderTexture | null = null; private _originalTargetTexture: RenderTexture | null = null; async start() { this.registerEvent(); //获取相机组件 const camera = await this.getSceneCamera(); this._originalTargetTexture = camera.targetTexture; } private registerEvent(){ EventDispatcher.instance.on(GameEvent.EVENT_CAMERA_SCREENSHOT,this.screenShot,this); } private unregisterEvent(){ EventDispatcher.instance.off(GameEvent.EVENT_CAMERA_SCREENSHOT,this.screenShot,this); } //截图 public async screenShot() { this.node.active = true; //获取相机组件 const camera = await this.getSceneCamera(); //获取目标节点 const targetNode = await this.getTargetNode(); const spriteFrame = this.sprite.spriteFrame!; const sp = new SpriteFrame(); sp.reset({ originalSize: spriteFrame.originalSize, rect: spriteFrame.rect, offset: spriteFrame.offset, isRotate: spriteFrame.rotated, borderTop: spriteFrame.insetTop, borderLeft: spriteFrame.insetLeft, borderBottom: spriteFrame.insetBottom, borderRight: spriteFrame.insetRight, }); const renderTex = this._renderTex = new RenderTexture(); renderTex.reset({ width: 280, // 直接设置为最终大小 height: 180, }); if (targetNode) { // 设置渲染纹理 sp.texture = renderTex; // 关键修改:通过设置flipUV来翻转图像 sp.flipUVY = true; this.sprite.spriteFrame = sp; // 移动相机对准目标节点 const targetPos = targetNode.worldPosition.clone(); camera.node.lookAt(targetPos, Vec3.UP); camera.targetTexture = renderTex; // 确保渲染完成 this.scheduleOnce(() => { // 恢复相机状态 camera.targetTexture = this._originalTargetTexture; // 强制更新材质 this.sprite.markForUpdateRenderData(); }, 0.1); // 稍微延长等待时间确保渲染完成 } } //获取场景相机 private async getSceneCamera() :Promise{ return new Promise((resolve, reject) => { const levelNode = AliensGlobalInstance.instance.levels.children[0]; if(!levelNode){return;} const camera = levelNode.getComponentInChildren(Camera)!; resolve(camera); }); } //获取目标节点 private async getTargetNode():Promise { return new Promise((resolve, reject) => { const levelNode = AliensGlobalInstance.instance.levels.children[0]; const et = levelNode.getChildByName('et'); resolve(et.children[0]); }); } protected onDestroy(): void { this.unregisterEvent(); } }