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();
 | |
|     }
 | |
| } |