cocoscreator3.3.1 音乐音效管理

现在要管理音乐音效,要分别打开、关闭,用一个audioSource来管理合适吗?怎么做呢?求大佬指教

1赞

Cache audioSource in map of a singleton class.
Maybe give you a suggest :slight_smile:

const { ccclass, property } = cc._decorator;

@ccclass

export default class MusicControl extends cc.Component

{

static Musics = {

    button: "button",

    bg: "bg",

    set: "set",

    win: "win",

    fail: "fail",

}

static bgmusic: cc.AudioClip

static effectList: cc.AudioClip[] = []

//获取音效是否开启

static getSoundFun()

{

    let csound = cc.sys.localStorage.getItem('sounds');

    if (csound == 'true' || csound == true)

        return true

    return false

}

//设置音效是否开启

static SetSoundFun(paras: boolean)

{

    cc.sys.localStorage.setItem('sounds', paras);

    paras ? this.GetResumeMusic() : this.GetPauseMusic();

}

// 暂停音乐

static GetPauseMusic()

{

    if (cc.audioEngine.isMusicPlaying())

        cc.audioEngine.pauseMusic();

}

// 恢复播放音乐

static GetResumeMusic()

{

    if (!cc.audioEngine.isMusicPlaying())

        cc.audioEngine.resumeMusic(); //恢复播放音乐

}

//播放背景音乐

static PlayMusic(file: string)

{

    console.log("播放背景音乐")

    console.log(this.getSoundFun())

    if (!this.getSoundFun())

        return;

    if (this.bgmusic)

    {

        cc.audioEngine.playMusic(this.bgmusic, true);

    } else

    {

        let musicFile = "Musics/" + file;

        console.log("//预加载并播放")

        //预加载并播放

        cc.resources.load(musicFile, cc.AudioClip, (err, clip: cc.AudioClip) =>

        {

            this.bgmusic = clip;

            cc.audioEngine.playMusic(this.bgmusic, true);

        });

    }

   // cc.audioEngine.setMusicVolume(0.5)

}

//播放音效

static PlaySound(filename: string)

{

    if (!this.getSoundFun())

        return;

    // 获取一个资源路径

    let file = "Musics/" + filename;

    if (this.effectList[filename])

    {

        cc.audioEngine.playEffect(this.effectList[filename], false);

    } else

    {

        //预加载并播放

        cc.resources.load(file, cc.AudioClip, (err, clip: cc.AudioClip) =>

        {

            cc.audioEngine.playEffect(clip, false);

            this.effectList[filename] = clip

        });

    };

}

// update (dt) {}

}

也许是你想要的

cc.audioEngine 3.3.1弃用了。

哦哦,一直用的2.4.6,没关注, 那这样的话就搞个常驻节点啊,原理差不太多

https://docs.cocos.com/creator/3.3/manual/zh/audio-system/overview.html
官方现在推荐使用的是audioSource, 播放音乐用 play, 播放音效用 playOneShot. 但是play不带任何参数。找了好久也找不到具体的解决办法,现在准备音乐的开关用play和stop来控制,音效的开关通过保存音量大小来控制。

我现在的方案是用常驻节点,web上面audioSuorce可以不依赖节点,原生没有依赖节点会报错,同时一个音频一个对应一个audioSource组件,切换场景的时候删除

一个audioSource只能同时操作单个音频,当然如果你的游戏只能同时播放一个音频的话当我没说

现在的目标就是原生情况下,管理音乐和音效俩种音频的开启和关闭。在一个场景中,背景音乐开启时要一直播放,这时候允许播放音效。关闭音乐或者音效都不影响对方的播放。我现在做的也是做一个常驻节点,挂载了一个audioSource组件。 接下来该怎么操作呢?

我已经说了,一个音频对应一个audioSource,你可以提供音频添加和删除接口,添加音频时同时添加audioSource,然后返回一个句柄或者直接返回这个audioSource,这个句柄对应这个音频,接下来就通过句柄操作音频,然后切换场景的时候清理所有不用的音频信息

那同时播放大量音效的时候,是不是需要创建大量的audioSource,会对性能造成影响吗

按照cocos的用法现在只能这样搞,根本不用考虑其他的,因为没路可走,顶多回收利用audioSrouce,要么就用第三方

不能搞个数组吗???

或者用一个audioSource用来播放背景音乐,然后用一个audioSource播放音效,使用playOneShot接口,但是音效不能中途停止,这样最简单

能具体说说嘛

也考虑过,但是很不优雅 :rofl:,就没用。我试试吧

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。