local UIBatteryPanel = UIViewClass() local NetworkQualityStatus = { Good = 0, Normal = 1, Bad = 2 } local UpdatePowerGap = 0.05 local PingStr = "%sms" local BestPingValue = 100 local NormalPingValue = 200 local LowPowerValue = 0.1 local NormalPowerValue = 0.2 local PowerChargingState = 1 --UnityEngine.BatteryStatus.Charging local NetworkOfflineState = 0 --UnityEngine.NetworkReachability.NotReachable local NetworkWifiState = 2 --UnityEngine.NetworkReachability.ReachableViaLocalAreaNetwork local NetworkGSMState = 1 --UnityEngine.NetworkReachability.ReachableViaCarrierDataNetwork local AgentPingIntervalTime = 30 -- 战斗代理服刷新间隔 local AnimationLowNet = "AnimationLowNet" -------------------------------------- 系统函数 ---------------------------------- function UIBatteryPanel:OnCreated() self.lastNetlinkState = -1 self.lastNetState = -1 self.isCheckPower = true self.curPowerPercent = 0 self.powerState = -1 self.isOnCharging = nil self.networkStatus = -1 self.pingDelayTime = nil end function UIBatteryPanel:OnOpened(context) if SystemInfo.batteryLevel == -1 then self.isCheckPower = false self.img_ElectricityIcon.fillAmount = 1 UIUtils.SetActive(self.img_ChargeIcon, false) end self:RegistSystemEvent(EventID.BatteryLevelChange, self.RefreshPower) self:RegistSystemEvent(EventID.BatteryStatusChange, self.RefreshPowerStatus) self:RegistSystemEvent(EventID.NetworkStateChange, self.RefreshNetworkState) self:RegistSystemEvent(EventID.UI_BatteryShow, self.SetBatteryShow) self:RegistSystemEvent(EventID.BattleAgent_OpenAgentList, self.OpenAgentList) self:RegistSystemEvent(EventID.BattleAgent_SelectChanged, self.OnBattleAgentChanged) self:RegistSystemEvent(EventID.BattleAgent_UpdateIndex, self.UpdateBattleAgentIndex) self:RegistSystemEvent(EventID.BattleAgent_ChangeHint, self.BattleAgentHighDelayHint) self:RefreshPower(MDL.Setting.GetBatteryLevel()) self:RefreshPowerStatus(MDL.Setting.GetBatteryStatus()) self:RefreshNetworkState(MDL.Setting.GetNetworkState()) self:RefreshCurTime() self:RefreshPing() UIUtils.SetActive(self.img_Network, false) self:StartRepeatFunc(self.OnUpdateFun, 1) if CTL.BattleAgent.ShowBattleAgent() then MDL.BattleAgent.GetBattleAgentListReq(false) UIUtils.SetActive(self.img_Switch, true) self:StartRepeatFunc(self.OnUpdatePing, AgentPingIntervalTime) else UIUtils.SetActive(self.img_Switch, false) end UIUtils.SetActive(self.obj_NetRoot, not GameAppInfo.IsPCOrMacPackage()) end function UIBatteryPanel:OnUpdateFun(deltaTime, timeSinceUpdate) self:RefreshCurTime() self:RefreshPing() end -- TCP的ping function UIBatteryPanel:OnUpdatePing(deltaTime, timeSinceUpdate) CTL.BattleAgent.UpdateBattleAgentPing(self.panel_List.gameObject.activeSelf) end ----------------------------------------------------------------------------------- -- 刷新电量 function UIBatteryPanel:RefreshPower(batteryLevel) if not self.isCheckPower then return end -- 电量映射到5的倍数 batteryLevel = math.ceil(batteryLevel / UpdatePowerGap) * UpdatePowerGap if self.curPowerPercent == 0 or self.curPowerPercent ~= batteryLevel then self.curPowerPercent = batteryLevel self.img_ElectricityIcon.fillAmount = self.curPowerPercent end local curPowerState = 0 if self.curPowerPercent > LowPowerValue and self.curPowerPercent <= NormalPowerValue then curPowerState = 1 elseif self.curPowerPercent <= LowPowerValue then curPowerState = 2 end if self.powerState == -1 or self.powerState ~= curPowerState then self.powerState = curPowerState self.state_Electricity:SetState(self.powerState) end end -- 刷新电池状态 function UIBatteryPanel:RefreshPowerStatus(batteryStatus) if not self.isCheckPower then return end local curIsCharging = batteryStatus == PowerChargingState if not self.isOnCharging or self.isOnCharging ~= curIsCharging then self.isOnCharging = curIsCharging UIUtils.SetActive(self.img_ChargeIcon, self.isOnCharging) end end -- 刷新时间 function UIBatteryPanel:RefreshCurTime() UIUtils.SetLabel(self.txt_Time, os.date(UTL.Time.FormatDateEnum.HM)) end -- 刷新网络状态 function UIBatteryPanel:RefreshNetworkState(networkState) UIUtils.SetActive(self.img_Disconnected, networkState == NetworkOfflineState) UIUtils.SetActive(self.img_Wifi, networkState == NetworkWifiState) UIUtils.SetActive(self.img_5G, networkState == NetworkGSMState) if networkState ~= self.lastNetlinkState then logging.crit(LTAG.CRIT, "NetlinkStateChange", self.lastNetlinkState, networkState) end self.lastNetlinkState = networkState end function UIBatteryPanel:RefreshPing() -- 同步玩法显示ping值 local curPingDelayTime = -1 if LevelManager.IsSyncLevel() then curPingDelayTime = BattleExt.GetNetDelayTime() end if curPingDelayTime == -1 then -- 只有海外版本需要战斗服代理功能 if CTL.BattleAgent.ShowBattleAgent() then local curAgentData = MDL.BattleAgent.GetCurSelectAgentData() local ping = -1 if curAgentData then ping = MDL.BattleAgent.GetAgentPing(curAgentData) end UIUtils.SetLabel(self.txt_Delay, self:GetPingStr(ping)) local pingState = self:GetNetworkStatusByPing(ping) if pingState >= 0 then self.state_Wifi:SetState(pingState) self.state_5G:SetState(pingState) else self.state_Wifi:SetState(NetworkQualityStatus.Bad) self.state_5G:SetState(NetworkQualityStatus.Bad) end else UIUtils.SetLabel(self.txt_Delay, "") self.state_Wifi:SetState(0) self.state_5G:SetState(0) end else if self.pingDelayTime ~= curPingDelayTime then UIUtils.SetLabel(self.txt_Delay, self:GetPingStr(curPingDelayTime)) local curStatus = self:GetNetworkStatusByPing(curPingDelayTime) local formerStatus = self:GetNetworkStatusByPing(self.pingDelayTime) if curStatus ~= formerStatus then self.state_Wifi:SetState(curStatus) self.state_5G:SetState(curStatus) end self.pingDelayTime = curPingDelayTime end end end function UIBatteryPanel:GetNetworkStatusByPing(pingDelayTime) if not pingDelayTime or pingDelayTime < 0 then return -1 end local returnNetState = NetworkQualityStatus.Bad if pingDelayTime <= BestPingValue then returnNetState = NetworkQualityStatus.Good elseif pingDelayTime <= NormalPingValue then returnNetState = NetworkQualityStatus.Normal end if self.lastNetState ~= returnNetState then logging.crit(LTAG.CRIT, "NetworkStateChange", self.lastNetState, returnNetState, pingDelayTime) end self.lastNetState = returnNetState return returnNetState end function UIBatteryPanel:SetBatteryShow(isShow) UIUtils.SetActive(self.obj_NetRoot, isShow) end ---------- Start 切换战斗服相关 Start ---------- function UIBatteryPanel:OnButtonClicked(comp) if comp == self.group_Network then -- 只有海外版本需要战斗服代理功能 if CTL.BattleAgent.GetFightingShowPing() or CTL.BattleAgent.ShowBattleAgent() then MDL.BattleAgent.GetBattleAgentListReq(true) end elseif comp == self.btn_ClosePanelList then UIUtils.SetActive(self.panel_List, false) end end function UIBatteryPanel:OnCellInit(scrollRect, index, cellTable, data) if scrollRect == self.loop_Netline then UIUtils.SetLabel(cellTable.txt_Info, string.FormatByIdsId(Const_IDS.IDS_kcpagent_5, index + 1)) -- C#从0开始 UIUtils.SetLabel(cellTable.txt_Time, self:GetPingStr(MDL.BattleAgent.GetAgentPing(data))) -- 是否为当前选中 UIUtils.SetActive(cellTable.bg_Current, data.name == MDL.BattleAgent.GetCurSelectName()) end end function UIBatteryPanel:OnCellSelect(scrollRect, index, cellTable, data) if scrollRect == self.loop_Netline then if not LevelManager.IsSyncLevel() then MDL.BattleAgent.SelectBattleAgentReq(data.name) end end end function UIBatteryPanel:OpenAgentList() -- 关闭提示特效 UIUtils.SetActive(self.img_Info, false) self:StopUIAnimation(AnimationLowNet, false, true) UIUtils.SetActive(self.img_Network, false) UIUtils.SetActive(self.panel_List, true) -- 设置刷新提示 UIUtils.SetLabel(self.txt_RefreshHint, string.FormatByIdsId(Const_IDS.IDS_kcpagent_6, AgentPingIntervalTime)) local battleAgentList = MDL.BattleAgent.GetBattleAgentList() self.loop_Netline:ReloadAll(battleAgentList) end function UIBatteryPanel:UpdateBattleAgentIndex(index, data) if self.loop_Netline.Count >= index then self.loop_Netline:UpdateIndex(index - 1, data) end end function UIBatteryPanel:BattleAgentHighDelayHint() UIUtils.SetActive(self.img_Network, true) UIUtils.SetActive(self.img_Info, true) self:PlayUIAnimation(AnimationLowNet, false) PersistentData.PlayerData:Set(CTL.BattleAgent.HintRecord, true, true) end function UIBatteryPanel:OnBattleAgentChanged(name) CTL.BattleAgent.ReSetAgentPingHintCheckTime() UIUtils.SetActive(self.panel_List, false) end function UIBatteryPanel:GetPingStr(ping) if ping < 0 or ping > 1000 then return UTL.Color.FormatRedColor(string.format(PingStr, ">1000")) else if ping <= 100 then return UTL.Color.FormatGreenColor(string.format(PingStr, ping)) elseif ping <= 150 then return UTL.Color.FormatYellowColor(string.format(PingStr, ping)) else return UTL.Color.FormatRedColor(string.format(PingStr, ping)) end end end ------------ End 切换战斗服相关 End ------------ return UIBatteryPanel