239 lines
6.9 KiB
Plaintext
239 lines
6.9 KiB
Plaintext
autoImport("BgmCtrl")
|
||
FunctionBGMCmd = class("FunctionBGMCmd")
|
||
|
||
FunctionBGMCmd.BgmSort = {
|
||
Default = {priority=1},
|
||
Mission = {priority=2},
|
||
JukeBox = {priority=3},
|
||
Activity = {priority=4},
|
||
UI = {priority=5},
|
||
}
|
||
|
||
FunctionBGMCmd.MaxVolume = 0.7
|
||
|
||
function FunctionBGMCmd.Me()
|
||
if nil == FunctionBGMCmd.me then
|
||
FunctionBGMCmd.me = FunctionBGMCmd.new()
|
||
end
|
||
return FunctionBGMCmd.me
|
||
end
|
||
|
||
function FunctionBGMCmd:ctor()
|
||
self.currentNewBgm = nil
|
||
self.currentVolume = FunctionBGMCmd.MaxVolume
|
||
self.mute = false
|
||
self.fadeInStart = 0.5
|
||
self.defaultBgm = BgmCtrl.new(nil,FunctionBGMCmd.BgmSort.Default,0,100)
|
||
self:Reset()
|
||
self:SetMaxVolume(FunctionBGMCmd.MaxVolume)
|
||
end
|
||
|
||
function FunctionBGMCmd:Reset()
|
||
self:SetCurrentBgm(self.defaultBgm,false)
|
||
end
|
||
|
||
function FunctionBGMCmd:StartSpeakVoice()
|
||
self:SetVolume(0.2 * self.currentVolume)
|
||
end
|
||
|
||
function FunctionBGMCmd:EndSpeakVoice()
|
||
self:SetVolume(self.currentVolume)
|
||
end
|
||
|
||
function FunctionBGMCmd:StartSolo()
|
||
self:SetVolume(0.2 * self.currentVolume)
|
||
end
|
||
|
||
function FunctionBGMCmd:EndSolo()
|
||
self:SetVolume(self.currentVolume)
|
||
end
|
||
|
||
function FunctionBGMCmd:GetMaxVolume(v)
|
||
return math.min(v,self.currentVolume)
|
||
end
|
||
|
||
function FunctionBGMCmd:SetMute(val)
|
||
self.mute = val
|
||
if(self.currentNewBgm) then
|
||
self.currentNewBgm:SetMute(val)
|
||
end
|
||
end
|
||
|
||
function FunctionBGMCmd:SettingSetVolume(v)
|
||
if(v>=0 and v<=1) then
|
||
v = FunctionBGMCmd.MaxVolume * v
|
||
end
|
||
AudioManager.volume = v
|
||
self.currentVolume = v
|
||
self:SetMaxVolume(v)
|
||
self:SetVolume(v)
|
||
end
|
||
|
||
function FunctionBGMCmd:SetVolume(v)
|
||
v = self:GetMaxVolume(v)
|
||
-- if(self.defaultBgm) then
|
||
-- self.defaultBgm:SetVolume(v)
|
||
-- end
|
||
if(self.currentNewBgm) then
|
||
self.currentNewBgm:SetVolume(v)
|
||
end
|
||
end
|
||
|
||
function FunctionBGMCmd:SetMaxVolume(v)
|
||
v = self:GetMaxVolume(v)
|
||
if(self.defaultBgm) then
|
||
self.defaultBgm:SetMaxVolume(v)
|
||
end
|
||
if(self.currentNewBgm) then
|
||
self.currentNewBgm:SetMaxVolume(v)
|
||
end
|
||
end
|
||
|
||
function FunctionBGMCmd:GetDefaultBGM()
|
||
if(self.defaultBgm and AudioManager.Instance~=nil) then
|
||
self.defaultBgm:SetAudioSource(AudioManager.Instance.bgMusic)
|
||
end
|
||
return self.defaultBgm
|
||
end
|
||
|
||
function FunctionBGMCmd:SetCurrentBgm(bgm,fade,outDuration,inDuration,fadeInStart)
|
||
if(self.currentNewBgm~=bgm and self.currentNewBgm) then
|
||
if(fade) then
|
||
local currentNewBgm = self.currentNewBgm
|
||
currentNewBgm:FadeFromTo(currentNewBgm:GetVolume(),0,outDuration,function ()
|
||
if(currentNewBgm~=self.defaultBgm) then
|
||
currentNewBgm:Destroy()
|
||
end
|
||
end)
|
||
else
|
||
if(self.currentNewBgm~=self.defaultBgm) then
|
||
self.currentNewBgm:Destroy()
|
||
end
|
||
end
|
||
end
|
||
self.currentNewBgm = bgm
|
||
if(self.currentNewBgm) then
|
||
if(fade) then
|
||
self.currentNewBgm:FadeFromTo(fadeInStart and fadeInStart or self.fadeInStart,1,inDuration)
|
||
else
|
||
--TODO
|
||
end
|
||
end
|
||
end
|
||
|
||
--percent為true則progress代表百分比進度,否則為具體時間秒為單位
|
||
function FunctionBGMCmd:PlayJukeBox(bgmPath,progress,percent,playTimes)
|
||
self:TryPlayBGMSort(bgmPath,progress,FunctionBGMCmd.BgmSort.JukeBox,percent,playTimes)
|
||
end
|
||
|
||
function FunctionBGMCmd:StopJukeBox()
|
||
self:StopBgm(FunctionBGMCmd.BgmSort.JukeBox)
|
||
end
|
||
|
||
function FunctionBGMCmd:PlayMissionBgm(bgmPath,playTimes)
|
||
self:TryPlayBGMSort(bgmPath,0,FunctionBGMCmd.BgmSort.Mission,false,playTimes)
|
||
end
|
||
|
||
function FunctionBGMCmd:StopMissionBgm()
|
||
self:StopBgm(FunctionBGMCmd.BgmSort.Mission)
|
||
end
|
||
|
||
function FunctionBGMCmd:PlayActivityBgm(bgmPath,playTimes)
|
||
self:TryPlayBGMSort(bgmPath,0,FunctionBGMCmd.BgmSort.Activity,false,playTimes)
|
||
end
|
||
|
||
function FunctionBGMCmd:StopActivityBgm()
|
||
self:StopBgm(FunctionBGMCmd.BgmSort.Activity)
|
||
end
|
||
|
||
function FunctionBGMCmd:PlayUIBgm(bgmPath,playTimes,outDuration,inDuration,fallbackDuration,fallbackFadeStartVolumn)
|
||
self:TryPlayBGMSort(bgmPath,0,FunctionBGMCmd.BgmSort.UI,false,playTimes,outDuration,inDuration,fallbackDuration,fallbackFadeStartVolumn)
|
||
end
|
||
|
||
function FunctionBGMCmd:StopUIBgm(fallbackDuration,fallbackFadeStartVolumn)
|
||
self:StopBgm(FunctionBGMCmd.BgmSort.UI,fallbackDuration,fallbackFadeStartVolumn)
|
||
end
|
||
|
||
function FunctionBGMCmd:ReplaceCurrentBgm(bgmPath)
|
||
if(AudioManager.Instance~=nil and AudioManager.Instance.bgMusic~=nil) then
|
||
LogUtility.InfoFormat("場景預設背景音樂替換為{0}",bgmPath )
|
||
local clip = ResourceManager.Instance:SLoadByType(ResourcePathHelper.AudioBGM(bgmPath), AudioClip);
|
||
if(clip~=nil) then
|
||
AudioManager.Instance.bgMusic.clip = clip
|
||
AudioManager.Instance.bgMusic:Play()
|
||
end
|
||
end
|
||
end
|
||
|
||
--playTimes 播放次數
|
||
function FunctionBGMCmd:TryPlayBGMSort(bgmPath,progress,playType,percent,playTimes,outDuration,inDuration,fallbackDuration,fallbackFadeStartVolumn)
|
||
if(percent and progress>=1) then
|
||
print("播放音樂超過其總長度,無視此次播放")
|
||
return
|
||
end
|
||
if(self.currentNewBgm) then
|
||
if(self.currentNewBgm.bgmType.priority > playType.priority) then
|
||
return
|
||
end
|
||
end
|
||
self:ChangeBGM(bgmPath,progress,playType,percent,playTimes,outDuration,inDuration,fallbackDuration,fallbackFadeStartVolumn)
|
||
end
|
||
|
||
function FunctionBGMCmd:StopBgm(playType,fallbackDuration,fallbackFadeStartVolumn )
|
||
if(self.currentNewBgm) then
|
||
if(self.currentNewBgm.bgmType == playType) then
|
||
self:Clear(fallbackDuration,fallbackFadeStartVolumn)
|
||
end
|
||
end
|
||
end
|
||
|
||
function FunctionBGMCmd:Pause(fade)
|
||
if(self.currentNewBgm) then
|
||
if(AudioManager.Instance~=nil) then
|
||
self.defaultBgm:SetAudioSource(AudioManager.Instance.bgMusic)
|
||
end
|
||
self.currentNewBgm:Pause(fade)
|
||
end
|
||
end
|
||
|
||
function FunctionBGMCmd:UnPause(fade)
|
||
if(self.currentNewBgm) then
|
||
if(AudioManager.Instance~=nil) then
|
||
self.defaultBgm:SetAudioSource(AudioManager.Instance.bgMusic)
|
||
end
|
||
self.currentNewBgm:UnPause(fade)
|
||
end
|
||
end
|
||
|
||
function FunctionBGMCmd:ChangeBGM(bgmPath,progress,playType,percent,playTimes,outDuration,inDuration,fallbackDuration,fallbackFadeStartVolumn)
|
||
if(AudioManager.Instance~=nil) then
|
||
self.defaultBgm:SetAudioSource(AudioManager.Instance.bgMusic)
|
||
progress = progress or 0
|
||
local go = GameObject("ReplaceBGM")
|
||
go:AddComponent(AudioSource)
|
||
go.transform.parent = AudioManager.Instance.bgMusic.transform.parent
|
||
local audioSource = AudioHelper.SPlayOn(ResourcePathHelper.AudioBGM(bgmPath),go)
|
||
local bgmCtrl = BgmCtrl.new(audioSource.audioSource,playType,playTimes,100,nil)
|
||
bgmCtrl:SetFinishCallback(function ()
|
||
bgmCtrl:Destroy()
|
||
self:Clear(fallbackDuration,fallbackFadeStartVolumn)
|
||
end)
|
||
bgmCtrl:SetMute(self.mute)
|
||
bgmCtrl:SetMaxVolume(self.currentVolume)
|
||
bgmCtrl:SetVolume(self.fadeInStart)
|
||
if(percent) then
|
||
progress = math.clamp(progress,0,0.99)
|
||
progress = progress * audioSource.clip.length
|
||
else
|
||
progress = math.clamp(progress,0,audioSource.clip.length-1)
|
||
end
|
||
bgmCtrl:SetProgress(progress)
|
||
bgmCtrl:Play()
|
||
self:SetCurrentBgm(bgmCtrl,true,outDuration,inDuration)
|
||
end
|
||
end
|
||
|
||
function FunctionBGMCmd:Clear(fallbackDuration,fallbackFadeStartVolumn)
|
||
LogUtility.Info(string.format("播放結束 fallbackDuration:%s fallbackFadeStartVolumn:%s", fallbackDuration, fallbackFadeStartVolumn))
|
||
self:SetCurrentBgm(self.defaultBgm,true,nil,fallbackDuration,fallbackFadeStartVolumn)
|
||
end |