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);
}
}
}