-- require 'CLLFunctions' --- lua工具方法 local table = table local smatch = string.match local sfind = string.find local pnlShade = nil function showHotWheel(...) if pnlShade == nil then pnlShade = CLPanelManager.getPanel("PanelHotWheel") end local paras = {...} if (#(paras) > 1) then local msg = paras[1] pnlShade:setData(msg) else pnlShade:setData("") end -- CLPanelManager.showPanel(pnlShade) pnlShade:show() end function hideHotWheel(...) if pnlShade == nil then pnlShade = CLPanelManager.getPanel("PanelHotWheel") end -- CLPanelManager.hidePanel(pnlShade) local func = pnlShade:getLuaFunction("hideSelf") if (func ~= nil) then func() end end function mapToColor(map) local color = Color.white if (map == nil) then return color end color = Color( MapEx.getNumber(map, "r"), MapEx.getNumber(map, "g"), MapEx.getNumber(map, "b"), MapEx.getNumber(map, "a") ) return color end function mapToVector2(map) local v = Vector2.zero if (map == nil) then return v end v = Vector2(MapEx.getNumber(map, "x"), MapEx.getNumber(map, "y")) return v end function mapToVector3(map) local v = Vector3.zero if (map == nil) then return v end v = Vector3(MapEx.getNumber(map, "x"), MapEx.getNumber(map, "y"), MapEx.getNumber(map, "z")) return v end function mapToVector4(map) local v = Vector4.zero if (map == nil) then return v end v = Vector4( MapEx.getNumber(map, "x"), MapEx.getNumber(map, "y"), MapEx.getNumber(map, "z"), MapEx.getNumber(map, "w") ) return v end ---@return UnityEngine.Transform function getChild(root, ...) local args = {...} local path = "" if (#args > 1) then local str = PStr.b() for i, v in ipairs(args) do str:a(v):a("/") end path = str:e() else path = args[1] end return root:Find(path) end --获取路径 function stripfilename(filename) return smatch(filename, "(.+)/[^/]*%.%w+$") --*nix system --return smatch(filename, “(.+)\\[^\\]*%.%w+$”) — windows end --获取文件名 function strippath(filename) return smatch(filename, ".+/([^/]*%.%w+)$") -- *nix system --return smatch(filename, “.+\\([^\\]*%.%w+)$”) — *nix system end --去除扩展名 function stripextension(filename) local idx = filename:match(".+()%.%w+$") if (idx) then return filename:sub(1, idx - 1) else return filename end end --获取扩展名 function getextension(filename) return filename:match(".+%.(%w+)$") end function trim(s) -- return (s:gsub("^%s*(.-)%s*$", "%1")) return smatch(s, "^()%s*$") and "" or smatch(s, "^%s*(.*%S)") -- 性能略优 end function startswith(str, substr) if str == nil or substr == nil then return nil, "the string or the sub-stirng parameter is nil" end if sfind(str, substr) ~= 1 then return false else return true end end function getAction(act) local actionValue = 0 if (act == "idel") then --, //0 空闲 return 0 elseif (act == "idel2") then --, //1 空闲 actionValue = 1 elseif (act == "walk") then --, //2 走 actionValue = 2 elseif (act == "run") then --, //3 跑 actionValue = 3 elseif (act == "jump") then --, //4 跳 actionValue = 4 elseif (act == "slide") then --, //5 滑行,滚动,闪避 actionValue = 5 elseif (act == "drop") then --, //6 下落 actionValue = 6 elseif (act == "attack") then --, //7 攻击 actionValue = 7 elseif (act == "attack2") then --, //8 攻击2 actionValue = 8 elseif (act == "skill") then --, //9 技能 actionValue = 9 elseif (act == "skill2") then --, //10 技能2 actionValue = 10 elseif (act == "skill3") then --, //11 技能3 actionValue = 11 elseif (act == "skill4") then --, //12 技能4 actionValue = 12 elseif (act == "hit") then --, //13 受击 actionValue = 13 elseif (act == "dead") then --, //14 死亡 actionValue = 14 elseif (act == "happy") then --, //15 高兴 actionValue = 15 elseif (act == "sad") then --, //16 悲伤 actionValue = 16 elseif (act == "up") then --, //17 起立 actionValue = 17 elseif (act == "down") then --, //18 倒下 actionValue = 18 elseif (act == "biggestAK") then --, //19 最大的大招 actionValue = 19 elseif (act == "dizzy") then --, //20 晕 actionValue = 20 elseif (act == "stiff") then --, //21 僵硬 actionValue = 21 elseif (act == "idel3") then --, //21 空闲 actionValue = 22 else actionValue = 0 end return actionValue end -- 动作回调toMap function ActCBtoList(...) local paras = {...} if (#(paras) > 0) then local callbackInfor = ArrayList() for i, v in ipairs(paras) do callbackInfor:Add(v) end return callbackInfor end return nil end function strSplit(inputstr, sep) if sep == nil then sep = "%s" end local t = {} local i = 1 for str in string.gmatch(inputstr, "([^" .. sep .. "]+)") do t[i] = str i = i + 1 end return t end -- 取得方法体 function getLuaFunc(trace) if (trace == nil) then return nil end local list = strSplit(trace, ".") local func = nil if (list ~= nil) then func = _G for i, v in ipairs(list) do func = func[v] end end return func end ---@param p coolape.Coolape.CLPanelLua function doShowPanel(p, paras) p:setData(paras) CLPanelManager.showPanel(p) if NetProto then NetProto.addPanelListener(p) end end ---@param p coolape.Coolape.CLPanelLua function doHidePanel(p) CLPanelManager.hidePanel(p) if NetProto then NetProto.removePanelListener(p) end end ---@param p coolape.Coolape.CLPanelLua function onLoadedPanel(p, paras) if CLPanelManager.topPanel then if NetProto then NetProto.removePanelListener(CLPanelManager.topPanel) end end p:setData(paras) CLPanelManager.showTopPanel(p) if NetProto then NetProto.addPanelListener(p) end end ---@param p coolape.Coolape.CLPanelLua function onLoadedPanelTT(p, paras) p:setData(paras) CLPanelManager.showTopPanel(p, true, true) if NetProto then NetProto.addPanelListener(p) end end ---@param p coolape.Coolape.CLPanelLua function onLoadedPanelTF(p, paras) p:setData(paras) CLPanelManager.showTopPanel(p, true, false) if NetProto then NetProto.addPanelListener(p) end end function hideTopPanel(p) local p = p or CLPanelManager.topPanel CLPanelManager.hideTopPanel(p) if NetProto then NetProto.removePanelListener(p) end end function SetActive(go, isActive) if (go == nil) then return end NGUITools.SetActive(go, isActive) end function getCC(transform, path, com) if not transform then return end local tf = getChild(transform, path) if not tf then return end return tf:GetComponent(com) end function isNilOrEmpty(s) if s == nil or s == "" then return true end return false end -- function joinStr(...) -- local paras = {...} -- if paras == nil or #paras == 0 then -- return "" -- end -- return table.concat(paras) -- end ---@public 拼接字符串 function joinStr(...) -- local paras = {...} local tb = {} local v for i = 1, select("#", ...) do v = select(i, ...) if v then table.insert(tb, tostring(v)) end end return table.concat(tb) end ---@public 保留小数位位数 function getPreciseDecimal(nNum, n) if type(nNum) ~= "number" then return nNum end n = n or 0 n = math.floor(n) if n < 0 then n = 0 end local nDecimal = 10 ^ n local nTemp = math.floor(nNum * nDecimal) local nRet = nTemp / nDecimal return nRet end ---@public 截取指定长度字符,注意:英文个数为E,汉字或韩文或其他个数为C,E*1 + C*2 <= 14 function cutStr_utf8(str, max) if not max then max = 14 end local name_len = 0 local start_index = 1 local name_substr = str local isSub = false while true do local char = string.sub(str, start_index, start_index) if char and start_index <= string.len(str) then local c = string.byte(char) local len = 1 if 0 <= c and c <= 127 then len = 1 elseif 192 <= c and c <= 223 then len = 2 elseif 224 <= c and c <= 239 then len = 3 elseif 240 <= c and c <= 247 then len = 4 elseif 248 <= c and c <= 251 then len = 5 elseif 252 <= c and c <= 253 then len = 6 else --print(c,'error'); end if len == 1 then --英文按照一个字节来算,其他的都按两字节算 name_len = name_len + 1 else name_len = name_len + 2 end --"abc123中国人??"; --local unicode = kkf_get_substring_unicode(str,start_index,len); --local tp = kkf_unicode_type(unicode); --print(string.format("%0x",unicode),len,tp); if name_len > max then name_substr = string.sub(str, 1, start_index - 1) isSub = true break end start_index = start_index + len else break end end return name_substr, isSub end ---@public 离线处理 function procOffLine() if MyCfg.mode == GameMode.none or IDUtl.isLoadingScene then return end -- CLAlert.add(LGet("MsgOffline"), Color.white, 1) printe(LGet("MsgOffline")) InvokeEx.cancelInvoke() -- 放在前面,后面马上就要用到invoke local ok, result = pcall(doReleaseAllRes) if not ok then printe(result) end local panel = CLPanelManager.getPanel(CLMainBase.self.firstPanel) CLPanelManager.showPanel(panel) -- 重新进入游戏 InvokeEx.invoke( function() pcall(releaseRes4GC, false) CLLMainLua.begain() end, 0.5 ) end function doReleaseAllRes() Time.timeScale = 1 SetActive(CLPanelManager.self.mask, false) if NetProtoIsland then NetProtoIsland.__sessionID = 0 end MyCfg.mode = GameMode.none if CLLNet then CLLNet.cancelHeart() CLLNet.stop() end -- if Net.self and Net.self.netGameDataQueue then -- Net.self.netGameDataQueue:Clear() -- end -- 页面处理 CLPanelManager.hideAllPanel() local panel = CLPanelManager.getPanel(CLMainBase.self.firstPanel) CLPanelManager.showPanel(panel) pcall( function() UIRichText4Chat.pool:clean() end ) if IDUtl then IDUtl.clean() end if IDMainCity then IDMainCity.clean() end if IDLBattle then IDLBattle.clean() end if IDWorldMap then IDWorldMap.clean() end hideHotWheel() end ---@public 重新启动前的处理 function doSomethingBeforeRestart() local ok, result = pcall(doReleaseAllRes) if not ok then printe(result) end -- Net.self:clean() ---@type Coolape.CLBaseLua local worldmap = getCC(MyMain.self.transform, "worldmap", "CLBaseLua") worldmap:destoryLua() if IDLCameraMgr then IDLCameraMgr.clean() end if IDMainCity then IDMainCity.destory() end if IDLBattle then IDLBattle.destory() end if IDWorldMap then IDWorldMap.destory() end -- 取消音效开关的回调 SoundEx.clean() end ---@public gc function releaseRes4GC(releaseRes) if releaseRes then CLUIInit.self.emptAtlas:releaseAllTexturesImm() CLAssetsManager.self:releaseAsset(true) Resources.UnloadUnusedAssets() end if not MyCfg.self.isUnityEditor then CS.UnityEngine.Scripting.GarbageCollector.GCMode = CS.UnityEngine.Scripting.GarbageCollector.Mode.Enabled MyMain.self:gc() GC.Collect() -- 内存释放 CS.UnityEngine.Scripting.GarbageCollector.GCMode = CS.UnityEngine.Scripting.GarbageCollector.Mode.Disabled end end function dump(obj) local getIndent, quoteStr, wrapKey, wrapVal, dumpObj getIndent = function(level) return string.rep("\t", level) end quoteStr = function(str) return '"' .. string.gsub(str, '"', '\\"') .. '"' end wrapKey = function(val) if type(val) == "number" then return "[" .. val .. "]" elseif type(val) == "string" then return "[" .. quoteStr(val) .. "]" else return "[" .. tostring(val) .. "]" end end wrapVal = function(val, level) if type(val) == "table" then return dumpObj(val, level) elseif type(val) == "number" then return val elseif type(val) == "string" then return quoteStr(val) else return tostring(val) end end dumpObj = function(obj, level) if type(obj) ~= "table" then return wrapVal(obj) end level = level + 1 local tokens = {} tokens[#tokens + 1] = "{" for k, v in pairs(obj) do tokens[#tokens + 1] = getIndent(level) .. wrapKey(k) .. " = " .. wrapVal(v, level) .. "," end tokens[#tokens + 1] = getIndent(level - 1) .. "}" return table.concat(tokens, "\n") end return dumpObj(obj, 0) end function fitIphoneX() local mode = SystemInfo.deviceModel printw(mode) if string.find(mode, "iPhone10,3") or string.find(mode, "iPhone10,6") or string.find(mode, "iPhone11,3") or string.find(mode, "iPhone11,6") or -- XS Max string.find(mode, "iPhone11,8") then -- xr NGUITools.isFringe = true end end --******************************************************************* --******************************************************************* local borrowedSpList = {} -- 当向atlas借一个sprite时 function onBorrowedSpriteCB(atlas, spData) --print(atlas.name, spData.path) local m = borrowedSpList[spData.name] m = m or {} m.atlas = m.atlas or {} m.atlas[atlas.name] = atlas.name if m.data == nil then m.data = {} m.data.name = spData.name m.data.path = spData.path m.data.x = spData.x m.data.y = spData.y m.data.width = spData.width m.data.height = spData.height m.data.borderLeft = spData.borderLeft m.data.borderRight = spData.borderRight m.data.borderTop = spData.borderTop m.data.borderBottom = spData.borderBottom m.data.paddingLeft = spData.paddingLeft m.data.paddingRight = spData.paddingRight m.data.paddingTop = spData.paddingTop m.data.paddingBottom = spData.paddingBottom end m.times = m.times or 0 m.times = m.times + 1 borrowedSpList[spData.name] = m end ---@public function onApplicationPauseCallback4CountAtlas() local jstr = json.encode(borrowedSpList) local path = joinStr(CLPathCfg.persistentDataPath, "/", CLPathCfg.self.basePath, "/xRes/spriteBorrow/spriteBorrowInfo.json") Directory.CreateDirectory(Path.GetDirectoryName(path)) File.WriteAllText(path, jstr) end --******************************************************************* --*******************************************************************