|
|
- LuaSoundManager = LuaSoundManager or BaseClass()
- local LuaSoundManager = LuaSoundManager
- local soundMgr = soundMgr
- local math_random = math.random
-
- LuaSoundManager.SOUND_TYPE =
- {
- SKILL = 1,
- UI = 2,
- ROLE = 3,
- FUNC = 4,
- NPC = 5,
- SCENE = 6,
- DROP = 7,
- GOD = 8,
- STORY = 9,
- GUIDE = 10,
- }
-
- LuaSoundManager.SOUND_PRE =
- {
- [1] = "sound_skill",
- [2] = "sound_ui",
- [3] = "sound_role",
- [4] = "sound_func",
- [5] = "sound_npc_",
- [6] = "sound_scene_",
- [7] = "sound_drop",
- [8] = "sound_god",
- [9] = "sound_story_",
- [10] = "sound_guide",
- }
-
- LuaSoundManager.SOUND_UI = {
- NONE = 9000,--不需要声音
- OPEN = 9001,--开界面
- CLOSE = 9002,--关界面
- CLICK = 9003,--点击
- SWITCH = 9003,--暂时没有区分音效和点击
-
- FAULT = 9004,--报错、无效操作、物品不足等
- AWARD = 9005,--打开宝箱
- DICE = 9006,--掷骰子
- SUCCESS = 9007,--升阶、分解、合成等操作成功(获得物品或其他数值奖励)
- UPGRADE = 9008, --完成任务
- LEVELUP = 9009, --升级
- EXPBULLETSHOT1 = 9010, -- 经验副本 霰射音效1
- EXPBULLETSHOT2 = 9011, -- 经验副本 霰射音效2
- EXPBULLETLASER = 9012, -- 经验副本 激光音效
- }
-
- function LuaSoundManager:__init()
- LuaSoundManager.Instance = self
- self.last_backgound_abName = nil
- self.current_scene_sound=""
- self.mute_request = {}
- self.sound_effect_time_list = {} --记录音效播放时间,cd控制用
-
- GlobalEventSystem:Bind(EventName.CHANGE_ACCOUNT, function()
- self:Reset()
- end)
-
- GlobalEventSystem:Bind(EventName.CHANGE_ROLE, function()
- self:Reset()
- end)
- self:InitVolumeCache()
- self:InitEvent()
- end
-
- function LuaSoundManager:InitEvent( )
- local function play_ui_effect( use_sound)
- self:PlayUIEffectSound(use_sound)
- end
- GlobalEventSystem:Bind(EventName.PLAY_UI_EFFECT_SOUND,play_ui_effect)
- end
- function LuaSoundManager:Reset()
- self.mute_request = {}
- end
-
- function LuaSoundManager:getInstance()
- if LuaSoundManager.Instance == nil then
- LuaSoundManager.New()
- end
- return LuaSoundManager.Instance
- end
-
-
- function LuaSoundManager:PlayLoginSound(sound_id, volume)
- if self.volume_cache_value and self.volume_cache_value <= 0 then
- return
- end
- local sound_type = LuaSoundManager.SOUND_TYPE.SCENE
- local ab_name = LuaSoundManager.SOUND_PRE[sound_type] .. tostring(sound_id)
- if self.last_backgound_abName and self.last_backgound_abName == ab_name then
- if volume then
- self:ChangeVolume(volume)
- end
- return
- end
- if self:StopBacksound() then
- self.last_backgound_abName = ab_name
- local back_ground_vol = volume or Config.ConfigSound.DefaultSceneVolume
- soundMgr:PlayBacksound(ab_name,tostring(sound_id),back_ground_vol)
- end
- end
- --播放场景音乐
- function LuaSoundManager:PlayBackground(scene_id, need_random)
- if self.volume_cache_value and self.volume_cache_value <= 0 then
- return
- end
- local scene_sound = Config.ConfigSound.DefaultScene
- local sound_cfg = Config.ConfigSound.Scene[scene_id]
- if sound_cfg then
- if #sound_cfg > 1 and need_random then
- local index = math_random(1, #sound_cfg)
- scene_sound = sound_cfg[index]
- else
- scene_sound = sound_cfg[1]
- end
- elseif ConfigItemMgr.Instance:GetSceneItem(scene_id) then
- local scene_type = ConfigItemMgr.Instance:GetSceneItem(scene_id).type
- if Config.ConfigSound.DefaultSceneType[scene_type] then
- scene_sound = Config.ConfigSound.DefaultSceneType[scene_type]
- end
- end
-
- self.current_scene_sound = scene_sound
- local back_ground_vol =nil
- if Config.ConfigSound.DefaultSceneTypeVolume[self.current_scene_sound] then
- back_ground_vol = Config.ConfigSound.DefaultSceneTypeVolume[self.current_scene_sound]
- else
- back_ground_vol = Config.ConfigSound.DefaultSceneVolume
- end
- local sound_type = LuaSoundManager.SOUND_TYPE.SCENE
- local ab_name = LuaSoundManager.SOUND_PRE[sound_type] .. tostring(scene_sound)
- local setting_music_vol = self.cookieSetting.sound * 0.01
- self.cur_backgound_abName = ab_name
- self.cur_backgound_vol = back_ground_vol and back_ground_vol * setting_music_vol or setting_music_vol
- self.cur_scene_sound = scene_sound
- --首次的话直接播放
- if not self.last_backgound_abName then
- soundMgr:PlayBacksound(self.cur_backgound_abName,tostring(self.cur_scene_sound),back_ground_vol)
- return
- end
- --渐变过渡
- if self.last_backgound_abName ~= ab_name then
- local cur_vol = soundMgr.volume
- local function fadeOut()
- cur_vol = cur_vol - 0.02
- if cur_vol < 0.1 then
- cur_vol = 0.1
- end
- -- print("fadeOut ",cur_vol)
-
- self:ChangeVolume(cur_vol)
- if cur_vol <= 0.1 then
- self.last_backgound_vol = 0
- -- print("播放音乐 ",self.cur_backgound_abName,self.cur_scene_sound,self.cur_backgound_vol)
- self:StopBacksound()
- soundMgr:PlayBacksound(self.cur_backgound_abName,tostring(self.cur_scene_sound),back_ground_vol)
- local function fadeIn()
- self.last_backgound_vol = self.last_backgound_vol + 0.01
- local targetVol = self.cur_backgound_vol
- if self.last_backgound_vol >= targetVol then
- self.last_backgound_vol = targetVol
- end
- self:ChangeVolume(self.last_backgound_vol)
- -- print("fadeIn ",self.last_backgound_vol)
- if self.last_backgound_vol >= targetVol then
- GlobalTimerQuest:CancelQuest(self.fade_in_id)
- self.fade_in_id = nil
- self.last_backgound_abName = self.cur_backgound_abName
- self.last_backgound_vol = targetVol
- end
- end
- local function delay()
- if not self.fade_in_id then
- self.fade_in_id = GlobalTimerQuest:AddPeriodQuest(fadeIn,0.02,-1)
- end
- end
- setTimeout(delay,0.5) --假装等待加载
-
- GlobalTimerQuest:CancelQuest(self.fade_out_id)
- self.fade_out_id = nil
- end
- end
- if not self.fade_out_id then
- self.fade_out_id = GlobalTimerQuest:AddPeriodQuest(fadeOut,0.02,-1)
- end
- end
- end
-
- function LuaSoundManager:PlayBackgroundSound(sound_name, sound_type, force)
- if sound_name == self.current_scene_sound and not force then
- return
- end
- if self.volume_effect_cache_value and self.volume_effect_cache_value <= 0 then
- return
- end
- self.current_scene_sound = sound_name
- local back_ground_vol =nil
- if Config.ConfigSound.DefaultSceneTypeVolume[self.current_scene_sound] then
- back_ground_vol = Config.ConfigSound.DefaultSceneTypeVolume[self.current_scene_sound]
- else
- back_ground_vol = Config.ConfigSound.DefaultSceneVolume
- end
-
- local ab_name = LuaSoundManager.SOUND_PRE[sound_type]..tostring(sound_name)
-
- local setting_music_vol = self.cookieSetting.sound * 0.01
- self.cur_backgound_abName = ab_name
- self.cur_backgound_vol = back_ground_vol and back_ground_vol * setting_music_vol or setting_music_vol
-
- --首次的话直接播放
- if not self.last_backgound_abName then
- soundMgr:PlayBacksound(self.cur_backgound_abName,tostring(sound_name),back_ground_vol)
- return
- end
-
- --渐变过渡
- if self.last_backgound_abName ~= ab_name or force then
- local cur_vol = soundMgr.volume
- local function fadeOut()
- cur_vol = cur_vol - 0.02
- if cur_vol < 0.1 then
- cur_vol = 0.1
- end
-
- self:ChangeVolume(cur_vol)
- if cur_vol <= 0.1 then
- self.last_backgound_vol = 0
- self:StopBacksound()
- soundMgr:PlayBacksound(self.cur_backgound_abName,sound_name,back_ground_vol)
- local function fadeIn()
- self.last_backgound_vol = self.last_backgound_vol + 0.01
- local targetVol = self.cur_backgound_vol
- if self.last_backgound_vol >= targetVol then
- self.last_backgound_vol = targetVol
- end
- self:ChangeVolume(self.last_backgound_vol)
- if self.last_backgound_vol >= targetVol then
- GlobalTimerQuest:CancelQuest(self.fade_in_id)
- self.fade_in_id = nil
- self.last_backgound_abName = self.cur_backgound_abName
- self.last_backgound_vol = targetVol
- end
- end
- local function delay()
- if not self.fade_in_id then
- self.fade_in_id = GlobalTimerQuest:AddPeriodQuest(fadeIn,0.02,-1)
- end
- end
- setTimeout(delay,0.5) --假装等待加载
-
- GlobalTimerQuest:CancelQuest(self.fade_out_id)
- self.fade_out_id = nil
- end
- end
- if not self.fade_out_id then
- self.fade_out_id = GlobalTimerQuest:AddPeriodQuest(fadeOut,0.02,-1)
- end
- end
- end
-
- --继续播放背景音乐
- function LuaSoundManager:ContinueBacksound()
- soundMgr:ContinueBacksound()
- end
-
- --暂停背景音乐
- function LuaSoundManager:PauseBacksound()
- soundMgr:PauseBacksound()
- end
-
- --停止背景音乐
- function LuaSoundManager:StopBacksound()
- if self.last_backgound_abName then
- soundMgr:StopBacksound()
- resMgr:UnloadAssetBundle(self.last_backgound_abName, true, 1)
- end
- return true
- end
-
- --播放指定音效
- function LuaSoundManager:PlayEffect(ref_tar, path, is_loop, sound_type, vol_modulus, speed)
- if not path then return end
- --首次登陆还未进入游戏,协议返回的成功失败等消息不要有声音
- if RoleController and RoleController.Instance then
- if not RoleController.Instance.is_load_and_enter_finished then
- if path == "award" or path == "success" or path == "upgrade" or path == "fault" then
- return
- end
- end
- end
-
- if self.volume_effect_cache_value and self.volume_effect_cache_value < 0.01 then
- return path
- end
-
- local res_name = path
- local ab_name = LuaSoundManager.SOUND_PRE[sound_type]
- if sound_type == LuaSoundManager.SOUND_TYPE.NPC or sound_type == LuaSoundManager.SOUND_TYPE.STORY then --NPC音效变成了单独打包
- ab_name = LuaSoundManager.SOUND_PRE[sound_type]..tostring(res_name)
- end
- if not vol_modulus then
- if Config.ConfigSound.SoundEffect[sound_type] then
- if Config.ConfigSound.SoundEffect[sound_type][path] then
- vol_modulus = Config.ConfigSound.SoundEffect[sound_type][path]
- else
- vol_modulus = Config.ConfigSound.DefaultSoundEffectTypeVolume[sound_type]
- end
- else
- vol_modulus = Config.ConfigSound.DefaultSoundEffectVolume
- end
- end
- self.sound_effect_time_list[path] = Time.time
- local effect_id = lua_resM:loadSound(ref_tar, ab_name, tostring(res_name), is_loop,vol_modulus, speed)
- return effect_id or path
- end
-
- --停止指定音效
- function LuaSoundManager:StopEffect(ref_tar, sound_type, effect_id)
- local ab_name = LuaSoundManager.SOUND_PRE[sound_type]
-
- lua_resM:stopSound(ref_tar, ab_name, effect_id)
- end
-
- --加载语音
- function LuaSoundManager:LoadVoice(path, callback)
- soundMgr:LoadVoice(path, callback)
- end
-
- --初始化音量值
- function LuaSoundManager:InitVolumeCache( )
- self.volume_cache_value = soundMgr.volume
- self.volume_effect_cache_value = soundMgr.volumeEffect
- self.last_volume_cache_value = self.volume_cache_value
- end
-
- --改变声音音量大小
- function LuaSoundManager:ChangeVolume(value)
- soundMgr.volume = value
- self.volume_cache_value = value
- if self.last_volume_cache_value and self.last_volume_cache_value <= 0 and value and value > 0 then
- --播放场景背景音乐
- self.last_backgound_abName = false
- local cur_scene = SceneManager:getInstance():GetSceneId()
- self:PlayBackground(cur_scene)
- end
- self.last_volume_cache_value = value
- end
-
- --改变音效音量大小
- function LuaSoundManager:ChangeVolumeEffect(value)
- self.volume_effect_cache_value = value
- soundMgr.volumeEffect = value
- end
-
- --是否音效静音
- function LuaSoundManager:IsEffectMute( )
- if self.volume_effect_cache_value and self.volume_effect_cache_value <= 0.1 then
- return true
- else
- return false
- end
- end
-
- --开关背景音乐
- function LuaSoundManager:SwitchMusicState(open)
- soundMgr.musicSwitch = open
- end
-
- --开关音效
- function LuaSoundManager:SwitchEffectState(open)
- soundMgr.effectSwitch = open
- end
- --添加静音请求
- function LuaSoundManager:AddMuteQuest(obj)
- if not soundMgr.musicSwitch then soundMgr.musicSwitch = false end
- if not soundMgr.effectSwitch then soundMgr.effectSwitch = false end
- self.mute_request[obj] = true
-
- if RuntimePlatform and SystemRuntimePlatform.IsIphone() then
- self.ios_last_scene_sound = self.current_scene_sound
-
- self:PauseBacksound()
- end
- end
-
- --移除静音请求
- function LuaSoundManager:CancelMuteQuest(obj)
- self.mute_request[obj] = nil
- if TableSize(self.mute_request) == 0 then
- if soundMgr.musicSwitch then soundMgr.musicSwitch = true end
- if soundMgr.effectSwitch then soundMgr.effectSwitch = true end
- end
-
- if self.ios_last_scene_sound then
- self:ContinueBacksound()
- self.ios_last_scene_sound = nil
- end
- end
-
- --恢复所有声音
- function LuaSoundManager:StartAllVoice()
- -- soundMgr.volume = 1
- self:LoadSetting()
- end
-
- function LuaSoundManager:PlayingSoundEffect(name, cd)
- -- return soundMgr:PlayingSoundEffect(name) --有gc的开销,先在lua层缓存时间做CD
-
- local cd_time = cd or 0.2
- if self.sound_effect_time_list and self.sound_effect_time_list[name] then
- return self.sound_effect_time_list[name] + cd_time > Time.time
- end
- end
-
- function LuaSoundManager:LoadSetting()
- -- local cookieSetting = CookieWrapper.Instance:GetCookie(CookieLevelType.Common,CookieKey.SYSTEM_SETTING)
- -- if cookieSetting then
- -- soundMgr.musicSwitch = cookieSetting.musicSound
- -- soundMgr.effectSwitch = cookieSetting.effectSound
- -- end
- self.cookieSetting = CookieWrapper.Instance:GetCookie(CookieLevelType.Common,CookieKey.SOUND_SETTING)
- self.cookieSetting = self.cookieSetting or {sound = Config.ConfigSound.TotalVloume, effectSound = Config.ConfigSound.TotalSoundEffect}
- if self.cookieSetting then
- self:ChangeVolume(self.cookieSetting.sound / 100)
- self:ChangeVolumeEffect(self.cookieSetting.effectSound / 100)
- end
- end
-
- function LuaSoundManager:CreateAudioClip(voice_data, data_ver, callback)
- if data_ver <= 29 then
- return soundMgr:CreateAudioClip(voice_data)
- elseif data_ver <= 32 then
- return soundMgr:CreateAudioClipFromCompress(voice_data)
- else
- if Application.isMobilePlatform then
- return soundMgr:CreateAudioClip(voice_data, AppConst.CachedVoicePath.."/tmp.mp3", callback)
- else
- return soundMgr:CreateAudioClip(voice_data, AppConst.CachedVoicePath.."/tmp.wav", callback)
- end
- end
- end
-
- function LuaSoundManager:PlayUIEffectSound(use_sound)
- if not use_sound then
- return
- end
- if lua_soundM then
- if use_sound == LuaSoundManager.SOUND_UI.OPEN and not lua_soundM:PlayingSoundEffect("window_open", 0.7) then
- self:PlayEffect(self, "window_open",false,LuaSoundManager.SOUND_TYPE.UI)
- elseif use_sound == LuaSoundManager.SOUND_UI.CLOSE and not lua_soundM:PlayingSoundEffect("window_close", 0.2) then
- self:PlayEffect(self, "window_close",false,LuaSoundManager.SOUND_TYPE.UI)
- elseif use_sound == LuaSoundManager.SOUND_UI.SWITCH or use_sound == LuaSoundManager.SOUND_UI.CLICK then
- self:PlayEffect(self, "click",false,LuaSoundManager.SOUND_TYPE.UI)
- elseif use_sound == LuaSoundManager.SOUND_UI.FAULT and not lua_soundM:PlayingSoundEffect("fault", 1) then
- self:PlayEffect(self, "fault",false,LuaSoundManager.SOUND_TYPE.UI)
- elseif use_sound == LuaSoundManager.SOUND_UI.AWARD and not lua_soundM:PlayingSoundEffect("award", 1.3) then
- self:PlayEffect(self, "award",false,LuaSoundManager.SOUND_TYPE.UI)
- elseif use_sound == LuaSoundManager.SOUND_UI.DICE and not lua_soundM:PlayingSoundEffect("dice", 2.6) then
- self:PlayEffect(self, "dice",false,LuaSoundManager.SOUND_TYPE.UI)
- elseif use_sound == LuaSoundManager.SOUND_UI.SUCCESS and not lua_soundM:PlayingSoundEffect("success", 0.2) then
- self:PlayEffect(self, "success",false,LuaSoundManager.SOUND_TYPE.UI)
- elseif use_sound == LuaSoundManager.SOUND_UI.UPGRADE and not lua_soundM:PlayingSoundEffect("upgrade", 0.1) then
- self:PlayEffect(self, "upgrade",false,LuaSoundManager.SOUND_TYPE.ROLE, 1)
- elseif use_sound == LuaSoundManager.SOUND_UI.LEVELUP and not lua_soundM:PlayingSoundEffect("levelup", 0.2) then
- self:PlayEffect(self, "levelup",false,LuaSoundManager.SOUND_TYPE.ROLE, 1, 1, true)
- elseif use_sound == LuaSoundManager.SOUND_UI.EXPBULLETSHOT1 and not lua_soundM:PlayingSoundEffect("exp_bullet_shot1", 0.6) then
- self:PlayEffect(self, "exp_bullet_shot1",false,LuaSoundManager.SOUND_TYPE.UI, 1, 1, true)
- elseif use_sound == LuaSoundManager.SOUND_UI.EXPBULLETSHOT2 and not lua_soundM:PlayingSoundEffect("exp_bullet_shot2", 0.6) then
- self:PlayEffect(self, "exp_bullet_shot2",false,LuaSoundManager.SOUND_TYPE.UI, 1, 1, true)
- elseif use_sound == LuaSoundManager.SOUND_UI.EXPBULLETLASER and not lua_soundM:PlayingSoundEffect("exp_bullet_laser", 0.6) then
- self:PlayEffect(self, "exp_bullet_laser",false,LuaSoundManager.SOUND_TYPE.UI, 1, 1, true)
- end
- end
- end
-
- function LuaSoundManager:PlayDungeonResultSound( is_win )
- local career = RoleManager.Instance.mainRoleInfo.career or 1
- local prefix = is_win and "victor_" or "fail_"
- local suffix = is_win and math_random(1,2) or 1
- local res_name = prefix .. career*1000 .. "_" .. suffix
- self:PlayEffect(self, res_name, false, LuaSoundManager.SOUND_TYPE.ROLE, 1)
- end
|