import { _decorator, CCFloat, CCInteger, Component, easing, Enum, tween, Vec3 } from 'cc'; const { ccclass, property } = _decorator; enum AnimationType { BOUNCE = 0, //上下弹跳 BREATHE = 1 //呼吸动画 } @ccclass('BounceAnimation') export class BounceAnimation extends Component { @property({ type: Enum(AnimationType), tooltip: '动画类型' }) animationType: AnimationType = AnimationType.BOUNCE; //弹跳动画参数 @property({ type: CCInteger, tooltip: '缓动高度', visible() { return this.animationType === AnimationType.BOUNCE } }) bounceHeight: number = 20; @property({ type: CCInteger, tooltip: '缓动时间(秒)', visible() { return this.animationType === AnimationType.BOUNCE } }) duration: number = 0.5; //呼吸动画参数 @property({ type: CCFloat, tooltip: '缩放幅度', visible() { return this.animationType === AnimationType.BREATHE } }) scaleSize: number = 0.05; @property({ type: CCInteger, tooltip: '呼吸周期(秒)', visible() { return this.animationType === AnimationType.BREATHE } }) breatheDuration: number = 1; private originalPosition: Vec3 = new Vec3(); private originalScale: Vec3 = new Vec3(); // 新增原始缩放值记录 start() { this.originalPosition = this.node.position.clone(); this.originalScale = this.node.scale.clone(); // 记录原始缩放值 this.startAnimation(); } /** * 开始执行动画 */ public startAnimation() { const btn_play = this.node; if(this.animationType === AnimationType.BOUNCE) { tween(btn_play) .delay(Math.random()) .to(this.duration,{position: new Vec3(this.originalPosition.x, this.originalPosition.y + this.bounceHeight, this.originalPosition.z)}, { easing: easing.linear }) // 向上缓动 .to(this.duration,{position: new Vec3(this.originalPosition.x, this.originalPosition.y - this.bounceHeight, this.originalPosition.z)}, { easing: easing.linear }) // 向下缓动 .to(this.duration,{position: new Vec3(this.originalPosition.x, this.originalPosition.y, this.originalPosition.z)}, { easing: easing.linear }) // 向下缓动 .union() .repeatForever() // 无限循环 .start(); // 启动动画 } else if(this.animationType === AnimationType.BREATHE) { tween(btn_play) .sequence( tween().to(this.breatheDuration, { scale: new Vec3( this.originalScale.x + this.scaleSize, this.originalScale.y + this.scaleSize, 1 ) }), tween().to(this.breatheDuration, { scale: this.originalScale }) ) .repeatForever() .start(); } } }