using Assets.Scripts.UI.Control; using DG.Tweening; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Net.NetworkInformation; using System.Net.Sockets; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using UnityEngine; using UnityEngine.Networking; using UnityEngine.UI; namespace Assets.Scripts { public static class Utils { /*获取ip*/ public enum ADDRESSFAM { IPv4, IPv6 } /// /// 获取本机IP /// /// 要获取的IP类型 /// public static string GetIP(ADDRESSFAM Addfam) { if (Addfam == ADDRESSFAM.IPv6 && !Socket.OSSupportsIPv6) { return null; } string output = ""; foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()) { #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN NetworkInterfaceType _type1 = NetworkInterfaceType.Wireless80211; NetworkInterfaceType _type2 = NetworkInterfaceType.Ethernet; if ((item.NetworkInterfaceType == _type1 || item.NetworkInterfaceType == _type2) && item.OperationalStatus == OperationalStatus.Up) #endif { foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses) { //IPv4 if (Addfam == ADDRESSFAM.IPv4) { if (ip.Address.AddressFamily == AddressFamily.InterNetwork) { output = ip.Address.ToString(); //Debug.Log("IP:" + output); } } //IPv6 else if (Addfam == ADDRESSFAM.IPv6) { if (ip.Address.AddressFamily == AddressFamily.InterNetworkV6) { output = ip.Address.ToString(); } } } } } return output; } public static bool isLowIPhone() { var info = SystemInfo.deviceModel; if (info.Contains("iPhone")) { //iPhone2,1 var s = info.Replace("iPhone", "").Split(','); return s.Length == 2 && int.TryParse(s[0],out int gen) && gen < 9; } return false; } /*获取ip*/ /*显示简略提示,需要拖Toast的预制件,且保证其他组件名字不是Toast,ToastContainer*/ private static Dictionary _toastDict; private static Dictionary toastDict { get { if (_toastDict == null) { _toastDict = new Dictionary { {0,"Images/home/wrong|#f93086" },{1,"Images/home/right|#41A6FE" } }; } return _toastDict; } set { _toastDict = value; } } private static Dictionary _deviceDict; public static Dictionary deviceDict { get { if (_deviceDict == null) { _deviceDict = new Dictionary { {"Trainer","Smart Trainer|Images/Devices/Trainer_3" }, {"Power","Power Meter|Images/Devices/Power_3" }, {"Cadence","Cadence Sensor|Images/Devices/Cadence_3" }, {"HeartRate","Heart Rate Monitor|Images/Devices/Heart Rate_3" }, {"SpeedCadence","Cadence Sensor|Images/Devices/Cadence_3" }, {"Speed","Speed Meter|Images/Devices/Speed_3" }, {"Rower","Rower Machine|Images/Rower/设备 - 划船机" } }; } return _deviceDict; } private set { _deviceDict = value; } } public static void showToast(GameObject game,string text,int duration = 2,int type = 0) { //type 0错误 1正确 var parent = UIManager.Instance.ModalsPanel; if (parent == null) return; var toast = parent.transform.Find("ToastContainer"); if (toast != null) { MonoBehaviour.DestroyImmediate(toast.gameObject); } #if UNITY_IOS || UNITY_ANDROID var newToast = MonoBehaviour.Instantiate(Resources.Load("UI/Prefab/ToastContainer-mobile")); #else var newToast = MonoBehaviour.Instantiate(Resources.Load("UI/Prefab/ToastContainer")); #endif newToast.name = "ToastContainer"; newToast.GetComponent().position = new Vector3(Screen.width / 2, Screen.height / 2, 0); newToast.transform.parent = parent.transform; toast = newToast.transform; var toastStyle = toastDict[type].Split('|'); toast.Find("Image").GetComponent().sprite = Resources.Load(toastStyle[0]); toast.GetComponent().color = HexToColorHtml(toastStyle[1]); toast.GetComponent().showToast(JsonConvert.SerializeObject(new { text, duration })); } /*显示简略提示,需要拖Toast的预制件,且保证其他组件名字不是Toast,ToastContainer*/ public static void showLoading(this GameObject game) { var parent = Utils.FindUpParent(game.transform); var loading = parent.Find("Loading"); if (loading == null) { #if UNITY_IOS || UNITY_ANDROID var newLoading = MonoBehaviour.Instantiate(Resources.Load("UI/Prefab/Common/Mobile/Loading")); #else var newLoading = MonoBehaviour.Instantiate(Resources.Load("UI/Prefab/Common/Loading")); #endif newLoading.name = "Loading"; newLoading.GetComponent().position = new Vector3(Screen.width / 2, Screen.height / 2, 0); newLoading.transform.parent = parent; loading = newLoading.transform; } loading.GetComponent().Show(); } public static void showLoadingExtension(this GameObject game) { game.SetActive(true); var loading = game.transform.Find("Loading"); if (loading == null) { #if UNITY_IOS || UNITY_ANDROID var newLoading = MonoBehaviour.Instantiate(Resources.Load("UI/Prefab/Common/Mobile/Loading")); #else var newLoading = MonoBehaviour.Instantiate(Resources.Load("UI/Prefab/Common/Loading")); #endif newLoading.name = "Loading"; newLoading.GetComponent().position = new Vector3(Screen.width / 2, Screen.height / 2, 0); newLoading.transform.SetParent(game.transform); loading = newLoading.transform; loading.localScale = new Vector3(1, 1, 1); } loading.GetComponent().Show(); } public static void hideLoadingExtension(this GameObject game) { var loading = game.transform.Find("Loading"); if (loading != null) { loading.GetComponent().Close(); } game.SetActive(false); } public static void hideLoading(this GameObject game) { var parent = Utils.FindUpParent(game.transform); var loading = parent.Find("Loading"); if (loading != null) { //loading.gameObject.SetActive(false); loading.GetComponent().Close(); } } /*删除父亲节点下的所有孩子*/ static public void DestroyChildren(this Transform t) { bool isPlaying = Application.isPlaying; while (t.childCount != 0) { Transform child = t.GetChild(0); if (isPlaying) { child.SetParent(null); UnityEngine.Object.Destroy(child.gameObject); } else UnityEngine.Object.DestroyImmediate(child.gameObject); } Resources.UnloadUnusedAssets(); GC.Collect(); } /*删除父亲节点下的所有孩子*/ /*显示网络图片*/ private static Dictionary propTextureCache = new Dictionary(); public delegate Coroutine StartCoroutine(IEnumerator routine); public static void DisplayImage(RawImage img, string url, bool cache = false) { if (string.IsNullOrEmpty(url)) return; //可以考虑缓存到硬盘里 //Texture2D tex = null; //byte[] fileData; // //if (File.Exists(filePath)) //{ // fileData = File.ReadAllBytes(filePath); // tex = new Texture2D(2, 2); // tex.LoadImage(fileData); //..this will auto-resize the texture dimensions. //} if (cache) { if (propTextureCache.ContainsKey(url)) { img.texture = propTextureCache[url]; return; } } UIManager.Instance.StartCoroutine(DownloadImage(img, url,(texture)=> { if (cache && !propTextureCache.ContainsKey(url)) { propTextureCache.Add(url, texture); } })); } public static void DisplayImageAysnc(StartCoroutine startCoroutine, RawImage img, string url,Action action) { startCoroutine(DownloadImageCallBack(img, url, action)); } static IEnumerator DownloadImage(RawImage img,string MediaUrl, Action action = null) { UnityWebRequest request = UnityWebRequestTexture.GetTexture(MediaUrl); yield return request.SendWebRequest(); if (request.isNetworkError || request.isHttpError) Debug.Log(request.error); else if(img!=null) { img.texture = ((DownloadHandlerTexture)request.downloadHandler).texture; if (action != null) { action.Invoke(img.texture); } } } static IEnumerator DownloadImageCallBack(RawImage img, string MediaUrl,Action action) { UnityWebRequest request = UnityWebRequestTexture.GetTexture(MediaUrl); yield return request.SendWebRequest(); if (request.isNetworkError || request.isHttpError) Debug.Log(request.error); else { img.texture = ((DownloadHandlerTexture)request.downloadHandler).texture; action.Invoke(MediaUrl); } } /*显示网络图片*/ /*获取最顶层对象*/ public static Transform FindUpParent(Transform zi) { if (zi.parent == null) return zi; else return FindUpParent(zi.parent); } /*获取最顶层对象*/ /*Texture相关*/ public static void WriteTextureToPlayerPrefs(string tag, Texture2D tex) { // if texture is png otherwise you can use tex.EncodeToJPG(). byte[] texByte = tex.EncodeToPNG(); // convert byte array to base64 string string base64Tex = System.Convert.ToBase64String(texByte); // write string to playerpref PlayerPrefs.SetString(tag, base64Tex); PlayerPrefs.Save(); } public static Texture2D ReadTextureFromPlayerPrefs(string tag) { // load string from playerpref string base64Tex = PlayerPrefs.GetString(tag, null); if (!string.IsNullOrEmpty(base64Tex)) { // convert it to byte array byte[] texByte = System.Convert.FromBase64String(base64Tex); Texture2D tex = new Texture2D(2, 2); //load texture from byte array if (tex.LoadImage(texByte)) { return tex; } } return null; } /*Texture相关*/ public static byte[] StreamToBytes(Stream stream) { byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, bytes.Length); // 设置当前流的位置为流的开始 stream.Seek(0, SeekOrigin.Begin); return bytes; } public static Color HexToColor(string hex) { byte r = byte.Parse(hex.Substring(0, 2), NumberStyles.HexNumber); byte g = byte.Parse(hex.Substring(2, 2), NumberStyles.HexNumber); byte b = byte.Parse(hex.Substring(4, 2), NumberStyles.HexNumber); return new Color32(r, g, b, byte.MaxValue); } public static Color HexToColorHtml(string hex) { ColorUtility.TryParseHtmlString(hex, out Color c); return c; } /// /// Generate random digit code /// /// Length /// Result string public static string GenerateRandomDigitCode(int length) { var random = new System.Random(); string str = string.Empty; for (int i = 0; i < length; i++) str = String.Concat(str, random.Next(10).ToString()); return str; } /*文件转精灵*/ public static Sprite PngToSprite(string fullPath, int x, int y) { using (FileStream fs = new FileStream(fullPath, FileMode.Open, FileAccess.Read)) //自动双清 { fs.Seek(0, SeekOrigin.Begin); //设定当前流的位置 byte[] bytes = new byte[fs.Length]; //创建文件长度缓冲区 fs.Read(bytes, 0, (int)fs.Length); //读取文件 Texture2D texture = new Texture2D(x, y); //创建Texture texture.LoadImage(bytes); return Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.one / 2); } } /*文件转精灵*/ /*打开文件*/ public delegate void OpenFileCallBack(string path); public static void OpenFile(OpenFileCallBack callBack,string filter = null) { OpenFileName ofn = new OpenFileName(); ofn.structSize = Marshal.SizeOf(ofn); ofn.filter = "Image Files(*.jpg;*.jpeg;*.png;*.bmp)\0*.jpg;*.png;*.jpeg;*.bmp\0"; if (filter != null) ofn.filter = filter; ofn.file = new string(new char[256]); ofn.maxFile = ofn.file.Length; ofn.fileTitle = new string(new char[64]); ofn.maxFileTitle = ofn.fileTitle.Length; ofn.initialDir = UnityEngine.Application.dataPath;//默认路径 ofn.title = "Open Project"; ofn.defExt = "JPG";//显示文件的类型 //注意 一下项目不一定要全选 但是0x00000008项不要缺少 ofn.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000008; //0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008 OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST| OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR if (Win32.GetOpenFileName(ofn)) { callBack(ofn.file); } } /*打开文件*/ /*文本框/下拉框错误*/ public static void SetValidate(Dictionary dict, JArray errorList) { foreach (var error in errorList) { var className = dict[error.Value("Field")].GetType().Name; if (className == "InputField") { dict[error.Value("Field")].GetComponent() .SetValidate(true); } else if (className == "Dropdown") { dict[error.Value("Field")].GetComponent() .SetValidate(); } //formDict[error.Value("Filed")].error.Value("ErrMsg"); } } /*文本框/下拉框错误*/ public static void ExecFile(string path,string args = "") { System.Diagnostics.Process proc = null; try { proc = new System.Diagnostics.Process(); proc.StartInfo.FileName = path; proc.StartInfo.Arguments = args; proc.StartInfo.CreateNoWindow = false; proc.StartInfo.Verb = "runas"; proc.Start(); } catch (Exception ex) { Console.WriteLine("执行批处理的时候出现了异常!"); } } /*下载文件*/ public static void DisplayHead(RawImage raw, string s) { if (string.IsNullOrEmpty(s)) { raw.texture = Resources.Load("Images/icon-1024"); } else { DisplayImage(raw, s); } } public static void SetTextWithEllipsis(this Text textComponent, string value) { var generator = new TextGenerator(); var rectTransform = textComponent.GetComponent(); var settings = textComponent.GetGenerationSettings(rectTransform.rect.size); generator.Populate(value, settings); var characterCountVisible = generator.characterCountVisible; var updatedText = value; if (value.Length > characterCountVisible && characterCountVisible != -1) { updatedText = value.Substring(0, characterCountVisible - 3); updatedText += "…"; } textComponent.text = updatedText; } public static string GetCountDown(TimeSpan time) { var second = Math.Ceiling(time.TotalSeconds); var ts = TimeSpan.FromSeconds(second); return $"{ (int)ts.TotalHours }:{ts:mm}:{ts:ss}"; } private static IEnumerator TimerFunc(float seconds, Action action) { while (true) { yield return new WaitForSeconds(seconds); // 停止执行1秒 action.Invoke(); //time = UIManager.Now.GetDateTime().AddSeconds(1); } } public static void StartTimeUnLimit(float seconds,Action action) { UIManager.Instance.StartCoroutine(TimerFunc(seconds, action)); } public static void MyDOFade(this Transform transform) { var cg = transform.GetComponent(); if (cg) { cg.alpha = 0; #if UNITY_IOS cg.DOFade(1f, .6f); #else cg.DOFade(1f, .3f); #endif } } } }