You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.7 KiB
55 lines
1.7 KiB
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;
|
|
// }
|
|
}
|
|
}
|
|
|