local math = math local string = string local tonumber = tonumber local mathFloor = math.floor local mathCeil = math.ceil local mathMin = math.min local mathMax = math.max local stringFormat = string.format local stringSub = string.sub local stringFind = string.find local stringGsub = string.gsub local tableSort = table.sort local tableInsert = table.insert local Vec3Lerp = CS.UnityEngine.Vector3.Lerp local MathLerp = CS.UnityEngine.Mathf.Lerp local CSTextManagerGetText = CS.XTextManager.GetText local STR_MONTH = CSTextManagerGetText("Mouth") local STR_WEEK = CSTextManagerGetText("Week") local STR_DAY = CSTextManagerGetText("Day") local STR_HOUR = CSTextManagerGetText("Hour") local STR_MINUTE = CSTextManagerGetText("Minute") local STR_SECOND = CSTextManagerGetText("Second") local S = 60 local H = 3600 local D = 3600 * 24 local W = 3600 * 24 * 7 local M = 3600 * 24 * 30 XUiHelper = XUiHelper or {} XUiHelper.TimeFormatType = { DEFAULT = 1, -- 默认时间格式(大于一天显示天数,小于一天显示xx小时xx分) SHOP = 1, -- 商城时间格式 TOWER = 2, -- 爬塔时间格式 TOWER_RANK = 3, -- 爬塔排行消耗时间格式 CHALLENGE = 4, -- 挑战的时间 HOSTEL = 5, -- 宿舍倒计时 DRAW = 6, -- 抽卡倒计时 MAIN = 7, -- 主界面系统时间 PURCHASELB = 8, -- 礼包时间 ONLINE_BOSS = 9, -- 联机boss ACTIVITY = 10, -- 活动 MAINBATTERY = 11, -- 主界面血清剩余时间 HEADPORTRAIT = 12, -- 头像时间 DAILY_TASK = 13, --每日任务(显示X时X分,不足一分钟时显示一分钟) GUILDCD = 14, -- 公会冷却倒计时 CHATEMOJITIMER = 15, -- 倒计时(大于一天显示天数,小于一天大于一小时显示小时,小于一小时大于一分钟显示分钟,小于一分钟大于一秒钟显示秒钟) ACTIVITY_LINEBREAK = 16, --日期会换行(例:10\n天) NieRShow = 17, --尼尔玩法显示剩余时间(汉字替换为英文字符) STRONGHOLD = 18, --超级据点时间格式 TO_A_MINUTE = 19, --时间精确到分,不足一分钟时显示<1分钟,倒计时结束输出0分钟 MOE_WAR = 20, --倒计时(大于一天显示天数,小于一天大于一小时显示小时,小于一小时大于一分钟显示分钟,小于一分钟大于一秒钟显示一分钟) KillZone = 21, --杀戮无双(当剩余时间大于1天时,按天显示时间,当剩余时间小于1天时,按小时显示时间,剩余时间少于1小时,也显示1小时) RPG_MAKER_GAME = 22, --21年端午活动,只显示天(向上取整) PASSPORT = 23, --战斗通行证(时间≥1天时,显示【X天XX:XX】;小于1天时间时,显示【XX:XX】;小于一分钟大于一秒钟显示一分钟) } XUiHelper.DelayType = { Second = 1, Minute = 2, Hour = 3, Day = 4, } XUiHelper.ClientConfigType = { String = 1, Float = 2, Int = 3, Bool = 4, } XUiHelper.TagBgPath = { Red = CS.XGame.ClientConfig:GetString("UiBagItemRed"), Yellow = CS.XGame.ClientConfig:GetString("UiBagItemYellow"), Blue = CS.XGame.ClientConfig:GetString("UiBagItemBlue"), Green = CS.XGame.ClientConfig:GetString("UiBagItemGreen"), } function XUiHelper.CreateTemplates(rootUi, pool, datas, ctor, template, parent, onCreate) for i = 1, #datas do local data = datas[i] local item if i <= #pool then item = pool[i] else local go = CS.UnityEngine.Object.Instantiate(template) go.transform:SetParent(parent, false) item = ctor(rootUi, go) pool[i] = item end if onCreate then onCreate(item, data) end end for i = #datas + 1, #pool do local item = pool[i] item.GameObject:SetActive(false) end end function XUiHelper.CreateScrollItem(datas, template, parent, cb, scrollstyle) scrollstyle = scrollstyle or XGlobalVar.ScrollViewScrollDir.ScrollDown local width, height = template.gameObject:GetComponent("RectTransform").rect.width, template.gameObject:GetComponent("RectTransform").rect.height if scrollstyle == XGlobalVar.ScrollViewScrollDir.ScrollDown then parent:GetComponent("RectTransform").sizeDelta = CS.UnityEngine.Vector2(0, #datas * height) elseif scrollstyle == XGlobalVar.ScrollViewScrollDir.ScrollRight then parent:GetComponent("RectTransform").sizeDelta = CS.UnityEngine.Vector2(#datas * width, 0) end for i = 1, #datas do local obj = CS.UnityEngine.Object.Instantiate(template) obj.gameObject:SetActive(true) if scrollstyle == XGlobalVar.ScrollViewScrollDir.ScrollDown then obj.transform.localPosition = CS.UnityEngine.Vector3(width / 2, -height / 2 - height * (i - 1), 0) elseif scrollstyle == XGlobalVar.ScrollViewScrollDir.ScrollRight then obj.transform.localPosition = CS.UnityEngine.Vector3(width * (i - 1), 0, 0) end obj.transform.localScale = CS.UnityEngine.Vector3(1, 1, 1) obj.transform.localEulerAngles = CS.UnityEngine.Vector3(0, 0, 0) obj.transform:SetParent(parent, false) cb(obj, datas[i]) end end function XUiHelper.TryGetComponent(transform, path, type) local temp = transform:Find(path) if temp then if type then return temp:GetComponent(type) else return temp end else return nil end end function XUiHelper.SetQualityIcon(rootUi, imgQuality, quality) local spriteName = XArrangeConfigs.GeQualityPath(quality) rootUi:SetUiSprite(imgQuality, spriteName) end function XUiHelper.GetPanelRoot(ui) while ui.Parent do ui = ui.Parent end return ui end ------------时间相关begin------------ --==============================-- --desc: 固定的时间格式 --@second: 总秒数 --@return: 固定的时间格式 -- 时间大于1个月 则返回 X个月 -- 时间大于1周 则返回 X周 -- 时间大于1天 则返回 X天 -- 其余 则返回 XX:XX:XX --==============================-- function XUiHelper.GetTime(second, timeFormatType) timeFormatType = timeFormatType and timeFormatType or XUiHelper.TimeFormatType.DEFAULT local month, weeks, days, hours, minutes, seconds = XUiHelper.GetTimeNumber(second) if timeFormatType == XUiHelper.TimeFormatType.DEFAULT then if month >= 1 then return stringFormat("%d%s", month, STR_MONTH) end if weeks >= 1 then return stringFormat("%d%s", weeks, STR_WEEK) end if days >= 1 then return stringFormat("%d%s", days, STR_DAY) end return stringFormat("%02d:%02d:%02d", hours, minutes, seconds) end if timeFormatType == XUiHelper.TimeFormatType.MAINBATTERY then if month >= 1 then return stringFormat("%d%s", month, STR_MONTH) end if weeks >= 1 then return stringFormat("%d%s", weeks, STR_WEEK) end if days >= 1 then return stringFormat("%d%s", days, STR_DAY) end if hours >= 1 then return stringFormat("%d%s", hours, STR_HOUR) end local notZeroMin = minutes > 0 and minutes or 1 return stringFormat("%d%s", notZeroMin, STR_MINUTE) end if timeFormatType == XUiHelper.TimeFormatType.ACTIVITY then local totalDays = mathFloor(second / D) if totalDays >= 1 then return stringFormat("%d%s", totalDays, STR_DAY) end if hours >= 1 then return stringFormat("%d%s", hours, STR_HOUR) end if minutes >= 1 then return stringFormat("%d%s", minutes, STR_MINUTE) end return stringFormat("%d%s", seconds, STR_SECOND) end if timeFormatType == XUiHelper.TimeFormatType.ACTIVITY_LINEBREAK then local totalDays = mathFloor(second / D) if totalDays >= 1 then return stringFormat("%d\n%s", totalDays, STR_DAY) end if hours >= 1 then return stringFormat("%d\n%s", hours, STR_HOUR) end if minutes >= 1 then return stringFormat("%d\n%s", minutes, STR_MINUTE) end return stringFormat("%d\n%s", seconds, STR_SECOND) end if timeFormatType == XUiHelper.TimeFormatType.TOWER then return stringFormat("%d%s%02d%s%02d%s", days, STR_DAY, hours, STR_HOUR, minutes, STR_MINUTE) end if timeFormatType == XUiHelper.TimeFormatType.TOWER_RANK then return stringFormat("%02d%s%02d%s", minutes, STR_MINUTE, seconds, STR_SECOND) end if timeFormatType == XUiHelper.TimeFormatType.DAILY_TASK then if minutes < 1 and seconds > 0 then minutes = 1 end return stringFormat("%02d%s%02d%s", hours, STR_HOUR, minutes, STR_MINUTE) end if timeFormatType == XUiHelper.TimeFormatType.CHALLENGE or timeFormatType == XUiHelper.TimeFormatType.HOSTEL then if month >= 1 then return stringFormat("%d%s", month, STR_MONTH) end if weeks >= 1 then return stringFormat("%d%s", weeks, STR_WEEK) end if days >= 1 then return stringFormat("%d%s%d%s", days, STR_DAY, hours, STR_HOUR) end return stringFormat("%02d:%02d:%02d", hours, minutes, seconds) end if timeFormatType == XUiHelper.TimeFormatType.DRAW then local sumDas = mathFloor(second / D) if sumDas >= 1 then return stringFormat("%d%s", sumDas, STR_DAY) end if hours >= 1 then return stringFormat("%d%s", hours, STR_HOUR) end if minutes >= 1 then return stringFormat("%d%s", minutes, STR_MINUTE) end return stringFormat("%02d:%02d:%02d", hours, minutes, seconds) end if timeFormatType == XUiHelper.TimeFormatType.GUILDCD then return stringFormat("%01d:%02d:%02d", hours, minutes, seconds) end if timeFormatType == XUiHelper.TimeFormatType.MAIN then return stringFormat("%02d:%02d", hours, minutes) end if timeFormatType == XUiHelper.TimeFormatType.PURCHASELB then if month >= 1 or weeks >= 1 then local sumDas = mathFloor(second / D) return stringFormat("%d%s", sumDas, STR_DAY) end if days >= 1 then return stringFormat("%d%s%d%s", days, STR_DAY, hours, STR_HOUR) end return stringFormat("%02d:%02d:%02d", hours, minutes, seconds) end if timeFormatType == XUiHelper.TimeFormatType.ONLINE_BOSS then local sumDas = mathFloor(second / D) if sumDas >= 1 then return stringFormat("%d%s", sumDas, STR_DAY) end if hours >= 1 then return stringFormat("%d%s", hours, STR_HOUR) end return stringFormat("%02d:%02d", minutes, seconds) end if timeFormatType == XUiHelper.TimeFormatType.HEADPORTRAIT then local sumDas = mathFloor(second / D) if sumDas >= 1 then return stringFormat("%d%s", sumDas, STR_DAY) end if hours >= 1 then return stringFormat("%d%s", hours, STR_HOUR) end if minutes < 1 and seconds > 0 then minutes = 1 end return stringFormat("%d%s", minutes, STR_MINUTE) end if timeFormatType == XUiHelper.TimeFormatType.CHATEMOJITIMER then local sumDas = mathFloor(second / D) if sumDas >= 1 then return stringFormat("%d%s", sumDas, STR_DAY) end if hours >= 1 then return stringFormat("%d%s", hours, STR_HOUR) end if minutes < 1 and seconds > 0 then return stringFormat("%d%s", seconds, STR_SECOND) end return stringFormat("%d%s", minutes, STR_MINUTE) end if timeFormatType == XUiHelper.TimeFormatType.NieRShow then local sumDas = mathFloor(second / D) if sumDas >= 1 then return stringFormat("%d%s", sumDas, "DAY") end if hours >= 1 then return stringFormat("%d%s", hours, "Hour") end if minutes < 1 and seconds > 0 then return stringFormat("%d%s", seconds, "Second") end return stringFormat("%d%s", minutes, "Minute") end if timeFormatType == XUiHelper.TimeFormatType.STRONGHOLD then local sumDas = mathFloor(second / D) if sumDas >= 1 then return stringFormat("%d%s%d%s", sumDas, STR_DAY, hours, STR_HOUR) end return stringFormat("%02d:%02d:%02d", hours, minutes, seconds) end if timeFormatType == XUiHelper.TimeFormatType.TO_A_MINUTE then if days >= 1 then return stringFormat("%d%s%d%s%d%s", days, STR_DAY, hours, STR_HOUR, minutes, STR_MINUTE) end if hours >= 1 then return stringFormat("%d%s%d%s", hours, STR_HOUR, minutes, STR_MINUTE) end if minutes < 1 and seconds > 0 then return stringFormat("<1%s", STR_MINUTE) end return stringFormat("%d%s", minutes, STR_MINUTE) end if timeFormatType == XUiHelper.TimeFormatType.MOE_WAR then local sumDas = mathFloor(second / D) if sumDas >= 1 then return stringFormat("%d%s", sumDas, STR_DAY) end if hours >= 1 then return stringFormat("%d%s", hours, STR_HOUR) end if minutes < 1 and seconds > 0 then minutes = 1 end return stringFormat("%d%s", minutes, STR_MINUTE) end if timeFormatType == XUiHelper.TimeFormatType.KillZone then local sumDas = mathFloor(second / D) if sumDas >= 1 then return stringFormat("%d%s", sumDas, STR_DAY) end if hours >= 1 then return stringFormat("%d%s", hours, STR_HOUR) end return stringFormat("%d%s", minutes, STR_MINUTE) end if timeFormatType == XUiHelper.TimeFormatType.RPG_MAKER_GAME then local sumDas = mathCeil(second / D) if sumDas >= 1 then return stringFormat("%d%s", sumDas, STR_DAY) end return stringFormat("%d%s", 0, STR_DAY) end if timeFormatType == XUiHelper.TimeFormatType.PASSPORT then if days >= 1 then return stringFormat("%d%s%02d:%02d", days, STR_DAY, hours, minutes) end if minutes < 1 and seconds > 0 then minutes = 1 end return stringFormat("%02d:%02d", hours, minutes) end end function XUiHelper.GetTimeNumber(second) local month = mathFloor(second / M) local weeks = mathFloor((second % M) / W) local days = mathFloor((second % W) / D) local hours = mathFloor((second % D) / H) local minutes = mathFloor((second % H) / S) local seconds = mathFloor(second % S) return month, weeks, days, hours, minutes, seconds end function XUiHelper.GetTimeOfDelay(time, delayTime, delayType)--获取延时后的时间戳 if delayType == XUiHelper.DelayType.Second then return time + delayTime elseif delayType == XUiHelper.DelayType.Minute then return time + delayTime * S elseif delayType == XUiHelper.DelayType.Hour then return time + delayTime * H elseif delayType == XUiHelper.DelayType.Day then return time + delayTime * D end return time + delayTime end --背包限时道具时间样式 function XUiHelper.GetBagTimeLimitTimeStrAndBg(second) local timeStr, bgPath local weeks = mathFloor(second / W) local days = mathFloor((second % W) / D) local hours = mathFloor((second % D) / H) local minutes = mathFloor((second % H) / S) if weeks >= 1 then timeStr = stringFormat("%d%s", weeks, STR_WEEK) bgPath = XUiHelper.TagBgPath.Green elseif days >= 1 then timeStr = stringFormat("%d%s", days, STR_DAY) bgPath = XUiHelper.TagBgPath.Yellow elseif hours >= 1 then timeStr = stringFormat("%d%s", hours, STR_HOUR) bgPath = XUiHelper.TagBgPath.Red else local notZeroMin = minutes > 0 and minutes or 1 timeStr = stringFormat("%d%s", notZeroMin, STR_MINUTE) bgPath = XUiHelper.TagBgPath.Red end return timeStr, bgPath end -- length为可选参数,为要显示的长度,例如3601,1为1小时,3601,2为1小时1秒, function XUiHelper.GetTimeDesc(second, length) local minute = 60 local hour = 3600 local day = 3600 * 24 if second <= 0 then return CSTextManagerGetText("IsExpire") end if not length then length = 1 end local desc = "" while length > 0 do if second == 0 then return desc end if second < minute then local s = mathFloor(second) desc = desc .. s .. CSTextManagerGetText("Second") second = 0 else if second < hour then local m = mathFloor(second / minute) desc = desc .. m .. CSTextManagerGetText("Minute") second = second - m * minute else if second < day then local h = mathFloor(second / hour) desc = desc .. h .. CSTextManagerGetText("Hour") second = second - h * hour else local d = mathFloor(second / day) desc = desc .. d .. CSTextManagerGetText("Day") second = second - d * day end end end length = length - 1 if length > 0 then desc = desc .. " " end end return desc end --返回X时间开启,或X时间结束,或已结束 function XUiHelper.GetInTimeDesc(startTime, endTime) local nowTime = XTime.GetServerNowTimestamp() local timeStr if startTime and nowTime < startTime then timeStr = XUiHelper.GetTime(startTime - nowTime, XUiHelper.TimeFormatType.ACTIVITY) return CSTextManagerGetText("StartInTime", timeStr) end if endTime and nowTime < endTime then timeStr = XUiHelper.GetTime(endTime - nowTime, XUiHelper.TimeFormatType.ACTIVITY) return CSTextManagerGetText("EndInTime", timeStr) end return CSTextManagerGetText("TimeUp") end --==============================-- --desc: 获取最后登录时间描述 --@time: 登录时间 --@return 最后登录时间对应描述 --==============================-- function XUiHelper.CalcLatelyLoginTime(time, nowTime) nowTime = nowTime or XTime.GetServerNowTimestamp() local minute = mathFloor((nowTime - time) / 60) local hourCount = mathFloor(minute / 60) local dayCount = mathFloor(hourCount / 24) local monthCount = mathFloor(dayCount / 30) if monthCount >= 1 then return monthCount .. CSTextManagerGetText("ToolMonthBefore") elseif dayCount >= 1 then return dayCount .. CSTextManagerGetText("ToolDayBrfore") elseif hourCount >= 1 then return hourCount .. CSTextManagerGetText("ToolHourBefore") else return minute .. CSTextManagerGetText("ToolMinuteBefore") end end --==============================-- --desc: 获取最后登录时间描述 --@time: 登录时间 --@defaultDay: 默认显示的天数 --@return 最后登录时间对应描述 --==============================-- function XUiHelper.CalcLatelyLoginTimeWithDefault(time, defaultDay) local minute = mathFloor((XTime.GetServerNowTimestamp() - time) / 60) local hourCount = mathFloor(minute / 60) local dayCount = mathFloor(hourCount / 24) if dayCount >= 1 then if defaultDay and defaultDay < dayCount then return defaultDay .. CSTextManagerGetText("ToolDayBrfore") else return dayCount .. CSTextManagerGetText("ToolDayBrfore") end elseif hourCount >= 1 then return hourCount .. CSTextManagerGetText("ToolHourBefore") else return minute .. CSTextManagerGetText("ToolMinuteBefore") end end function XUiHelper.GetRemindTime(time, now) now = now or XTime.GetServerNowTimestamp() local remindTime = time - now if remindTime > 86400 then local day = mathFloor(remindTime / 86400) + 1 return day .. CSTextManagerGetText("Day") else local h = mathFloor(remindTime / 3600) local m = mathFloor((remindTime - h * 3600) / 60) local s = mathFloor(remindTime % 60) return stringFormat("%02d:%02d:%02d", h, m, s) end end ------------时间相关end------------ --==============================-- --desc: Hex Color 转成 color --@hexColor: 如:B7C4FFFF或B7C4FF --@return: color(r, g, b, a)或color(r, g, b) --==============================-- function XUiHelper.Hexcolor2Color(hexColor) local str str = stringSub(hexColor, 1, 2) local r = tonumber(str, 16) / 255 str = stringSub(hexColor, 3, 4) local g = tonumber(str, 16) / 255 str = stringSub(hexColor, 5, 6) local b = tonumber(str, 16) / 255 str = stringSub(hexColor, 7, 8) local a = string.IsNilOrEmpty(str) and 1 or tonumber(str, 16) / 255 return CS.UnityEngine.Color(r, g, b, a) end -------------------------------------- -- 将RGB Color(100, 100, 255) 转换成16进制颜色代码 #6464ff -------------------------------------- function XUiHelper.Color2Hex(color) return string.format("#%.2x%.2x%.2x", color.r, color.g, color.b) end ------------动画相关begin------------ --==============================-- --desc: 打字机动画 --@txtobj: 文本对象 --@str: 打印的字符串 --@interval: 时间间隔 --@finishcallback: 结束回调 --@return 定时器对象 --==============================-- function XUiHelper.ShowCharByTypeAnimation(txtobj, str, interval, callback, finishcallback) local chartab = string.CharsConvertToCharTab(str) local index = 1 local timer txtobj.text = "" timer = XScheduleManager.ScheduleForever(function() if index > #chartab then XScheduleManager.UnSchedule(timer) if finishcallback then finishcallback() end else local char = chartab[index] if callback then callback(char) else txtobj.text = txtobj.text .. char end index = index + 1 end end, interval) return timer end -- 如果是子Ui,得先定义Parent才能获取到UiAnimation组件。 --弃用 function XUiHelper.PlayAnimation(ui, name, onStart, onEnd) if onStart then onStart() end if ui.GetType and ui:GetType():ToString() == "UnityEngine.GameObject" then ui:PlayLegacyAnimation(name, onEnd) else ui.GameObject:PlayLegacyAnimation(name, onEnd) end end function XUiHelper.StopAnimation() end function XUiHelper.PlayCallback(onStart, onFinish) return CS.XUiAnimationManager.PlayCallback(onStart, onFinish) end --==============================-- --desc: 默认不会插入到全局播放列表。 --@duration: 动画时长 --@onRefresh: 刷新动作,返回值不为空或true时中断tween --@onFinish: 结束回调 --@easeMethod: 自定义曲线函数 --@return 定时器 --==============================-- function XUiHelper.Tween(duration, onRefresh, onFinish, easeMethod) local startTicks = CS.XTimerManager.Ticks local refresh = function(timer) local t = (CS.XTimerManager.Ticks - startTicks) / duration / CS.System.TimeSpan.TicksPerSecond t = mathMin(1, t) t = mathMax(0, t) if easeMethod then t = easeMethod(t) end if onRefresh then local stop = onRefresh(t) or t == 1 if stop then XScheduleManager.UnSchedule(timer) if onFinish then onFinish() end return end end end return XScheduleManager.ScheduleForever(refresh, 0) end XUiHelper.EaseType = { Linear = 1, Sin = 2, Increase = 3, --由慢到快 } function XUiHelper.Evaluate(easeType, t) if easeType == XUiHelper.EaseType.Linear then return t elseif easeType == XUiHelper.EaseType.Sin then return math.sin(t * math.pi / 2) elseif easeType == XUiHelper.EaseType.Increase then t = t * t t = mathMin(1, t) t = mathMax(0, t) return t end end function XUiHelper.DoUiMove(rectTf, tarPos, duration, easeType, cb) local startPos = rectTf.anchoredPosition3D easeType = easeType or XUiHelper.EaseType.Linear local timer = XUiHelper.Tween(duration, function(t) if not rectTf:Exist() then return true end rectTf.anchoredPosition3D = Vec3Lerp(startPos, tarPos, t) end, cb, function(t) return XUiHelper.Evaluate(easeType, t) end) return timer end function XUiHelper.DoMove(rectTf, tarPos, duration, easeType, cb) local startPos = rectTf.localPosition easeType = easeType or XUiHelper.EaseType.Linear local timer = XUiHelper.Tween(duration, function(t) if not rectTf:Exist() then return true end rectTf.localPosition = Vec3Lerp(startPos, tarPos, t) end, cb, function(t) return XUiHelper.Evaluate(easeType, t) end) return timer end function XUiHelper.DoWorldMove(rectTf, tarPos, duration, easeType, cb) local startPos = rectTf.position easeType = easeType or XUiHelper.EaseType.Linear local timer = XUiHelper.Tween(duration, function(t) if not rectTf:Exist() then return true end rectTf.position = Vec3Lerp(startPos, tarPos, t) end, cb, function(t) return XUiHelper.Evaluate(easeType, t) end) return timer end function XUiHelper.DoScale(rectTf, startScale, tarScale, duration, easeType, cb) easeType = easeType or XUiHelper.EaseType.Linear local timer = XUiHelper.Tween(duration, function(t) if not rectTf:Exist() then return true end rectTf.localScale = Vec3Lerp(startScale, tarScale, t) end, cb, function(t) return XUiHelper.Evaluate(easeType, t) end) return timer end function XUiHelper.DoAlpha(canvasGroup, startAlpha, tarAlpha, duration, easeType, cb) easeType = easeType or XUiHelper.EaseType.Linear local timer = XUiHelper.Tween(duration, function(t) if not canvasGroup:Exist() then return true end canvasGroup.alpha = MathLerp(startAlpha, tarAlpha, t) end, cb, function(t) return XUiHelper.Evaluate(easeType, t) end) return timer end ------------动画相关end------------ --==============================-- --desc: 计算文本所占宽 --@textObj: 文本对象 --@return 所占宽度 --==============================-- function XUiHelper.CalcTextWidth(textObj) local tg = textObj.cachedTextGeneratorForLayout local set = textObj:GetGenerationSettings(CS.UnityEngine.Vector2.zero) local text = textObj.text return mathCeil(tg:GetPreferredWidth(text, set) / textObj.pixelsPerUnit) end ------------首次获得弹窗Begin------------ local FirstGetIdWaitToShowList = {} local DELAY_POPUP_UI = false local PopSortFunc = function(a, b) --角色 > 装备 if a.Type ~= b.Type then return a.Type == XArrangeConfigs.Types.Weapon end if a.Type == XArrangeConfigs.Types.Character then local aCharacter = XDataCenter.CharacterManager.GetCharacter(a.Id) local bCharacter = XDataCenter.CharacterManager.GetCharacter(b.Id) if aCharacter and bCharacter then --品质 if aCharacter.Quality ~= bCharacter.Quality then return aCharacter.Quality > bCharacter.Quality end --优先级 local priorityA = XCharacterConfigs.GetCharacterPriority(a.Id) local priorityB = XCharacterConfigs.GetCharacterPriority(b.Id) if priorityA ~= priorityB then return priorityA < priorityB end end end if a.Type == XArrangeConfigs.Types.Weapon then --品质 local aQuality = XDataCenter.EquipManager.GetEquipQuality(a.Id) local bQuality = XDataCenter.EquipManager.GetEquipQuality(b.Id) if aQuality ~= bQuality then return aQuality > bQuality end --优先级 local priorityA = XDataCenter.EquipManager.GetEquipPriority(a.Id) local priorityB = XDataCenter.EquipManager.GetEquipPriority(b.Id) if priorityA ~= priorityB then return priorityA < priorityB end end end function XUiHelper.PushInFirstGetIdList(id, type) local beginPopUi = not next(FirstGetIdWaitToShowList) local data = { Id = id, Type = type } tableInsert(FirstGetIdWaitToShowList, data) tableSort(FirstGetIdWaitToShowList, PopSortFunc) if beginPopUi and not DELAY_POPUP_UI and not XLuaUiManager.IsUiShow("UiFirstGetPopUp") then XLuaUiManager.Open("UiFirstGetPopUp", FirstGetIdWaitToShowList) end end function XUiHelper.SetDelayPopupFirstGet(isDelay) DELAY_POPUP_UI = isDelay end function XUiHelper.PopupFirstGet() if next(FirstGetIdWaitToShowList) then XLuaUiManager.Open("UiFirstGetPopUp", FirstGetIdWaitToShowList) end end ------------首次获得弹窗End------------ function XUiHelper.RegisterClickEvent(table, component, handle, clear) clear = clear and true or true local func = function(...) if handle then handle(table, ...) end end CsXUiHelper.RegisterClickEvent(component, func, clear) end function XUiHelper.RegisterSliderChangeEvent(table, component, handle, clear) clear = clear and true or true local func = function(...) if handle then handle(table, ...) end end CsXUiHelper.RegisterSliderChangeEvent(component, func, clear) end function XUiHelper.GetToggleVal(val) if val == XUiToggleState.Off then return false elseif val == XUiToggleState.On then return true end end function XUiHelper.ReplaceWithPlayerName(str, replaceStr) if not str or not replaceStr then return str end if not stringFind(str, replaceStr) then return str end local playerName = XPlayer.Name if not playerName then return str end local tmpPlayerName = stringGsub(playerName, "%%", "$") str = stringGsub(str, replaceStr, tmpPlayerName) str = stringGsub(str, "%$", "%%") return str end --把大数字按照一定的规范转换成字符串 --规范:小于6位不转换,大于等于6位转换为w并保留小数点后2位 --比如 600000 返回 60w function XUiHelper.GetLargeIntNumText(num) local t = type(num) if t == "number" then if num >= 100000 then local bigNum = num / 1000 if math.floor(bigNum) < bigNum then return CS.XTextManager.GetText("ShowLargeIntNumText", string.format("%.2f", bigNum))-- 日服W转换为万(日本人能看懂万字) else return CS.XTextManager.GetText("ShowLargeIntNumText", string.format("%d", bigNum)) end else return tostring(num) end end end --富文本字符串转普通文本 ---@param: 山穷水绝处回眸一遍你 ---@return: 山穷水绝处回眸一遍你 function XUiHelper.RichTextToTextString(str) if not str then return "" end return stringGsub(str, "%b<>", "") end --字符串换行符可用化 function XUiHelper.ConvertLineBreakSymbol(str) if not str then return "" end return stringGsub(str, "\\n", "\n") end --读取Text配置并保留换行符 function XUiHelper.ReadTextWithNewLine(text, ...) return stringGsub(CSTextManagerGetText(text, ...), "\\n", "\n") end -- 获取屏幕点击位置到指定transform的位置 function XUiHelper.GetScreenClickPosition(transform, camera) local screenPoint local platform = CS.UnityEngine.Application.platform if platform == CS.UnityEngine.RuntimePlatform.WindowsEditor or platform == CS.UnityEngine.RuntimePlatform.WindowsPlayer then screenPoint = CS.UnityEngine.Vector2(CS.UnityEngine.Input.mousePosition.x, CS.UnityEngine.Input.mousePosition.y) else screenPoint = CS.UnityEngine.Input.GetTouch(0).position end local hasValue, v2 = CS.UnityEngine.RectTransformUtility.ScreenPointToLocalPointInRectangle(transform, screenPoint, camera) if hasValue then return CS.UnityEngine.Vector3(v2.x, v2.y, 0) else return CS.UnityEngine.Vector3.zero end end function XUiHelper.GetText(key, ...) return CS.XTextManager.GetText(key, ...) end function XUiHelper.GetClientConfig(key, configType) if configType == XUiHelper.ClientConfigType.String then return CS.XGame.ClientConfig:GetString(key) elseif configType == XUiHelper.ClientConfigType.Int then return CS.XGame.ClientConfig:GetInt(key) elseif configType == XUiHelper.ClientConfigType.Float then return CS.XGame.ClientConfig:GetFloat(key) elseif configType == XUiHelper.ClientConfigType.Bool then return CS.XGame.ClientConfig:GetBool(key) else return nil end end --背包道具时间(日服) function XUiHelper.GetBagTimeStrAndBg(second) local timeStr local days = mathFloor(second / D) local hours = mathFloor(second / H) local minutes = mathFloor((second - hours * H) / S) if days >= 1 then timeStr = stringFormat("%d%s", days, STR_DAY) else local notZeroMin = minutes > 0 and minutes or 1 timeStr = stringFormat("%d:%d", hours, notZeroMin) end return timeStr end function XUiHelper.TextHasBubble(textComponent, textContent) if not textComponent then XLog.Error("The Function \"TextHasBubble\" Param Must Not Be Nil") return end if not textContent then XLog.Warning("The Function \"TextHasBubble\" Param (textContent) is Nil, Maybe Cause Problem") end textComponent:SetTextEllipsis(textContent) -- 扩展方法,显示不全用省略号表示 local textPointHandler = textComponent.gameObject:GetComponent(typeof(CS.XTextPointHandler)) if XTool.UObjIsNil(textPointHandler) then textPointHandler = textComponent.gameObject:AddComponent(typeof(CS.XTextPointHandler)) end textPointHandler:AddTouchBeganListener(function() if XLuaUiManager.IsUiShow("UiBubbleTip") then return end local touchData = nil if CS.UnityEngine.Input.touchCount > 1 then XLog.Debug("BubbleTip:TouchCount is "..CS.UnityEngine.Input.TouchCount) touchData = CS.UnityEngine.Input.GetTouch(0) elseif CS.UnityEngine.Input:GetMouseButtonDown(0) then touchData = {position = CS.UnityEngine.Vector2(CS.UnityEngine.Input.mousePosition.x, CS.UnityEngine.Input.mousePosition.y)} end if not touchData then return end XLuaUiManager.Open("UiBubbleTip", touchData, textContent or textComponent.text) end) textPointHandler:AddTouchEndListener(function() if XLuaUiManager.IsUiShow("UiBubbleTip") then XLuaUiManager.Close("UiBubbleTip") end end) textPointHandler:AddTouchCancelListener(function() if XLuaUiManager.IsUiShow("UiBubbleTip") then XLuaUiManager.Close("UiBubbleTip") end end) end function XUiHelper.TextHasBubble(textComponent, textContent) if not textComponent then XLog.Error("The Function \"TextHasBubble\" Param Must Not Be Nil") return end if not textContent then XLog.Warning("The Function \"TextHasBubble\" Param (textContent) is Nil, Maybe Cause Problem") end textComponent:SetTextEllipsis(textContent) -- 扩展方法,显示不全用省略号表示 local textPointHandler = textComponent.gameObject:GetComponent(typeof(CS.XTextPointHandler)) if XTool.UObjIsNil(textPointHandler) then textPointHandler = textComponent.gameObject:AddComponent(typeof(CS.XTextPointHandler)) end textPointHandler:AddTouchBeganListener(function() if XLuaUiManager.IsUiShow("UiBubbleTip") then return end local touchData = nil if CS.UnityEngine.Input.touchCount > 1 then touchData = CS.UnityEngine.Input.GetTouch(0) elseif CS.UnityEngine.Input:GetMouseButtonDown(0) then touchData = {position = CS.UnityEngine.Vector2(CS.UnityEngine.Input.mousePosition.x, CS.UnityEngine.Input.mousePosition.y)} end if not touchData then return end XLuaUiManager.Open("UiBubbleTip", touchData, textContent or textComponent.text) end) textPointHandler:AddTouchEndListener(function() if XLuaUiManager.IsUiShow("UiBubbleTip") then XLuaUiManager.Close("UiBubbleTip") end end) textPointHandler:AddTouchCancelListener(function() if XLuaUiManager.IsUiShow("UiBubbleTip") then XLuaUiManager.Close("UiBubbleTip") end end) end function XUiHelper.GetText(key, ...) return CS.XTextManager.GetText(key, ...) end --============================== ---@desc text表中读到的\n会被Unity识别为\\n ---@content 转换内容 ---@return string --============================== function XUiHelper.ReplaceTextNewLine(content) return string.gsub(content, "\\n", "\n") end