GameUtility.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using OpenCVForUnity.CoreModule;
  5. using OpenCVForUnity.ImgcodecsModule;
  6. using OpenCVForUnity.ImgprocModule;
  7. using OpenCVForUnity.UnityUtils;
  8. using UnityEditor;
  9. using System.Text;
  10. using System.Web;
  11. using System;
  12. using System.IO;
  13. using System.Linq;
  14. /// <summary>
  15. /// 游戏工具类
  16. /// Game Utility Tools
  17. /// </summary>
  18. public class GameUtility
  19. {
  20. /// <summary>
  21. /// Find Deep child with name
  22. /// </summary>
  23. public static Transform FindDeepChild(GameObject _target, string _childName)
  24. {
  25. Transform resultTrs = null;
  26. resultTrs = _target.transform.Find(_childName);
  27. if (resultTrs == null)
  28. {
  29. foreach (Transform trs in _target.transform)
  30. {
  31. resultTrs = GameUtility.FindDeepChild(trs.gameObject, _childName);
  32. if (resultTrs != null)
  33. return resultTrs;
  34. }
  35. }
  36. return resultTrs;
  37. }
  38. /// <summary>
  39. /// Find component in Target Child
  40. /// </summary>
  41. public static T FindDeepChild<T>(GameObject _target, string _childName) where T : Component
  42. {
  43. Transform resultTrs = GameUtility.FindDeepChild(_target, _childName);
  44. if (resultTrs != null)
  45. return resultTrs.gameObject.GetComponent<T>();
  46. return (T)((object)null);
  47. }
  48. /// <summary>
  49. /// 添加子节点
  50. /// Add child to target
  51. /// </summary>
  52. public static void AddChildToTarget(Transform target, Transform child)
  53. {
  54. //child.parent = target;
  55. child.SetParent(target, false);
  56. child.localScale = Vector3.one;
  57. child.localPosition = Vector3.zero;
  58. child.localEulerAngles = Vector3.zero;
  59. ChangeChildLayer(child, target.gameObject.layer);
  60. }
  61. /// <summary>
  62. /// 修改子节点Layer
  63. /// Change child layer
  64. /// </summary>
  65. public static void ChangeChildLayer(Transform t, int layer)
  66. {
  67. t.gameObject.layer = layer;
  68. for (int i = 0; i < t.childCount; ++i)
  69. {
  70. Transform child = t.GetChild(i);
  71. child.gameObject.layer = layer;
  72. ChangeChildLayer(child, layer);
  73. }
  74. }
  75. /// 删除下面所有子物体
  76. public static void DeleteAllGo(Transform go)
  77. {
  78. List<GameObject> DeleteList = new List<GameObject>();
  79. for (int i = 0; i < go.childCount; i++)
  80. {
  81. DeleteList.Add(go.GetChild(i).gameObject);
  82. }
  83. for (int i = 0; i < DeleteList.Count; i++)
  84. {
  85. GameObject.DestroyImmediate(DeleteList[i],true);
  86. }
  87. }
  88. // 删除下面单个物体
  89. public static void DeleteSingleGo(Transform go, int index)
  90. {
  91. for (int i = 0; i < go.childCount; i++)
  92. {
  93. if (i == index)
  94. GameObject.Destroy(go.GetChild(i).gameObject);
  95. }
  96. }
  97. private static Texture2D _tex;
  98. /// <summary>
  99. /// OpenCV生成图片缩略图
  100. /// </summary>
  101. /// <param name="path">文件路径</param>
  102. /// <param name="zoom">缩放值</param>
  103. /// <returns></returns>
  104. public static Mat zoomMatByOpenCV(string path, double zoom)
  105. {
  106. //Debug.Log(" zoomMatByOpenCV path : "+path);
  107. Mat mat = filePathToMat(path);
  108. //Debug.Log(mat.cols());
  109. //Debug.Log(mat.rows());
  110. //压缩图片
  111. Size size = new Size(mat.cols() * zoom, mat.rows() * zoom);
  112. Mat zoomMat = new Mat(size, CvType.CV_8UC4);
  113. Imgproc.resize(mat, zoomMat, size);
  114. ////BGR 转RGB
  115. Mat imgRGBMat = new Mat(zoomMat.cols(), zoomMat.rows(), CvType.CV_8UC4);
  116. Imgproc.cvtColor(zoomMat, imgRGBMat, Imgproc.COLOR_BGR2RGB);
  117. zoomMat.release();
  118. mat.release();
  119. return imgRGBMat;
  120. //return mat;
  121. }
  122. public event Action RefreshEvent;
  123. /// <summary>
  124. /// OpenCV生成图片缩略图
  125. /// </summary>
  126. /// <param name="path">文件路径</param>
  127. /// <param name="zoom">缩放值</param>
  128. /// <returns></returns>
  129. public static Mat zoomByteByOpenCV(string path, double zoom,bool isZD=false,bool issuolve=false)
  130. {
  131. MatOfByte matbytes = filePathToMatByte(path);
  132. Mat mat = Imgcodecs.imdecode(matbytes, -1);
  133. if (isZD)
  134. {
  135. zoom = 1;
  136. float sint = 2048f;
  137. if(issuolve)
  138. {
  139. sint = 256f;
  140. }
  141. if (mat.cols() > sint)
  142. {
  143. zoom = (float)(sint / mat.cols());
  144. }
  145. if (mat.rows() * zoom > sint)
  146. {
  147. zoom = (float)(sint / (float)(mat.rows() * zoom));
  148. }
  149. }
  150. //Debug.Log(mat.cols());
  151. //Debug.Log(mat.rows());
  152. //压缩图片
  153. Size size = new Size(mat.cols() * zoom, mat.rows() * zoom);
  154. Mat zoomMat = new Mat(size, CvType.CV_8UC4);
  155. Imgproc.resize(mat, zoomMat, size);
  156. ////BGR 转RGB
  157. Mat imgRGBMat = new Mat(zoomMat.cols(), zoomMat.rows(), CvType.CV_8UC4);
  158. Imgproc.cvtColor(zoomMat, imgRGBMat, Imgproc.COLOR_BGR2RGB);
  159. //RefreshEvent?.Invoke();
  160. zoomMat.release();
  161. mat.release();
  162. matbytes.release();
  163. return imgRGBMat;
  164. //return mat;
  165. }
  166. /// <summary>
  167. /// OpenCV生成图片缩略图
  168. /// </summary>
  169. /// <param name="">二进制</param>
  170. /// <param name="zoom">缩放值</param>
  171. /// <returns></returns>
  172. public static Mat zoomByteByOpenCV(byte[] bytedata, double zoom)
  173. {
  174. MatOfByte matbytes = new MatOfByte(bytedata);
  175. if (matbytes.nativeObj == IntPtr.Zero)
  176. {
  177. return null;
  178. }
  179. Mat mat = Imgcodecs.imdecode(matbytes, -1);
  180. //mat.
  181. //Debug.Log(mat.cols());
  182. //Debug.Log(mat.rows());
  183. //压缩图片
  184. Size size = new Size(mat.cols() * zoom, mat.rows() * zoom);
  185. Mat zoomMat = new Mat(size, CvType.CV_8UC4);
  186. Imgproc.resize(mat, zoomMat, size);
  187. ////BGR 转RGB
  188. Mat imgRGBMat = new Mat(zoomMat.cols(), zoomMat.rows(), CvType.CV_8UC4);
  189. Imgproc.cvtColor(zoomMat, imgRGBMat, Imgproc.COLOR_BGR2RGB);
  190. zoomMat.release();
  191. mat.release();
  192. matbytes.release();
  193. //RefreshEvent?.Invoke();
  194. return imgRGBMat;
  195. //return mat;
  196. }
  197. /// <summary>
  198. /// 为了放入子线程 不能使用Time
  199. /// </summary>
  200. /// <param name="matbytes"></param>
  201. /// <param name="zoom"></param>
  202. /// <returns></returns>
  203. public static Mat zoomMatOfByteByOpenCV(MatOfByte matbytes, double zoom)
  204. {
  205. Mat mat = Imgcodecs.imdecode(matbytes, -1);
  206. zoom = 1;
  207. float sint = 256f;
  208. if (mat.cols() > sint)
  209. {
  210. zoom = (float)(sint / mat.cols());
  211. }
  212. if (mat.rows() * zoom > sint)
  213. {
  214. zoom = (float)(sint / (float)(mat.rows() * zoom));
  215. }
  216. //Debug.Log(mat.cols());
  217. //Debug.Log(mat.rows());
  218. //压缩图片
  219. Size size = new Size(mat.cols() * zoom, mat.rows() * zoom);
  220. Mat zoomMat = new Mat(size, CvType.CV_8UC4);
  221. Imgproc.resize(mat, zoomMat, size);
  222. ////BGR 转RGB
  223. Mat imgRGBMat = new Mat(zoomMat.cols(), zoomMat.rows(), CvType.CV_8UC4);
  224. Imgproc.cvtColor(zoomMat, imgRGBMat, Imgproc.COLOR_BGR2RGB);
  225. zoomMat.release();
  226. mat.release();
  227. matbytes.release();
  228. return imgRGBMat;
  229. }
  230. /// <summary>
  231. /// 通过文件地址拿到图片矩阵
  232. /// </summary>
  233. /// <param name="path"></param>
  234. /// <returns></returns>
  235. public static Mat filePathToMat(string path)
  236. {
  237. //Imgcodecs.imdecode
  238. return Imgcodecs.imread(path);
  239. }
  240. public static MatOfByte filePathToMatByte(string path)
  241. {
  242. MatOfByte matOfByte = new MatOfByte(LoadSpriteByIOByte(path));
  243. //Imgcodecs.imdecode
  244. return matOfByte;
  245. }
  246. /// <summary>
  247. /// 矩阵转Texture
  248. /// </summary>
  249. /// <param name="path"></param>
  250. /// <param name="zoom"></param>
  251. /// <returns></returns>
  252. public static Texture2D TextureByMat(Mat imgRGBMat)
  253. {
  254. //Debug.Log(imgRGBMat.cols());
  255. //Debug.Log(imgRGBMat.rows());
  256. _tex = new Texture2D(imgRGBMat.cols(), imgRGBMat.rows(), TextureFormat.RGB24, false);
  257. Utils.fastMatToTexture2D(imgRGBMat, _tex);
  258. return _tex;
  259. }
  260. /// <summary>
  261. /// 缩略图
  262. /// </summary>
  263. /// <param name="source"></param>
  264. /// <param name="newWidth"></param>
  265. /// <param name="newHeight"></param>
  266. /// <returns></returns>
  267. public static Texture2D Resize(Texture2D source, int newWidth, int newHeight)
  268. {
  269. source.filterMode = FilterMode.Point;
  270. RenderTexture rt = RenderTexture.GetTemporary(newWidth, newHeight);
  271. rt.filterMode = FilterMode.Point;
  272. RenderTexture.active = rt;
  273. Graphics.Blit(source, rt);
  274. var nTex = new Texture2D(newWidth, newHeight);
  275. nTex.ReadPixels(new UnityEngine.Rect(0, 0, newWidth, newHeight), 0, 0);
  276. nTex.Apply();
  277. RenderTexture.active = null;
  278. return nTex;
  279. }
  280. /// <summary>
  281. /// IO方式加载本地图片
  282. /// </summary>
  283. /// <param name="fileurl"></param>
  284. /// <returns>Texture2D</returns>
  285. public Texture2D LoadSpriteByIO(string fileurl)
  286. {
  287. double startTime = (double)Time.time;
  288. //创建文件流
  289. FileStream fileStream = new FileStream(fileurl, FileMode.Open, FileAccess.Read);
  290. fileStream.Seek(0, SeekOrigin.Begin);
  291. //创建文件长度的缓冲区
  292. byte[] bytes = new byte[fileStream.Length];
  293. //读取文件
  294. fileStream.Read(bytes, 0, (int)fileStream.Length);
  295. //释放文件读取liu
  296. fileStream.Close();
  297. fileStream.Dispose();
  298. fileStream = null;
  299. //创建Texture
  300. int width = 300;
  301. int height = 372;
  302. Texture2D texture2D = new Texture2D(width, height);
  303. texture2D.LoadImage(bytes);
  304. //tex = texture2D;
  305. return texture2D;
  306. }
  307. /// <summary>
  308. /// texture转2进制
  309. /// </summary>
  310. /// <param name="sp"></param>
  311. /// <returns></returns>
  312. public static byte[] GetTextureToByte(Texture2D temp)
  313. {
  314. //在转换成bytes
  315. byte[] photoByte = temp.EncodeToPNG();
  316. return photoByte;
  317. }
  318. /// <summary>
  319. /// IO方式加载本地图片
  320. /// </summary>
  321. /// <param name="fileurl"></param>
  322. /// <returns>byte[]</returns>
  323. public static byte[] LoadSpriteByIOByte(string fileurl)
  324. {
  325. //创建文件流
  326. FileStream fileStream = new FileStream(fileurl, FileMode.Open, FileAccess.Read);
  327. fileStream.Seek(0, SeekOrigin.Begin);
  328. //创建文件长度的缓冲区
  329. byte[] bytes = new byte[fileStream.Length];
  330. //读取文件
  331. fileStream.Read(bytes, 0, (int)fileStream.Length);
  332. //释放文件读取liu
  333. fileStream.Close();
  334. fileStream.Dispose();
  335. fileStream = null;
  336. return bytes;
  337. }
  338. /// <summary>
  339. /// C#按文件夹名称排序(顺序)
  340. /// </summary>
  341. /// <param name="dirs"></param>
  342. private static void OrderSortAsFolderName(ref DirectoryInfo[] dirs)
  343. {
  344. Array.Sort(dirs, delegate (DirectoryInfo x, DirectoryInfo y) { return x.Name.CompareTo(y.Name); });
  345. }
  346. /// <summary>
  347. /// C#按文件夹名称排序(倒序)
  348. /// </summary>
  349. /// <param name="dirs"></param>
  350. private static void ReverseSortAsFolderName(ref DirectoryInfo[] dirs)
  351. {
  352. Array.Sort(dirs, delegate (DirectoryInfo x, DirectoryInfo y) { return y.Name.CompareTo(x.Name); });
  353. }
  354. /// <summary>
  355. /// C#按文件夹夹创建时间排序(顺序)
  356. /// </summary>
  357. /// <param name="dirs"></param>
  358. private static void OrderSortAsFolderCreationTime(ref DirectoryInfo[] dirs)
  359. {
  360. Array.Sort(dirs, delegate (DirectoryInfo x, DirectoryInfo y) { return x.CreationTime.CompareTo(y.CreationTime); });
  361. }
  362. /// <summary>
  363. /// C#按文件夹创建时间排序(倒序)
  364. /// </summary>
  365. /// <param name="dirs"></param>
  366. private static void ReverseSortAsFolderCreationTime(ref DirectoryInfo[] dirs)
  367. {
  368. Array.Sort(dirs, delegate (DirectoryInfo x, DirectoryInfo y) { return y.CreationTime.CompareTo(x.CreationTime); });
  369. }
  370. /// <summary>
  371. /// C#按文件夹修改时间排序(顺序)
  372. /// </summary>
  373. /// <param name="dirs"></param>
  374. private static void OrderSortAsFolderLastWriteTime(ref DirectoryInfo[] dirs)
  375. {
  376. Array.Sort(dirs, delegate (DirectoryInfo x, DirectoryInfo y) { return x.CreationTime.CompareTo(y.LastWriteTime); });
  377. }
  378. /// <summary>
  379. /// C#按文件夹修改时间排序(倒序)
  380. /// </summary>
  381. /// <param name="dirs"></param>
  382. private static void ReverseSortAsFolderLastWriteTime(ref DirectoryInfo[] dirs)
  383. {
  384. Array.Sort(dirs, delegate (DirectoryInfo x, DirectoryInfo y) { return y.CreationTime.CompareTo(x.LastWriteTime); });
  385. }
  386. static double unit = 1024;
  387. /// <summary>
  388. /// 因为C#提供的文件的大小是以B为单位的,所以显示文件大小的时候会出现一大串数字很不方便
  389. /// 所以,该函数为了方便地显示文件大小而出现
  390. /// 函数说明,
  391. /// 如果文件大小是0-1024B 以内的 显示以B为单位
  392. /// 如果文件大小是1KB-1024KB之间的 显示以KB为单位
  393. /// 如果文件大小是1M-1024M之间的 显示以M为单位
  394. /// 如果文件大小是1024M以上的 显示以GB为单位
  395. /// </summary>
  396. /// <param name="lengthOfDocument"> 文件的大小 单位:B 类型:long</param>
  397. /// <returns></returns>
  398. public static string GetLength(long lengthOfDocument)
  399. {
  400. if (lengthOfDocument < unit)
  401. return string.Format(lengthOfDocument.ToString("f2") + 'B');
  402. else if (lengthOfDocument > unit && lengthOfDocument <= Math.Pow(unit, 2))
  403. return string.Format((lengthOfDocument / unit).ToString("f2") + "KB");
  404. else if (lengthOfDocument > Math.Pow(unit, 2) && lengthOfDocument <= Math.Pow(unit, 3))
  405. return string.Format((lengthOfDocument / unit / unit).ToString("f2") + "MB");
  406. else
  407. return string.Format((lengthOfDocument / unit / unit / unit).ToString("f2") + "GB");
  408. }
  409. /// <summary>该函数为了方便地显示数量格式化而出现
  410. /// 函数说明,
  411. /// 如果文件大小是0-1000 以内的 直接显示
  412. /// 如果文件大小是1K-1000K之间的 显示以K为单位
  413. /// 如果文件大小是1M-1000M之间的 显示以M为单位
  414. /// 如果文件大小是1000M以上的 显示以B为单位
  415. /// </summary>
  416. /// <param name="lengthOfDocument"> :1 类型:long</param>
  417. /// <returns></returns>
  418. public static string GetNumFormat(long lengthOfDocument)
  419. {
  420. if (lengthOfDocument < 1000)
  421. return string.Format(lengthOfDocument.ToString());
  422. else if (lengthOfDocument >= 1000 && lengthOfDocument < Math.Pow(1000, 2))
  423. {
  424. return string.Format((lengthOfDocument / 1000).ToString() + "K");
  425. }
  426. else if (lengthOfDocument >= Math.Pow(1000, 2) && lengthOfDocument < Math.Pow(1000, 3))
  427. return string.Format((lengthOfDocument / 1000 / 1000).ToString() + "M");
  428. else
  429. return string.Format((lengthOfDocument / 1000 / 1000 / 1000).ToString() + "B");
  430. }
  431. public static string GetVideoTime(long time)
  432. {
  433. string timeStr;
  434. if (time < 60)
  435. {
  436. timeStr = string.Format("00:{0:00}", time % 60);
  437. }
  438. else if (time < 3600)
  439. {
  440. timeStr = string.Format("{0}:", time / 60) + string.Format("{0}", time % 60);
  441. }
  442. else
  443. {
  444. timeStr = string.Format("{0}:", time / 3600) + string.Format("{0}:", (time % 3600) / 60) /*+ string.Format("{0}", time % 60)*/;
  445. }
  446. return timeStr;
  447. }
  448. public static string formatLongToTimeStr(long l)
  449. {
  450. // Debug.Log("");
  451. String str = "";
  452. int hour = 0;
  453. int minute = 0;
  454. int second = 0;
  455. second = (int)l / 1000;
  456. if (second > 60)
  457. {
  458. minute = second / 60;
  459. second = second % 60;
  460. }
  461. if (minute > 60)
  462. {
  463. hour = minute / 60;
  464. minute = minute % 60;
  465. }
  466. return (hour+ ":" + minute+ ":"
  467. + second );
  468. }
  469. // 时间戳 转换为时间
  470. public static string StampToDateTime(string timeStamp)
  471. {
  472. DateTime startTime = System.TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));//获取时间戳
  473. DateTime dt = startTime.AddSeconds(double.Parse(timeStamp));
  474. return dt.ToString("yyyy/MM/dd");//转化为日期时间
  475. }
  476. }