using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.Networking; using UnityEngine.SceneManagement; /******************************************************************************** *Create By CG *Function 通用工具方法 *********************************************************************************/ namespace CG.UTility { public static class UtilitiesMng { /// /// 应用退出的几种方式【根据需要自行选择】 /// public static void CustomQuit() { Resources.UnloadUnusedAssets();// 卸载未使用的资产 #if UNITY_EDITOR UnityEditor.EditorApplication.isPlaying = false;// 在编译状态游戏退出 #else Application.Quit();//正常退出(在打包后使用,不能再编译状态下使用) System.Diagnostics.Process.GetCurrentProcess().Kill();// 关掉与当前活动相关的进程 System.Environment.Exit(0);// 终止当前进程并为基础操作系统提供指定的退出代码。 #endif PlayerPrefs.DeleteAll();//删除储存在注册表中的持久化储存的数据 System.GC.Collect();// 强制立刻回收 } /// /// 计算点到线的距离 /// /// point1为线的端点 /// point2为线的端点 /// 点的位置 /// private static float PointToLine(Vector2 point1, Vector2 point2, Vector2 position) { float space = 0.0f; float a, b, c; a = Vector2.Distance(point1, point2);// 线段的长度 b = Vector2.Distance(point1, position);// position到点point1的距离 c = Vector2.Distance(point2, position);// position到point2点的距离 if (c <= 0.000001f || b <= 0.000001f) { space = 0.0f; return space; } if (a <= 0.000001f) { space = b; return space; } if (c * c >= a * a + b * b) { space = b; return space; } if (b * b >= a * a + c * c) { space = c; return space; } float p = (a + b + c) / 2;// 半周长 float s =Mathf.Sqrt(p * (p - a) * (p - b) * (p - c));// 海伦公式求面积 space = 2.0f * s / a;// 返回点到线的距离(利用三角形面积公式求高) return space; } /// /// 异步加载场景 /// /// public static void LoadSceneAsync(string sceneName, System.Action LoadedCall) { GameObject loadSceneUIPrefab = Resources.Load("LoadScenePanelPrefab"); GameObject parentGeo = GameObject.Find("Canvas"); if (parentGeo == null) { WDebug.LogError("场景中没找到Canvas画布无法创建弹窗!!"); return; } GameObject loadSceneGeo = GameObject.Instantiate(loadSceneUIPrefab, parentGeo.transform); loadSceneGeo.GetComponent().LoadSceneAsync(sceneName, LoadedCall); } /// /// 同步加载场景 /// /// //public static void LoadScene(string sceneName) //{ // SceneManager.LoadScene(sceneName); //} /// /// 深层查找需要的物体 /// /// /// public static GameObject GetGeoByName(Transform[] parentTran, string GeoName,bool findHindAble=false) { if(GeoName== "保定架") { GeoName = "baodingjiaJH"; } for (int i = 0; i < parentTran.Length; i++) { foreach (Transform t in parentTran[i].GetComponentsInChildren(findHindAble)) { if (t.name.Equals(GeoName)) { return t.gameObject; } } } return null; } /// /// 打印某个方法执行时间 /// /// public static void PrintExecuteTime(Action call) { System.Diagnostics.Stopwatch timer = System.Diagnostics.Stopwatch.StartNew(); timer.Start(); call?.Invoke(); timer.Stop(); WDebug.Log($"{timer.Elapsed.TotalMilliseconds}"); } public static void LoadSpriteByURL(string url, Action SetCall) { if (string.IsNullOrEmpty(url)) return; MonoManager.Instance.StartCoroutine(LoadSpriteCoroutine(url, SetCall)); } private static IEnumerator LoadSpriteCoroutine(string url,Action SetSpriteCall) { // 使用UnityWebRequestTexture来获取图片纹理 UnityWebRequest m_webrequest = UnityWebRequestTexture.GetTexture(url); yield return m_webrequest.SendWebRequest(); // 检查下载是否成功 if (m_webrequest.result != UnityWebRequest.Result.Success) { // 打印错误信息 WDebug.LogError("Failed to download image"); } else { // 从下载处理器获取纹理 Texture2D tex = ((DownloadHandlerTexture)m_webrequest.downloadHandler).texture; Sprite createSprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f)); } } public static void StartScreenshot(string pictureTempFile, Action callBack) { MonoManager.Instance.StartCoroutine(CaptureScreenshot(pictureTempFile, callBack)); } private static IEnumerator CaptureScreenshot(string pictureTempFile, Action callBack) { // 等待渲染结束 yield return new WaitForEndOfFrame(); // 创建一个新的Texture2D对象,尺寸为屏幕当前分辨率 Texture2D screenImage = new Texture2D(Screen.width, Screen.height); // 读取屏幕上当前帧的像素 screenImage.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0); screenImage.Apply(); // 如果需要保存截图到文件 byte[] bytes = screenImage.EncodeToPNG(); #if UNITY_EDITOR || UNITY_STANDALONE // 保存至本地(适用于 PC 端) //string filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/实训报告.png"; //string filePath = pictureTempFile; //File.WriteAllBytes(filePath, bytes); //WDebug.Log("Screenshot saved to: " + filePath); FileHandle.CreateFile(pictureTempFile, bytes); #elif UNITY_WEBGL // 将截图转换为 Base64 字符串 string base64 = Convert.ToBase64String(bytes); string js = "var a = document.createElement('a'); document.body.appendChild(a); a.download = '实训报告.png'; a.href = 'data:image/png;base64," + base64 + "'; a.click();"; Application.ExternalEval(js); #endif callBack?.Invoke(); } /// /// 字符串统计 /// 一个汉字算两个字符,其他算一个 /// /// /// public static int GetTransCharNum(string text) { int totalNum = 0; char[] alrText = text.ToCharArray(); foreach (var item in alrText) { totalNum += SingleCharTrans(item); } return totalNum; } /// /// 单个字符判断 /// /// /// private static int SingleCharTrans(char singChar) { int leng = System.Text.Encoding.UTF8.GetBytes(singChar.ToString()).Length; //WDebug.Log(singChar.ToString() + "_" + System.Text.Encoding.UTF8.GetBytes(singChar.ToString()).Length); if (leng >= 2) { leng = 2; } return leng; } public static void LoadAudio(string filePath, Action callBack) { MonoManager.Instance.StartCoroutine(LoadAudioIE(filePath, callBack)); } private static IEnumerator LoadAudioIE(string filePath, Action callBack) { using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(filePath, AudioType.MPEG)) { yield return www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { WDebug.LogError(www.error); callBack?.Invoke(null); } else { AudioClip audioClip = DownloadHandlerAudioClip.GetContent(www); callBack?.Invoke(audioClip); //audioSource.clip = audioClip; //audioSource.Play(); } } } } }