import { _decorator, Component, Node, Rect, Sprite, Vec2 } from 'cc'; const { ccclass, property } = _decorator; @_decorator.ccclass('ScrollUV') export class ScrollUV extends Component { @property({ type: Sprite }) sprite: Sprite = null; @property public scrollSpeed = new Vec2(0.1, 0); // 横向滚动速度,默认每帧偏移0.1 private baseUvs: number[] = []; onLoad() { if (!this.sprite) { this.sprite = this.getComponent(Sprite); } // 保存原始 UV 数据 const spriteFrame = this.sprite.spriteFrame; if (spriteFrame) { const uvs = spriteFrame.uv; this.baseUvs = [...uvs]; } } update(deltaTime: number) { let offsetX = (Date.now() * this.scrollSpeed.x) % 1; let offsetY = (Date.now() * this.scrollSpeed.y) % 1; // const rect = new Rect(offsetX, 0, 1, 1); // 横向滚动 // this.sprite.spriteFrame.setOffset(rect); // const newUvs = [...this.baseUvs]; // for (let i = 0; i < newUvs.length; i += 4) { // newUvs[i] = (this.baseUvs[i] + offsetX) % 1; // newUvs[i + 1] = (this.baseUvs[i + 1] + offsetY) % 1; // newUvs[i + 2] = (this.baseUvs[i + 2] + offsetX) % 1; // newUvs[i + 3] = (this.baseUvs[i + 3] + offsetY) % 1; // } // // 注意:需要重新创建 SpriteFrame 或者使用自定义材质来支持动态 UV // // 这里我们尝试直接修改 spriteFrame.uv(仅限非图集) // const sf = this.sprite.spriteFrame; // if (sf && !sf.isRotated()) { // sf.uv = newUvs; // this.sprite.spriteFrame = null; // this.sprite.spriteFrame = sf; // } } }