using UnityEngine; using LitJson; using System.Text.RegularExpressions; using System.Collections.Generic; using System; using System.IO; using System.Threading; using System.Diagnostics; using Debug = UnityEngine.Debug; using System.Linq; using System.Security.Cryptography; using System.Text; using UnityEngine.EventSystems; namespace ZXKFramework { public class UnityTools : MonoBehaviour { public static Sprite ToSprite(Texture2D self) { var rect = new Rect(0, 0, self.width, self.height); var pivot = Vector2.one * 0.5f; var newSprite = Sprite.Create(self, rect, pivot); return newSprite; } public static string GetJson(object self) { string loRes = JsonMapper.ToJson(self); return StringToUTF8(loRes); } public static string StringToUTF8(string self) { Regex reg = new Regex(@"(?i)\\[uU]([0-9a-f]{4})"); self = reg.Replace(self, delegate (Match m) { return ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString(); }); return self; } /// /// 存入字典更新位置角度 /// /// 存入的字典 /// 实例化出来的模型名称 /// 位置 /// 角度 /// public static void AddPosAndRotation(Dictionary> DicPosAndRotation, string key, Vector3 vectorPos, Vector3 vectorRotation, GameObject gameObj) { List listVec = new List(); listVec.Add(vectorPos); listVec.Add(vectorRotation); if (!DicPosAndRotation.ContainsKey(key)) { DicPosAndRotation.Add(key, listVec); } else { if (gameObj != null) { gameObj.transform.localPosition = DicPosAndRotation[key][0]; gameObj.transform.localEulerAngles = DicPosAndRotation[key][1]; } } } //复制目录文件到指定目录 public static void CopyDirIntoDestDirectory(string sourceFileName, string destFileName, bool overwrite) { if (!Directory.Exists(destFileName)) Directory.CreateDirectory(destFileName); foreach (var file in Directory.GetFiles(sourceFileName)) File.Copy(file, Path.Combine(destFileName, Path.GetFileName(file)), overwrite); foreach (var d in Directory.GetDirectories(sourceFileName)) CopyDirIntoDestDirectory(d, Path.Combine(destFileName, Path.GetFileName(d)), overwrite); } //创建文件夹 public static void CreateDirectory(string destFileName) { if (!Directory.Exists(destFileName)) Directory.CreateDirectory(destFileName); } //获取所有文件名字 public static List GetFile(string path, List FileList) { DirectoryInfo dir = new DirectoryInfo(path); FileInfo[] fil = dir.GetFiles(); DirectoryInfo[] dii = dir.GetDirectories(); foreach (FileInfo f in fil) { long size = f.Length; FileList.Add(Path.GetFileNameWithoutExtension(f.Name)); } foreach (DirectoryInfo d in dii) { GetFile(d.Name, FileList); } return FileList; } //获取指定路径下面的所有资源文件 然后进行删除 public static bool DeleteAllFile(string fullPath) { if (Directory.Exists(fullPath)) { DirectoryInfo direction = new DirectoryInfo(fullPath); FileInfo[] files = direction.GetFiles("*", SearchOption.AllDirectories); for (int i = 0; i < files.Length; i++) { string FilePath = fullPath + "/" + files[i].Name; File.Delete(FilePath); } return true; } return false; } //删除文件 public static void DeleteFile(string path) { if (File.Exists(path)) { File.Delete(path); } } //创建文件 public static void CreateFile(string path) { if (!File.Exists(path)) { File.Create(path); } } public static void OpenDirectory(string path) { if (string.IsNullOrEmpty(path)) return; path = path.Replace("/", "\\"); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } // 新开线程防止锁死 Thread newThread = new Thread(new ParameterizedThreadStart(CmdOpenDirectory)); newThread.Start(path); //可能360不信任 //System.Diagnostics.Process.Start("explorer.exe", path); } private static void CmdOpenDirectory(object obj) { Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.Arguments = "/c start " + obj.ToString(); Debug.Log(p.StartInfo.Arguments); p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start(); p.WaitForExit(); p.Close(); } public void FullSceneSet() { Screen.fullScreen = !Screen.fullScreen; if (Screen.fullScreen) Screen.SetResolution(1920, 1080, false); else Screen.SetResolution(1280, 720, false); } /// /// 获取一个随机打乱顺序的数组 /// /// 取出的数组里面要有多少个数 /// 随机数组的范围(最后的一个数) /// 随机数组的范围(第一个数) public static int[] GetRandomSequence(int rangNum, int endNum, int startNum = 0) { try { //随机总数组 int[] sequence = new int[endNum - startNum + 1]; //取到的不重复数字的数组长度 int[] output = new int[rangNum]; for (int i = startNum; i < endNum + 1; i++) { sequence[i - startNum] = i; } for (int i = 0; i < rangNum; i++) { //随机一个数,每随机一次,随机区间-1 int Num = UnityEngine.Random.Range(startNum, endNum + 1); output[i] = sequence[Num - startNum]; //将区间最后一个数赋值到取到数上 sequence[Num - startNum] = sequence[endNum - startNum]; endNum--; //执行一次效果如:1,2,3,4,5 取到2 //则下次随机区间变为1,5,3,4; } return output; } catch (Exception e) { Debug.LogError($"GetRandomSequence is Error:{e.ToString()}"); return null; } } /// /// 获取时间戳13位 /// public static string GetTimeStamp() { return DateTimeOffset.Now.ToUnixTimeSeconds() + "000"; } /// /// 两个时间戳相差多少秒 /// public static int TimeStampDiffSeconds(string t1, string t2) { return Mathf.Abs(Convert.ToInt32((ConvertToTime(t1) - ConvertToTime(t2)).TotalSeconds)); } /// /// 时间戳转换成标准时间 /// public static DateTime ConvertToTime(string timeStamp) { string ID = TimeZoneInfo.Local.Id; DateTime start = new DateTime(1970, 1, 1) + TimeZoneInfo.Local.GetUtcOffset(DateTime.Now); DateTime dtStart = TimeZoneInfo.ConvertTime(start, TimeZoneInfo.FindSystemTimeZoneById(ID)); long lTime = long.Parse(timeStamp + "0000"); TimeSpan toNow = new TimeSpan(lTime); DateTime time = dtStart.Add(toNow); return time; } /// /// JSON字符串格式化 /// public static string JsonTree(string json) { int level = 0; var jsonArr = json.ToArray(); // Using System.Linq; string jsonTree = string.Empty; for (int i = 0; i < json.Length; i++) { char c = jsonArr[i]; if (level > 0 && '\n' == jsonTree.ToArray()[jsonTree.Length - 1]) { jsonTree += TreeLevel(level); } switch (c) { case '[': jsonTree += c + "\n"; level++; break; case ',': jsonTree += c + "\n"; break; case ']': jsonTree += "\n"; level--; jsonTree += TreeLevel(level); jsonTree += c; break; default: jsonTree += c; break; } } return jsonTree; } /// /// 树等级 /// private static string TreeLevel(int level) { string leaf = string.Empty; for (int t = 0; t < level; t++) { leaf += "\t"; } return leaf; } /// /// 解析URL中的参数 /// public static string GetURLParameters(string url) { if (string.IsNullOrEmpty(url)) return null; var paramStr = url.Split('?')[1]; var paramList = paramStr.Split('&'); if (paramList == null || paramList.Count() <= 0) return null; return paramList.ToDictionary(e => Regex.Split(e, "=")[0], e => Regex.Split(e, "=")[1])["ticket"]; } /// /// MD5 32位 大写加密 /// public static string MD5Encrypt32Big(string encryptContent) { string content = encryptContent; //创建一个MD5CryptoServiceProvider对象的新实例。 MD5 md5 = MD5.Create(); //将输入的字符串转换为一个字节数组并计算哈希值。 byte[] data = md5.ComputeHash(Encoding.UTF8.GetBytes(content)); //创建一个StringBuilder对象,用来收集字节数组中的每一个字节,然后创建一个字符串。 StringBuilder sb = new StringBuilder(); //遍历字节数组,将每一个字节转换为十六进制字符串后,追加到StringBuilder实例的结尾 for (int i = 0; i < data.Length; i++) { sb.Append(data[i].ToString("X2")); } //返回一个十六进制字符串 content = sb.ToString(); if (content.Length < 32) Debug.LogError("32位 加密错误!!长度不对"); return content; } public static string RemoveDoubleQuotationMarks(string str) { char[] temp = str.ToCharArray(); string result = string.Empty; for (int i = 0; i < temp.Length; i++) { if (temp[i] != '"') { result += temp[i]; } } return result.Trim(); } //遍历地址中所有文件 public static void GetAllFile(string path, Action callBack) { if (Directory.Exists(path)) { DirectoryInfo direction = new DirectoryInfo(path); FileInfo[] files = direction.GetFiles("*", SearchOption.AllDirectories); for (int i = 0; i < files.Length; i++) { UnityEngine.Debug.Log("-----" + files[i].Name); callBack(files[i]); } //DirectoryInfo TheFolder = new DirectoryInfo(path); ////遍历文件 //foreach (FileInfo NextFile in TheFolder.GetFiles()) //{ //} ////遍历文件夹 //foreach (DirectoryInfo NextFolder in TheFolder.GetDirectories()) //{ //} } } //判断文件夹中是否存在文件 public static bool HasFile(string path, string data) { if (Directory.Exists(path)) { DirectoryInfo TheFolder = new DirectoryInfo(path); //遍历文件 foreach (FileInfo NextFile in TheFolder.GetFiles()) { if (NextFile.Name.ToLower() == data) { return true; } } } return false; } //遍历文件夹 public static void FindMenu(string path, Action callBack) { if (Directory.Exists(path)) { DirectoryInfo TheFolder = new DirectoryInfo(path); foreach (DirectoryInfo NextFolder in TheFolder.GetDirectories()) { callBack?.Invoke(NextFolder); } } } private static string mbasePath = ""; /// /// 所有的资源按照100个一个文件夹分组 /// private static int index = 0; public static void AssetFenZu(string path) { if (Directory.Exists(path)) { index = 0; string dic = path + "/" + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss-fff"); if (!Directory.Exists(dic)) { Directory.CreateDirectory(dic); } DirectoryInfo TheFolder = new DirectoryInfo(path); //遍历文件夹,得到所有文件 foreach (FileInfo NextFolder in TheFolder.GetFiles()) { if (index == 100) { dic = path + "/" + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss-fff"); if (!Directory.Exists(dic)) { Directory.CreateDirectory(dic); } index = 0; } else { WDebug.Log(dic + "/" + NextFolder.Name); NextFolder.MoveTo(dic + "/" + NextFolder.Name); index++; } } } } //移动所有文件到一个文件夹下 public static void MoveAllFileToDic(string path) { mbasePath = path; MoveAllFileToDicFunc(path); } static void MoveAllFileToDicFunc(string path) { if (Directory.Exists(path)) { DirectoryInfo TheFolder = new DirectoryInfo(path); //遍历文件夹 foreach (DirectoryInfo NextFolder in TheFolder.GetDirectories()) { MoveAllFileToDicFunc(NextFolder.FullName); } foreach (FileInfo NextFile in TheFolder.GetFiles()) { string temp = mbasePath + @"\" + NextFile.Name; if (Path.GetDirectoryName(NextFile.FullName) != mbasePath) { try { //NextFile.MoveTo(ChangeName(temp)); } catch (Exception) { WDebug.LogError("无法移动 : " + temp); } } else { Debug.Log("根目录下文件不移动" + NextFile.Name); } } } } //新建文件夹,移动文件 public static void CreateDicMoveFile(string path) { int count = 0; DirectoryInfo TheFolder = new DirectoryInfo(path); //遍历文件 foreach (FileInfo NextFile in TheFolder.GetFiles()) { count++; } if (count == 0) return; string res = "文件夹" + path + "下有:" + count + "文件想新建文件夹并且移动,是否继续!"; foreach (FileInfo NextFile in TheFolder.GetFiles()) { string tempDic = Path.GetDirectoryName(NextFile.FullName) + @"\" + Path.GetFileNameWithoutExtension(NextFile.FullName); try { if (!Directory.Exists(tempDic)) { Directory.CreateDirectory(tempDic); } //NextFile.MoveTo(ChangeName(tempDic + @"\" + NextFile.Name)); } catch (Exception) { Debug.Log(tempDic); } } } //去掉所有特殊字符,得到字符串 public static string ziFu = "[]【】 .()n"; public static string GetNoTeShu(string data) { bool lobo = true; string result = ""; char[] allZifu = ziFu.ToCharArray(); foreach (char res in data.ToCharArray()) { lobo = true; foreach (var item in allZifu) { if (res == item) { lobo = false; break; } } if (lobo) { result += res; } } return result; } //英文星期转化为中文星期 static string[] weekdaysCn = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }; public static string WeekToCn(int data) { if (data >= 0 && data <= 6) { return weekdaysCn[data]; } else { Debug.LogError("DF_NowTime_V01 WeekToCn 转换为中文星期,内容" + data + "不符合规范"); return ""; } } public static string GetTimeCn() { DateTime NowTime = DateTime.Now.ToLocalTime(); int lodata = Int32.Parse(DateTime.Now.DayOfWeek.ToString(("d"))); return NowTime.ToString("yyyy 年 MM 月 dd 日 HH: mm:ss ") + WeekToCn(lodata); } static string[] weekdaysEn = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; public static string WeekToEn(int data) { if (data >= 0 && data <= 6) { return weekdaysEn[data]; } else { Debug.LogError("DF_NowTime_V01 WeekToEn 转换为英文星期,内容" + data + "不符合规范"); return ""; } } public static string GetTimeEn() { DateTime NowTime = DateTime.Now.ToLocalTime(); int lodata = Int32.Parse(DateTime.Now.DayOfWeek.ToString(("d"))); return NowTime.ToString("yyyy / MM / dd HH: mm:ss ") + WeekToEn(lodata); } //路径\替换为/ public static string PathToNormal(string path) { string loName = ""; char[] loPath = path.ToCharArray(); foreach (char item in loPath) { if (item == '\\') { loName += '/'; } else { loName += item; } } return loName; } //------------- public static void PauseTime(Action callBack) { Time.timeScale = 0; callBack?.Invoke(); } public static void PlayTime(Action callBack) { Time.timeScale = 1; callBack?.Invoke(); } /// /// 绑定EventTrigger事件 /// /// /// /// public static void AddEventTriggerFun(EventTrigger eventTrigger, EventTriggerType eventTriggerType, UnityEngine.Events.UnityAction unityAction) { // 定义所要绑定的事件类型 EventTrigger.Entry entry = new EventTrigger.Entry(); // 设置事件类型 entry.eventID = eventTriggerType; // 初始化回调函数 entry.callback = new EventTrigger.TriggerEvent(); // 定义回调函数 UnityEngine.Events.UnityAction callBack = new UnityEngine.Events.UnityAction(unityAction); // 绑定回调函数 entry.callback.AddListener(callBack); eventTrigger.triggers.Add(entry); } } }