using NPinyin; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; #if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; using UnityEngine.Networking; using UnityEngine.Video; namespace XRTool.Util { /// /// 工具类,各种常用算法的集合脚本 /// public static class UnityUtil { /* public const int B = 1; public const int KB = 1024; public const int MB = 1024 * 1024; public const long GB = 1024 * 1024 * 1024;*/ public const int B = 1; public const int KB = 1000; public const int MB = 1000 * 1000; public const long GB = 1000 * 1000 * 1000; public const string BString = "B"; public const string KBString = "KB"; public const string MBString = "MB"; public const string GBString = "GB"; /// /// 全局唯一id /// 自动自增 /// private static int unicode = 10000000; #if UNITY_EDITOR /// /// 尝试得到一个未命名的名称 /// 下标从0开始检索,如果不存在此名字的文字,则返回此名字 /// 如果存在,下标++ /// /// /// /// /// public static string TryGetName(string path, string suffix = ".asset") { int index = 0; string confName = ""; UnityEngine.Object obj = null; do { confName = path + "/" + typeof(T).Name + "_" + index + suffix; obj = AssetDatabase.LoadAssetAtPath(confName, typeof(T)); index++; } while (obj); return confName; } public static string TryGetName(Type T, string path, string suffix = ".asset") { int index = 0; string confName = ""; UnityEngine.Object obj = null; do { confName = path + "/" + T.Name + "_" + index + suffix; obj = AssetDatabase.LoadAssetAtPath(confName, T); index++; } while (obj); return confName; } #endif /// /// 获取指定名称类型的对象 /// /// /// /// public static T GetChild(Transform target, string childName) { var child = target.Find(childName); if (child) { return child.GetComponent(); } return default(T); } /// /// 深度优先搜索查找子物体 /// /// /// /// public static T GetDepthChild(Transform transform, string childName) { Transform target = FindDepthTransf(transform, childName); if (target) return GetT(target.gameObject); return default(T); } public static GameObject GetDepthChild(Transform transform, string childName) { Transform target = FindDepthTransf(transform, childName); if (target) return target.gameObject; return null; } /// /// 广度优先查找子物体 /// /// /// /// public static T GetBreadthChild(Transform transform, string childName) { Transform target = FindBreadthTransf(transform, childName); if (target) return GetT(target.gameObject); return default(T); } public static GameObject GetBreadthChild(Transform transform, string childName) { Transform target = FindBreadthTransf(transform, childName); if (target) return target.gameObject; return null; } public static T GetParent(Transform transform) { return transform.GetComponentInParent(); } public static T GetChild(Transform trans) { return trans.GetComponentInChildren(); } public static T GetT(GameObject target) { return target.GetComponent(); } /// /// 深度优先检索子物体 /// /// /// /// public static Transform FindDepthTransf(Transform check, string childName) { if (check.name == childName) return check; for (int i = 0; i < check.childCount; i++) { Transform obj = FindDepthTransf(check.GetChild(i), childName); if (obj) return obj; } return null; } /// /// 广度优先检索子物体 /// /// /// /// public static Transform FindBreadthTransf(Transform check, string childName) { Transform forreturn = check.Find(childName); if (forreturn) { return forreturn; } if (check.childCount > 0) { for (int i = 0; i < check.childCount; i++) { var target = FindBreadthTransf(check.GetChild(i), childName); if (target) { return target; } } } return forreturn; } public static void SetParent(Transform parent, Transform child) { child.SetParent(parent); child.localPosition = Vector3.zero; child.localRotation = Quaternion.identity; child.localScale = Vector3.one; } ///         /// 去除文件bom头后的字符         ///         ///         /// public static string GetUTF8String(byte[] buffer) { if (buffer == null) return null; if (buffer.Length <= 3) { return Encoding.UTF8.GetString(buffer); } byte[] bomBuffer = new byte[] { 0xef, 0xbb, 0xbf }; if (buffer[0] == bomBuffer[0] && buffer[1] == bomBuffer[1] && buffer[2] == bomBuffer[2]) { return new UTF8Encoding(false).GetString(buffer, 3, buffer.Length - 3); } return Encoding.UTF8.GetString(buffer); } /// /// 获取距离放歌最近的数字 /// 四舍五入 /// /// /// /// public static float GetNearst(float num, float cell) { int dir = num < 0 ? -1 : 1; return ((int)(num + cell / 2 * dir) / (int)cell) * cell; } /// /// 判断两个矩形是否相交 /// 如果两个矩形中心点在x、y轴的投影距离分别小于矩形的边长之和,则此矩形相交 /// /// /// /// public static bool IsCrossLine(Rect a, Rect b) { Vector2 dis = b.center - a.center; if (((int)a.width + (int)b.width) / 2 > Math.Abs(dis.x) && ((int)a.height + (int)b.height) / 2 > Math.Abs(dis.y)) { return true; } return false; } public static void ChangeMateColor(Renderer render, Color color, string name = "_Color") { if (render) { MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock(); render.GetPropertyBlock(propertyBlock); propertyBlock.SetColor(name, color); render.SetPropertyBlock(propertyBlock); //ChangeMateValue(render, propertyBlock); propertyBlock = null; } } public static void ChangeMateColor(MaterialPropertyBlock propertyBlock, Renderer render, Color color, string name = "_Color") { if (render) { render.GetPropertyBlock(propertyBlock); propertyBlock.SetColor(name, color); render.SetPropertyBlock(propertyBlock); //ChangeMateValue(render, propertyBlock); //propertyBlock = null; } } public static void ChangeMateTexture2D(Renderer render, Texture2D img, string name = "_MainTex") { if (render) { MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock(); render.GetPropertyBlock(propertyBlock); propertyBlock.SetTexture(name, img); render.SetPropertyBlock(propertyBlock); propertyBlock = null; } } public static void ChangeMateVideo(GameObject obj, VideoClip video, string name = "_MainTex") { if (obj) { VideoPlayer vp = obj.GetComponent(); vp.clip = video; } } public static void ChangeMateTexture(Renderer render, Texture img, string name = "_MainTex") { if (render) { MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock(); render.GetPropertyBlock(propertyBlock); propertyBlock.SetTexture(name, img); render.SetPropertyBlock(propertyBlock); propertyBlock = null; } } public static void ChangeMateValue(Renderer render, float att, string name = "_Smoothness") { if (render) { MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock(); render.GetPropertyBlock(propertyBlock); propertyBlock.SetFloat(name, att); render.SetPropertyBlock(propertyBlock); //ChangeMateValue(render, propertyBlock); propertyBlock = null; } } public static void ChangeMateValue(Renderer render, Vector4 att, string name = "_Smoothness") { if (render) { MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock(); render.GetPropertyBlock(propertyBlock); propertyBlock.SetVector(name, att); render.SetPropertyBlock(propertyBlock); //ChangeMateValue(render, propertyBlock); propertyBlock = null; } } public static void ChangeMateValue(Renderer render, MaterialPropertyBlock propertyBlock) { if (render) { //MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock(); render.GetPropertyBlock(propertyBlock); //propertyBlock.SetVector(name, att); render.SetPropertyBlock(propertyBlock); } } /// /// 材质复制 /// /// /// public static void CopyMate(Material resMate, Material targetMate) { if (resMate && resMate != targetMate) { resMate.shader = targetMate.shader; resMate.CopyPropertiesFromMaterial(targetMate); } } ///// ///// ///// ///// //public static string ArtTransferInfo(ArtInfo info) //{ // Vector3 pos = GameSession.Instance.GetHeadForwadPos(info.Distance); // if (GameNode.Instance) // { // pos = GameNode.Instance.transform.InverseTransformPoint(pos); // } // var angle = Vector3.zero; // var scale = Vector3.one * info.Size; // return TransferToString(pos, angle, scale, 2); //} public static string TransferToString(Transform tranfer, int state) { return TransferToString(tranfer.localPosition, tranfer.localEulerAngles, tranfer.localScale, state); } public static int maxTransfer = 1000; public static string TransferToString(Vector3 pos, Vector3 ang, Vector3 sca, int state) { string info = ""; pos *= maxTransfer; ang *= maxTransfer; sca *= maxTransfer; string position = (int)(pos.x) + "," + (int)(pos.y) + "," + (int)(pos.z); string angle = (int)(ang.x) + "," + (int)(ang.y) + "," + (int)(ang.z); string scale = (int)(sca.x) + "," + (int)(sca.y) + "," + (int)(sca.z); info = position + "|" + angle + "|" + scale; //if (state == 2) //{ // info = pos + "|" + angle + "|" + scale; //} //else if (state == 1) //{ // info = pos + "|" + angle; //} //else if (state == 1) //{ // info = pos; //} return info; } //public static Posture GetPosture(Transform info) //{ // Posture posture = new Posture(); // posture.position = info.localPosition; // posture.angle = info.localEulerAngles; // posture.scale = info.localScale; // posture.count = 2; // return posture; //} //public static void SetPosture(Transform info, Posture posture, float time = -1) //{ // if (time <= 0) // { // info.localPosition = posture.position; // info.localEulerAngles = posture.angle; // info.localScale = posture.scale; // } // else // { // info.DOKill(); // if (posture.count >= 0) // { // info.DOLocalMove(posture.position, time); // } // if (posture.count >= 1) // { // info.DOLocalRotate(posture.angle, time); // } // if (posture.count >= 2) // { // info.DOScale(posture.scale, time); // } // } //} //public static Posture GetPosture(string info) //{ // Posture posture = new Posture(); // string[] arr = info.Split('|'); // for (int i = 0; i < arr.Length; i++) // { // if (string.IsNullOrEmpty(arr[i])) // { // continue; // } // string[] v = arr[i].Split(','); // Vector3 vector = Vector3.zero; // vector.x = float.Parse(v[0]); // vector.y = float.Parse(v[1]); // vector.z = float.Parse(v[2]); // //for (int j = 0; j < v.Length; j++) // //{ // // float value = float.Parse(v[j]); // // if (j == 0) // // { // // vector.x = value; // // } // // else if (j == 1) // // { // // vector.y = value; // // } // // else if (j == 2) // // { // // vector.z = value; // // } // //} // vector /= maxTransfer; // if (i == 0) // { // posture.position = vector; // } // else if (i == 1) // { // posture.angle = vector; // } // else if (i == 2) // { // posture.scale = vector; // } // posture.count = i; // } // return posture; //} //public static Posture GetPosture(string info) //{ // Posture posture = new Posture(); // string[] arr = info.Split('|'); // for (int i = 0; i < arr.Length; i++) // { // if (string.IsNullOrEmpty(arr[i])) // { // continue; // } // string[] v = arr[i].Split(','); // Vector3 vector = Vector3.zero; // for (int j = 0; j < v.Length; j++) // { // float value = float.Parse(v[j]); // if (j == 0) // { // vector.x = value; // } // else if (j == 1) // { // vector.y = value; // } // else if (j == 2) // { // vector.z = value; // } // } // vector *= maxTransfer; // if (i == 0) // { // posture.position = vector; // } // else if (i == 1) // { // posture.angle = vector; // } // else if (i == 2) // { // posture.scale = vector; // } // posture.count = i; // } // return posture; //} public static Vector3 StringToVector3(string v) { Vector3 z = Vector3.zero; v = v.Replace("(", "").Replace(")", ""); string[] s = v.Split(','); if (s.Length > 2) { z.x = float.Parse(s[0]); z.y = float.Parse(s[1]); z.z = float.Parse(s[2]); z /= maxTransfer; } return z; } public static string Vector3ToString(Vector3 v) { return v.ToString(); } public static string QuaterToString(Quaternion q) { q.x *= maxTransfer; q.y *= maxTransfer; q.z *= maxTransfer; q.w *= maxTransfer; return q.ToString(); } public static Quaternion StringToQuater(string v) { Quaternion q = Quaternion.identity; v = v.Replace("(", "").Replace(")", ""); string[] s = v.Split(','); if (s.Length > 3) { q.x = float.Parse(s[0]) / maxTransfer; q.y = float.Parse(s[1]) / maxTransfer; q.z = float.Parse(s[2]) / maxTransfer; q.w = float.Parse(s[3]) / maxTransfer; } return q; } public static Vector3 RealForward(Transform body) { Vector3 right = body.right; right.y = 0; return Vector3.Cross(right, Vector3.up); } public static string CurTimeString { get { return DateTime.Now.ToString("MMddHHmmssf"); } } /// /// 通过时间生成一个绝对的唯一的id /// 此id的生成有可能存在重复,如果存在同时的调用方式时 /// public static string TimeID { get { return DateTime.Now.ToString("HHmmssfffff"); } } /// /// 全局唯一id /// public static int Unicode { get { return ++unicode; } } /// /// 从URl下载指定的资源 /// /// 资源的地址,可以是网络路径,也可以是本地文件路径 /// 下载的进度,当前已下载文件大小,以及进度 /// /// 请求的参数,如果为空代表Get请求,不为空代表Post请求 /// public static IEnumerator RequestDownData(string url, Action complete, DownloadHandler hander = null, Action updateProcess = null, WWWForm form = null) { UnityWebRequest web; Debug.Log("RequestDownData" + url); if (form == null) { web = UnityWebRequest.Get(url); } else { web = UnityWebRequest.Post(url, form); } if (hander != null) { web.downloadHandler = hander; } web.SendWebRequest(); while (!web.isDone) { updateProcess?.Invoke(web.downloadedBytes, web.downloadProgress); yield return 0; } if (web.isDone) { updateProcess?.Invoke(web.downloadedBytes, 1); } if (web.isNetworkError || web.isHttpError) { complete?.Invoke(web.error, web); Debug.LogError(web.error + url); } else { complete?.Invoke(null, web); } web.Dispose(); } /// /// 拷贝文件 /// /// /// /// 是否覆盖 /// public static bool CopyDirectory(string SourcePath, string DestinationPath, bool overwriteexisting) { bool ret = false; try { SourcePath = SourcePath.EndsWith(@"\") ? SourcePath : SourcePath + @"\"; DestinationPath = DestinationPath.EndsWith(@"\") ? DestinationPath : DestinationPath + @"\"; if (Directory.Exists(SourcePath)) { if (Directory.Exists(DestinationPath) == false) Directory.CreateDirectory(DestinationPath); foreach (string fls in Directory.GetFiles(SourcePath)) { FileInfo flinfo = new FileInfo(fls); flinfo.CopyTo(DestinationPath + flinfo.Name, overwriteexisting); UnityEngine.Debug.Log(flinfo.CreationTime.ToString()); } foreach (string drs in Directory.GetDirectories(SourcePath)) { DirectoryInfo drinfo = new DirectoryInfo(drs); if (CopyDirectory(drs, DestinationPath + drinfo.Name, overwriteexisting) == false) ret = false; } } ret = true; } catch (Exception ex) { ret = false; UnityLog.LogError(ex.ToString()); } return ret; } /// /// 广度优先,遍历文件 /// /// /// public static void FindFileBreadth(string path, Action callBack) { try { DirectoryInfo di = new DirectoryInfo(path); FileInfo[] fis = di.GetFiles(); for (int i = 0; i < fis.Length; i++) { callBack?.Invoke(fis[i].FullName); } DirectoryInfo[] dis = di.GetDirectories(); for (int j = 0; j < dis.Length; j++) { FindFileBreadth(dis[j].FullName, callBack); } } catch (Exception ex) { UnityLog.LogError(ex.ToString()); } } /// /// 深度优先,遍历文件 /// /// public static void FindFileByDepth(string dir, Action callBack) { try { DirectoryInfo d = new DirectoryInfo(dir); FileSystemInfo[] fsinfos = d.GetFileSystemInfos(); foreach (FileSystemInfo fsinfo in fsinfos) { if (fsinfo is DirectoryInfo) { FindFileByDepth(fsinfo.FullName, callBack); } else { callBack?.Invoke(fsinfo.FullName); } } } catch (Exception ex) { UnityLog.LogError(ex.ToString()); } } /// /// 获取文件MD5值 /// /// 文件绝对路径 /// MD5值 public static string GetMD5HashFromFile(string fileName) { try { FileStream file = new FileStream(fileName, FileMode.Open); System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); byte[] retVal = md5.ComputeHash(file); file.Close(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < retVal.Length; i++) { sb.Append(retVal[i].ToString("x2")); } return sb.ToString(); } catch (Exception ex) { throw new Exception("GetMD5HashFromFile() fail,error:" + ex.Message); } } /// /// 重命名文件 /// /// /// public static void ReNameFile(string file, string newFile) { if (File.Exists(file)) { try { string dir = Path.GetDirectoryName(newFile); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } if (File.Exists(newFile)) { File.Delete(newFile); } FileInfo info = new FileInfo(file); info.MoveTo(newFile); } catch (Exception ex) { UnityLog.LogError(file + " is error" + ex.ToString()); } } } /// /// 删除文件 /// /// /// public static void DelFile(string file) { UnityLog.Log(file + " is Del", 3); if (File.Exists(file)) { try { File.Delete(file); } catch (Exception ex) { UnityLog.LogError(file + " is error" + ex.ToString()); } } } public static string AutoDateTrans(long bytes, int count = 2) { if (bytes >= GB) { return ByteToGB(bytes, count); } else if (bytes >= MB) { return ByteToMB(bytes, count); } else if (bytes >= KB) { return ByteToKB(bytes, count); } return ByteToB(bytes, count); } public static string ByteToB(long bytes, int count = 2) { return TransNUM(bytes, B, BString, count); } public static string ByteToKB(long bytes, int count = 2) { return TransNUM(bytes, KB, KBString, count); } public static string ByteToMB(long bytes, int count = 2) { return TransNUM(bytes, MB, MBString, count); } public static string ByteToGB(long bytes, int count = 2) { return TransNUM(bytes, GB, GBString, count); } public static string TransNUM(long bytes, long jinzhi, string houzui = "", int count = 2) { float num = bytes * 1f / jinzhi; return num.ToString("f" + count) + houzui; } public static Sprite CreateSpriteByData(byte[] data) { Texture2D tex = new Texture2D(64, 64); tex.LoadImage(data); return Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), Vector2.zero); } public static Texture2D CreateTextureByData(byte[] data) { // Debug.Log("CreateTextureByData====>"+data.Length); Texture2D tex = new Texture2D(32, 32); tex.LoadImage(data); return tex; } /// /// 获取URL对应的名称,可以作为文件主键的数据 /// /// /// public static string GetUrlName(string url) { string name = Regex.Replace(url, @"[^a-zA-Z0-9\u4e00-\u9fa5\s]", ""); return name.Replace(" ", "_"); } /// /// 获取url对应的本地路径 /// /// /// public static string GetFilePath(string url, int count = 2) { var p = url.Split('?'); if (p.Length > 1) { url = p[p.Length - 2]; } else { url = p[0]; } string[] arr = url.Split('/'); string path = url; if (arr.Length > count) { path = ""; //maxLen = 30; for (int i = arr.Length - count; i < arr.Length; i++) { if (i != arr.Length - 1) { string strAfter = Regex.Replace(arr[i], @"[^a-zA-Z0-9\u4e00-\u9fa5\s]", ""); if (strAfter.Length > maxLen) { strAfter = strAfter.Substring(strAfter.Length - maxLen, maxLen); } path += strAfter + "/"; } else { string strAfter = Regex.Replace(arr[i], @"[^a-zA-Z0-9_.\u4e00-\u9fa5\s]", ""); if (strAfter.Length > maxLen) { strAfter = strAfter.Substring(strAfter.Length - maxLen, maxLen); } path += strAfter; } } } return path; } public static string GetVideoTime(long time) { string timeStr; if (time < 60) { timeStr = string.Format("00:00:{0:00}", time % 60); } else if (time < 3600) { timeStr = string.Format("00:{0:00}:", time / 60) + string.Format("{0:00}", time % 60); } else { timeStr = string.Format("{0:00}:", time / 3600) + string.Format("{0:00}:", (time % 3600) / 60) + string.Format("{0:00}", time % 60); } return timeStr; } public static void WriteFile(string path, byte[] bytes) { string dir = Path.GetDirectoryName(path); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate)) { stream.Write(bytes, 0, bytes.Length); stream.Flush(); stream.Close(); stream.Dispose(); } } /// /// 汉字转化为拼音 /// /// 汉字 /// 全拼 public static string GetPinyin(string str) { var result = ""; if (!string.IsNullOrEmpty(str)) { result = Pinyin.GetPinyin(str)?.Replace(" ", "").ToLower(); } return result; } /// /// 汉字转化为拼音首字母 /// /// 汉字 /// 首字母 public static string GetInitials(string str) { var result = ""; if (!string.IsNullOrEmpty(str)) { result = Pinyin.GetInitials(str)?.Trim().ToLower(); } return result; } /// /// 控制一组对象的显示或者隐藏 /// /// 对象组 /// 是否显示或者隐藏 /// 是否强制 /// 排除对象组中的数据 public static void ControlChildActive(List list, bool isShow, bool isForce = false, params GameObject[] exits) { if (list != null) { List others = list; if (exits != null) { if (isForce) { for (int i = 0; i < exits.Length; i++) { if (exits[i].activeSelf == isShow) { exits[i].SetActive(!isShow); } } } others = list.Except(exits).ToList(); } for (int i = 0; i < others.Count; i++) { if (others[i].activeSelf != isShow) { others[i].SetActive(isShow); } } } } // 时间戳转为C#格式时间 public static DateTime SpanToDateTime(string timeSpan) { long lTime = long.Parse(timeSpan); return SpanToDateTime(lTime); } // 时间戳转为C#格式时间 public static DateTime SpanToDateTime(long timeSpan) { DateTime dateTimeStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); return dateTimeStart.AddSeconds(timeSpan); /* DateTime dateTimeStart = TimeZone.CurrentTimeZone.ToUniversalTime(new DateTime(1970, 1, 1)); TimeSpan toNow = new TimeSpan(timeSpan); return dateTimeStart.Add(toNow);*/ } // DateTime时间格式转换为Unix时间戳格式 public static long DateTimeToSpan(DateTime time) { DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); return (long)((time - startTime).TotalSeconds); } public static string[] dayOfWeek = new string[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }; private static int maxLen = 30; public static string GetDateTimeMsg(DateTime date) {/* if (LanguageMgr.Instance.LanIndex == 0) {*/ return date.ToString("yyyy年MM月dd日") + dayOfWeek[(int)date.DayOfWeek]; /* } else { return date.ToString("ddd, dd MMM yyyy", new System.Globalization.CultureInfo("en-US")); }*/ } /// /// 获取游戏对象的路径 /// /// /// public static string GetGameObjectPath(Transform obj) { if (obj != null) { string path = obj.name; Transform temp = obj; while (temp.parent!=null) { temp = temp.parent; path = temp.name + "/" + path; } return path; } else { Debug.LogError("GetGameObjectPath==>obj=null"); return default; } } } }