local SceneLoader = class("SceneLoader") local defaultLimitTime = 2 local defaultLerpSpd = 2.5 function SceneLoader:ctor() self.limitLoadingTime = defaultLimitTime self.fakeStopProgress = 100 self.lerpSpd = defaultLerpSpd self.fadeBGM = true self:Init() end function SceneLoader:Init() self.autoAllowSceneActivation = true self.Progress = 0 self.passedTime = 0 self.isLoading = false self.sceneInfo = nil self.arriveLimitTime = false end function SceneLoader:EnableFadeBGM(value) self.fadeBGM = value end function SceneLoader:SyncLoad(name) self:TryLoadBundle(name) SceneUtil.SyncLoad(name) end function SceneLoader:SetLimitLoadTime(time,lerpSpd) self.limitLoadingTime = time self.lerpSpd = lerpSpd end function SceneLoader:RestoreLimitLoadTime() self.limitLoadingTime = defaultLimitTime self.lerpSpd = defaultLerpSpd end function SceneLoader:StartLoad(name,bundleName) if(self.asyncLoad ~= nil and self.asyncLoad.isDone==false)then return false end self:Init() self.isLoading = true self.sceneInfo = name self:TryLoadBundle(bundleName) self.asyncLoad = SceneManagement.SceneManager.LoadSceneAsync(name) self.asyncLoad.allowSceneActivation = false self.toProgress = 0 self.percent = 0 local bgMusic = FunctionBGMCmd.Me():GetDefaultBGM() if(bgMusic and AudioManager.Instance~=nil) then self.bgmVolume = bgMusic:GetVolume() else self.bgmVolume = FunctionBGMCmd.Me().currentVolume end if(self.asyncLoad) then TimeTickManager.Me():ClearTick(self) TimeTickManager.Me():CreateTick(0,16,self.Loading,self,1,true) end return true end function SceneLoader:TryLoadBundle(name) if(ApplicationHelper.AssetBundleLoadMode) then ResourceManager.Instance:SLoadScene(name) end end function SceneLoader:Loading(deltaTime) if(self.asyncLoad==nil) then return end self.passedTime = self.passedTime + Time.deltaTime self.arriveLimitTime = self.passedTime>=self.limitLoadingTime --unity的bug,progress到0.9后就不更新了 if(self.asyncLoad.progress < 0.89) then self.toProgress = self.asyncLoad.progress * 100; else if(not self.arriveLimitTime) then self.toProgress = self.fakeStopProgress else self.toProgress = 100 end end if(self.Progress < self.toProgress) then self.Progress = math.min(self.lerpSpd+self.Progress,self.toProgress) if(self.Progress>= self.toProgress and self.toProgress == 100) then --載入到100%的時候,背景音樂不播放 if(AudioManager.Instance~=nil) then AudioManager.Instance.bgMusic.volume = 0 end if(self.arriveLimitTime) then self.asyncLoad.allowSceneActivation = true; end else self.percent = self.Progress/100 local bgMusic = FunctionBGMCmd.Me():GetDefaultBGM() if(bgMusic and self.fadeBGM and AudioManager.Instance~=nil) then local v = 1 * (1-self.percent) + AudioManager.Instance.fadeOutEnd * self.percent bgMusic:SetVolume(v*self.bgmVolume) end end elseif(self.toProgress == 100 and self.arriveLimitTime) then if(not self.asyncLoad.allowSceneActivation and self.autoAllowSceneActivation)then self.asyncLoad.allowSceneActivation = true else self:LoadFinish() end end end function SceneLoader:SetAllowSceneActivation() if(self.asyncLoad and self.asyncLoad.allowSceneActivation) then self.asyncLoad.allowSceneActivation =true self.asyncLoad = nil end end function SceneLoader:SetDoneCallBack(callBack) self.DoneCallBack = callBack end function SceneLoader:SceneAwake() LeanTween.delayedCall(3,function () if(self.isLoading) then self.isLoading = false if(self.asyncLoad and self.asyncLoad.allowSceneActivation) then self.asyncLoad = nil end if(self.sceneInfo) then ResourceManager.Instance:SUnLoadScene(self.sceneInfo,false) end if(self.DoneCallBack ~=nil) then self.DoneCallBack(self.sceneInfo) self.DoneCallBack = nil end end end):setUseFrames(true) end function SceneLoader:LoadFinish() self.Progress = 100 self.fadeBGM = true TimeTickManager.Me():ClearTick(self) end return SceneLoader