diff --git a/assets/libs/animator-effect/EffectFinishedRelease.ts b/assets/libs/animator-effect/EffectFinishedRelease.ts index 970f61d..d1fa866 100644 --- a/assets/libs/animator-effect/EffectFinishedRelease.ts +++ b/assets/libs/animator-effect/EffectFinishedRelease.ts @@ -38,7 +38,6 @@ export class EffectFinishedRelease extends Component { if (aniName) { let aniState = animator.getState(aniName); if (aniState) { - aniState.speed = 1; let duration = aniState.duration; this.maxDuration = duration > this.maxDuration ? duration : this.maxDuration; } @@ -48,10 +47,9 @@ export class EffectFinishedRelease extends Component { this.scheduleOnce(this.onRecovery.bind(this), this.maxDuration); } // 粒子动画 - else { + else if (ParticleSystem) { let particles: ParticleSystem[] = this.node.getComponentsInChildren(ParticleSystem); particles.forEach(particle => { - particle.simulationSpeed = 1; particle.clear(); particle.stop(); particle.play() diff --git a/assets/libs/animator-effect/EffectSingleCase.ts b/assets/libs/animator-effect/EffectSingleCase.ts index f7bfc8a..ce7d0f0 100644 --- a/assets/libs/animator-effect/EffectSingleCase.ts +++ b/assets/libs/animator-effect/EffectSingleCase.ts @@ -2,10 +2,10 @@ * @Author: dgflash * @Date: 2021-10-12 14:00:43 * @LastEditors: dgflash - * @LastEditTime: 2022-09-22 14:55:05 + * @LastEditTime: 2023-03-06 14:40:34 */ -import { Component, Node, NodePool, Prefab, Vec3 } from 'cc'; +import { Animation, Component, Node, NodePool, ParticleSystem, Prefab, Vec3, sp } from 'cc'; import { oops } from '../../core/Oops'; import { ViewUtil } from '../../core/utils/ViewUtil'; import { EffectEvent } from './EffectEvent'; @@ -27,14 +27,29 @@ interface IEffectParams { /** 动画特效对象池管理器 */ export class EffectSingleCase { private static _instance: EffectSingleCase; - public static get instance(): EffectSingleCase { + static get instance(): EffectSingleCase { if (this._instance == null) { this._instance = new EffectSingleCase(); } return this._instance; } + + /** 全局动画播放速度 */ + private _speed: number = 1; + get speed(): number { + return this._speed; + } + set speed(value: number) { + this._speed = value; + this.effects_use.forEach((value: Boolean, key: Node) => { + this.setSpeed(key); + }); + } + + /** 不同类型的对象池集合 */ private effects: Map = new Map(); + private effects_use: Map = new Map(); constructor() { oops.message.on(EffectEvent.Put, this.onHandler, this); @@ -48,7 +63,7 @@ export class EffectSingleCase { /** 加载资源并现实特效 */ loadAndShow(name: string, parent?: Node, params?: IEffectParams): Promise { - return new Promise((resolve, reject) => { + return new Promise(async (resolve, reject) => { var np = this.effects.get(name); if (np == undefined) { oops.res.load(name, Prefab, (err: Error | null, prefab: Prefab) => { @@ -91,12 +106,17 @@ export class EffectSingleCase { } else { node = np.get()!; + node.getComponent(EffectFinishedRelease); } + this.setSpeed(node); if (params && params.pos) node.position = params.pos; if (parent) node.parent = parent; + // 记录缓冲池中放出的节点 + this.effects_use.set(node, true); + return node; } @@ -109,6 +129,10 @@ export class EffectSingleCase { var name = node.getComponent(EffectData)!.type; var np = this.effects.get(name); if (np) { + // 回收使用的节点 + this.effects_use.delete(node); + + // 回到到池中 np.put(node); } } @@ -129,4 +153,35 @@ export class EffectSingleCase { this.effects.clear(); } } + + /** 设置动画速度 */ + private setSpeed(node: Node) { + // SPINE动画 + let spine = node.getComponent(sp.Skeleton); + if (spine) { + spine.timeScale = this.speed; + } + else { + // COCOS动画 + let anims: Animation[] = node.getComponentsInChildren(Animation); + if (anims.length > 0) { + anims.forEach(animator => { + let aniName = animator.defaultClip?.name; + if (aniName) { + let aniState = animator.getState(aniName); + if (aniState) { + aniState.speed = this.speed; + } + } + }); + } + // 粒子动画 + else if (ParticleSystem) { + let particles: ParticleSystem[] = node.getComponentsInChildren(ParticleSystem); + particles.forEach(particle => { + particle.simulationSpeed = this.speed; + }); + } + } + } } \ No newline at end of file