CocosCreator 音效管理器

代码都有注释不再赘述

TypeScript 复制代码
import { _decorator, Node, AudioClip, AudioSource, game, find } from "cc";
import { Dictionary } from "../core/Dictionary";

const { ccclass, property } = _decorator;

/**最多有几个音效播放器*/
const MAX_SOUNDS: number = 8

/**
 * 音效管理器
 */
@ccclass("AudioMgr")
export class AudioMgr {

    static _instance: AudioMgr;
    static get ins() {
        if (this._instance) {
            return this._instance;
        }
        this._instance = new AudioMgr();
        return this._instance;
    }

    /**音效的常驻节点*/
    private _persistRootNode: Node = null;
    //bgm音效全局唯一一个
    private _music: AudioSource = null
    //sound音效可以有多个
    private _sounds: AudioSource[] = null
    /**bgm静音 0没静音 1静音*/
    private _music_muted: number = 0
    /**sound静音 0没静音 1静音*/
    private _sound_muted: number = 0
    /**bgm音量*/
    private _music_volume: number = 1
    /**sound音量*/
    private _sound_volume: number = 1
    /**当前播放的音效索引用以控制使用不同的AudioSource*/
    private _now_soundid: number = 0
    /**当前播放的bgm音效名字*/
    private _cur_music_name: string = ""
    //存储所有的音效片段
    private music_clips: Dictionary<string, AudioClip>
    init() {
        if (this._persistRootNode) return; //避免切换场景初始化报错
        this._persistRootNode = find("Canvas")
        game.addPersistRootNode(this._persistRootNode)
        this._sounds = []
        this.music_clips = new Dictionary<string, AudioClip>()
        /**
         * 读取本地存储的数据
         * 
         */
        this._music = this._persistRootNode.addComponent(AudioSource)
        //获取bgm的音量
        this._music.volume = this._music_volume
        //获取bgm是否存储静音
        this._music.volume = this._music_muted == 1 ? 0 : this._music_volume
        //获取sounds列表
        for (let i = 0; i < MAX_SOUNDS; i++) {
            this._sounds[i] = this._persistRootNode.addComponent(AudioSource)
            this._sounds[i].volume = this._sound_volume
            this._sounds[i].volume = this._sound_muted == 1 ? 0 : this._sound_volume
        }
    }

    /**
     * @param audioName 音效名字
     * @param isLoop 是否循环播放
     * @protected 播放音效
     */
    playMusic(audioName: string, isLoop: boolean = true) {
        if (this._cur_music_name == audioName) {
            return
        }
        let call = (clip) => {
            this._music.clip = null
            this._music.clip = clip
            this._music.loop = isLoop
            this._music.play()
            if (!this.music_clips.containsKey(audioName)) {
                this.music_clips.add(audioName, clip)
            }
        }
        if (this.music_clips.containsKey(audioName)) {
            call(this.music_clips.getValue(audioName))
        } else {
            let bundleName = "base.audio"
            let path = bundleName + "/" + audioName
            assetManager.loadBundle(bundleName,(err, bundle) => {
                bundle.load(path,AudioClip,(err: any, clip: any)=>{
                    if (err) {
                        console.error("loadAudioClip" + err);
                    }else{
                        call(clip)
                    }
                });
                
            })
        }
    }

    /**
     * @param audioName 音效名字
     * @param isLoop 是否循环播放
     * @protected 播放音效
     */
    playSound(audioName: string, isLoop: boolean = false) {
        let call = (clip) => {
            this._sounds[this._now_soundid].clip = null
            this._sounds[this._now_soundid].clip = clip
            this._sounds[this._now_soundid].loop = isLoop
            this._sounds[this._now_soundid].play()
            if (!this.music_clips.containsKey(audioName)) {
                this.music_clips.add(audioName, clip)
            }
            this._now_soundid = this._now_soundid + 1 >= this._sounds.length ? 0 : this._now_soundid + 1
        }
        if (this.music_clips.containsKey(audioName)) {
            call(this.music_clips.getValue(audioName))
        } else {
            let bundleName = "base.audio"
            let path = bundleName + "/" + audioName
            assetManager.loadBundle(bundleName,(err, bundle) => {
                bundle.load(path,AudioClip,(err: any, clip: any)=>{
                    if (err) {
                        console.error("loadAudioClip" + err);
                    }else{
                        call(clip)
                    }
                });
                
            })
        }
    }

    /**
     * 停止播放bgm
     */
    stopMusic() {
        this._music.stop()
        this._music.clip = null
    }

    /**
     * 停止播放所有的sound
     */
    stopAllSound() {
        for (let i = 0; i < this._sounds.length; i++) {
            this._sounds[i].stop()
            this._sounds[i].clip = null
        }
        this._now_soundid = 0
    }

    /**
     * 
     * @param mute 是否静音music
     */
    setMusicMute(mute: boolean) {
        if (mute == (this._music_muted == 1)) {
            return
        }
        this._music_muted = mute ? 1 : 0
        this._music.volume = mute ? this._music_volume : 0
        //存储music静音 this._music_muted
    }

    /**
     * 
     * @param mute 是否静音sound
     */
    setSoundMute(mute: boolean) {
        if (mute == (this._sound_muted == 1)) {
            return
        }
        this._sound_muted = mute ? 1 : 0
        for (let i = 0; i < this._sounds.length; i++) {
            this._sounds[i].volume = mute ? this._sound_volume : 0
        }
        //存储sound静音 this._sound_muted
    }

    /**
     * 
     * @param value 设置音乐声音大小
     */
    setMusicVolume(value: number) {
        this._music.volume = value
        this._music_volume = value
        //存储music音量大小 this._music_volume
    }

    /**
     * 
     * @param value 设置sound声音大小
     */
    setSoundVolume(value: number) {
        this._sound_volume = value
        for (let i = 0; i < this._sounds.length; i++) {
            this._sounds[i].volume = value
        }
        //存储sound音量大小 this._sound_volume
    }

    /**
     * 
     * @returns 返回bgm静音状态
     */
    getMusicMute() {
        return this._music_muted
    }

    /**
     * 
     * @returns 返回sound音效静音状态
     */
    getSoundMute() {
        return this._sound_muted
    }

    /**
     * 
     * @returns 返回bgm声音大小
     */
    getMusicVolume() {
        return this._music_volume
    }

    /**
     * 
     * @returns 返回sound音效声音大小
     */
    getSoundVolume() {
        return this._sound_volume
    }
}

Dictionary请查看另外一篇文章CocosCreator Dictionary_小张不爱写代码的博客-CSDN博客

相关推荐
高山我梦口香糖37 分钟前
[react 3种方法] 获取ant组件ref用ts如何定义?
typescript·react
prall3 小时前
实战小技巧:下划线转驼峰篇
前端·typescript
一條狗1 天前
隨筆 20241224 ts寫入excel表
开发语言·前端·typescript
轻口味2 天前
配置TypeScript:tsconfig.json详解
ubuntu·typescript·json
小林rr3 天前
前端TypeScript学习day03-TS高级类型
前端·学习·typescript
web150850966413 天前
前端TypeScript学习day01-TS介绍与TS部分常用类型
前端·学习·typescript
前端熊猫4 天前
省略内容在句子中间
前端·javascript·typescript
禁止摆烂_才浅4 天前
React全家桶 -【高阶函数/高阶组件/钩子】-【forwardRef、mome、useImperativeHandle、useLayoutEffect】
react.js·typescript
TSFullStack4 天前
TypeScript - 控制结构
typescript
高山我梦口香糖4 天前
[react] 优雅解决typescript动态获取redux仓库的类型问题
前端·react.js·typescript