152 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
		
		
			
		
	
	
			152 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
|  | import { Node, AudioSource, AudioClip, resources, director, _decorator, TextAsset, error, JsonAsset } from 'cc'; | |||
|  | const { ccclass, property } = _decorator; | |||
|  | 
 | |||
|  | /** | |||
|  |  * @en | |||
|  |  * this is a sington class for audio play, can be easily called from anywhere in you project. | |||
|  |  * @zh | |||
|  |  * 这是一个用于播放音频的单件类,可以很方便地在项目的任何地方调用。 | |||
|  |  */ | |||
|  | export class GlobalAudio { | |||
|  | 
 | |||
|  |     AudioManager: object; | |||
|  | 
 | |||
|  |     //@zh 创建一个节点作为 GlobalAudio
 | |||
|  |     private static instance: GlobalAudio; | |||
|  | 
 | |||
|  |     public static getInstance(): GlobalAudio { | |||
|  |         if (!GlobalAudio.instance) { | |||
|  |             GlobalAudio.instance = new GlobalAudio(); | |||
|  |         } | |||
|  |         return GlobalAudio.instance; | |||
|  |     } | |||
|  | 
 | |||
|  |     private _audioSource: AudioSource; | |||
|  |     constructor() { | |||
|  |         //@en create a node as GlobalAudio
 | |||
|  |         //@zh 创建一个节点作为 GlobalAudio
 | |||
|  |         let GlobalAudio = new Node(); | |||
|  |         GlobalAudio.name = '__GlobalAudio__'; | |||
|  | 
 | |||
|  |         //@en add to the scene.
 | |||
|  |         //@zh 添加节点到场景
 | |||
|  |         director.getScene().addChild(GlobalAudio); | |||
|  | 
 | |||
|  |         //@en make it as a persistent node, so it won't be destroied when scene change.
 | |||
|  |         //@zh 标记为常驻节点,这样场景切换的时候就不会被销毁了
 | |||
|  |         director.addPersistRootNode(GlobalAudio); | |||
|  | 
 | |||
|  |         //@en add AudioSource componrnt to play audios.
 | |||
|  |         //@zh 添加 AudioSource 组件,用于播放音频。
 | |||
|  |         this._audioSource = GlobalAudio.addComponent(AudioSource); | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     //初始化完成以后的回调方法
 | |||
|  |     LoadCallBack: Function; | |||
|  |     Init(Func: Function) { | |||
|  |         //储存回调
 | |||
|  |         this.LoadCallBack = Func; | |||
|  |         this.LoadAudioXml(); | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     //加载音频Map
 | |||
|  |     LoadAudioXml() { | |||
|  |         resources.load("Sound/audio", (err, json: JsonAsset) => { | |||
|  |             if (err) { | |||
|  |                 console.error(err); | |||
|  |             } | |||
|  |             this.AudioManager = json.json!; | |||
|  |             this.LoadCallBack(); | |||
|  |         }); | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     PlaySound(sound: string, volume: number = 1.0) { | |||
|  |         if (this.AudioManager.hasOwnProperty(sound)) { | |||
|  |             this.playOneShot(this.AudioManager[sound], volume); | |||
|  |         } | |||
|  |         else { | |||
|  |             console.error("音频不存在,路径: " + sound); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     public get audioSource() { | |||
|  |         return this._audioSource; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @en | |||
|  |      * play short audio, such as strikes,explosions | |||
|  |      * @zh | |||
|  |      * 播放短音频,比如 打击音效,爆炸音效等 | |||
|  |      * @param sound clip or url for the audio | |||
|  |      * @param volume  | |||
|  |      */ | |||
|  |     playOneShot(sound: AudioClip | string, volume: number = 1.0) { | |||
|  |         if (sound instanceof AudioClip) { | |||
|  |             this._audioSource.playOneShot(sound, volume); | |||
|  |         } | |||
|  |         else { | |||
|  |             resources.load(sound, (err, clip: AudioClip) => { | |||
|  |                 if (err) { | |||
|  |                     console.log(err); | |||
|  |                 } | |||
|  |                 else { | |||
|  |                     this._audioSource.playOneShot(clip, volume); | |||
|  |                 } | |||
|  |             }); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @en | |||
|  |      * play long audio, such as the bg music | |||
|  |      * @zh | |||
|  |      * 播放长音频,比如 背景音乐 | |||
|  |      * @param sound clip or url for the sound | |||
|  |      * @param volume  | |||
|  |      */ | |||
|  |     play(sound: AudioClip | string, volume: number = 1.0) { | |||
|  |         if (sound instanceof AudioClip) { | |||
|  |             this._audioSource.clip = sound; | |||
|  |             this._audioSource.play(); | |||
|  |             this.audioSource.volume = volume; | |||
|  |         } | |||
|  |         else { | |||
|  |             resources.load(sound, (err, clip: AudioClip) => { | |||
|  |                 if (err) { | |||
|  |                     console.log(err); | |||
|  |                 } | |||
|  |                 else { | |||
|  |                     this._audioSource.clip = clip; | |||
|  |                     this._audioSource.play(); | |||
|  |                     this.audioSource.volume = volume; | |||
|  |                 } | |||
|  |             }); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * stop the audio play | |||
|  |      */ | |||
|  |     stop() { | |||
|  |         this._audioSource.stop(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * pause the audio play | |||
|  |      */ | |||
|  |     pause() { | |||
|  |         this._audioSource.pause(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * resume the audio play | |||
|  |      */ | |||
|  |     resume() { | |||
|  |         this._audioSource.play(); | |||
|  |     } | |||
|  | } |