263 lines
8.6 KiB
C#
263 lines
8.6 KiB
C#
#if UNITY_EDITOR
|
||
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using System.Security.Cryptography;
|
||
using System.Text;
|
||
using UnityEditor;
|
||
using UnityEngine;
|
||
|
||
/*
|
||
* 20211212
|
||
* 功能:主要用于分析各个文件的MD5 文件大小 最终保存到txt
|
||
* */
|
||
namespace Axibug
|
||
{
|
||
public class AddChild : ScriptableObject
|
||
{
|
||
public static bool isHotUpdate = true; //是否热更新版本
|
||
|
||
|
||
[MenuItem("Axibug/createVersion_Win64")]
|
||
static void createWindows64()
|
||
{
|
||
writeFileInfo(BuildTarget.StandaloneWindows64);
|
||
}
|
||
[MenuItem("Axibug/createVersion_Android")]
|
||
static void createAndroid()
|
||
{
|
||
writeFileInfo(BuildTarget.Android);
|
||
}
|
||
[MenuItem("Axibug/createVersion_IOS")]
|
||
static void createIOS()
|
||
{
|
||
writeFileInfo(BuildTarget.iOS);
|
||
}
|
||
|
||
|
||
|
||
public static void writeFileInfo(BuildTarget target)
|
||
{
|
||
string filePath = "";
|
||
|
||
//根据目标平台创建路径
|
||
switch (target)
|
||
{
|
||
//case BuildTarget.StandaloneWindows64:
|
||
// filePath = $"AssetBundles/StandaloneWindows64/";
|
||
// break;
|
||
//case BuildTarget.Android:
|
||
// filePath = $"AssetBundles/Android/";
|
||
// break;
|
||
//case BuildTarget.iOS:
|
||
// filePath = $"AssetBundles/IOS/";
|
||
// break;
|
||
case BuildTarget.StandaloneWindows64:
|
||
filePath = $"StandaloneWindows64";
|
||
break;
|
||
case BuildTarget.Android:
|
||
filePath = $"Android";
|
||
break;
|
||
case BuildTarget.iOS:
|
||
filePath = $"IOS";
|
||
break;
|
||
}
|
||
|
||
writeFileInfo(filePath);
|
||
}
|
||
|
||
|
||
public static string computeMd5(string filename)
|
||
{
|
||
string filemd5 = null;
|
||
try
|
||
{
|
||
using (var fileStream = File.OpenRead(filename))
|
||
{
|
||
var md5 = MD5.Create();
|
||
var fileMD5Bytes = md5.ComputeHash(fileStream);//计算指定Stream 对象的哈希值
|
||
filemd5 = FormatMD5(fileMD5Bytes);
|
||
}
|
||
}
|
||
catch (System.Exception ex)
|
||
{
|
||
|
||
}
|
||
return filemd5;
|
||
}
|
||
|
||
//字节数组转为字符串
|
||
public static string FormatMD5(byte[] data)
|
||
{
|
||
return System.BitConverter.ToString(data).Replace("-", "").ToLower();//将byte[]装换成字符串
|
||
}
|
||
|
||
public static void writeFileInfo(string targetPath)
|
||
{
|
||
string projectPath = System.Environment.CurrentDirectory;
|
||
string fullPath = $"{projectPath}/AssetBundles/{targetPath}/";
|
||
|
||
string path = fullPath + "/version.txt";
|
||
if (File.Exists(path))
|
||
File.Delete(path);
|
||
|
||
int totalSize = 0;
|
||
//获取指定路径下面的所有资源文件
|
||
if (Directory.Exists(fullPath))
|
||
{
|
||
DirectoryInfo direction = new DirectoryInfo(fullPath);
|
||
FileInfo[] files = direction.GetFiles("*", SearchOption.AllDirectories);
|
||
|
||
//文件列表
|
||
FileList list = new FileList();
|
||
list.listinfo = new List<FileData>();
|
||
|
||
writeLoginSeverInfo(list);
|
||
|
||
Debug.Log(files.Length);
|
||
|
||
for (int i = 0; i < files.Length; i++)
|
||
{
|
||
if (files[i].Name.EndsWith(".meta")/* || files[i].Name.EndsWith(".txt")*/)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
string md5 = computeMd5(files[i].FullName);
|
||
string[] condition = { $"{targetPath}\\" };
|
||
string[] arr = files[i].FullName.Split(condition, StringSplitOptions.None);
|
||
if (arr.Length != 2)
|
||
continue;
|
||
|
||
string filepath = arr[1].Replace("\\", "/");
|
||
FileData jd = new FileData();
|
||
jd.filename = filepath;
|
||
jd.hash = md5;
|
||
jd.length = (int)files[i].Length;
|
||
totalSize += jd.length;
|
||
|
||
list.listinfo.Add(jd);
|
||
}
|
||
|
||
//回写总大小
|
||
list.listinfo[1].length = totalSize;
|
||
|
||
Debug.Log("list.listinfo:" + list.listinfo.Count);
|
||
|
||
|
||
|
||
//写入jscon文件
|
||
string str = JsonUtility.ToJson(list);
|
||
File.AppendAllText(path, str);
|
||
|
||
Debug.Log("生成version成功..." + list.listinfo.Count);
|
||
}
|
||
}
|
||
|
||
//写入登录服务器配置信息
|
||
private static void writeLoginSeverInfo(FileList list)
|
||
{
|
||
//0 写入送检版本号
|
||
FileData d = new FileData();
|
||
d.filename = "versionCheck";
|
||
if (isHotUpdate)
|
||
d.hash = "9.9.9";
|
||
else
|
||
d.hash = Application.version;
|
||
d.length = 0;
|
||
list.listinfo.Add(d);
|
||
|
||
//1 写入当前版本号
|
||
FileData d2 = new FileData();
|
||
d2.filename = "version.txt";
|
||
d2.hash = Application.version;
|
||
d2.length = 0;
|
||
list.listinfo.Add(d2);
|
||
|
||
string src = "DE,130,20180408,testcode,113.250.55.88:15100";
|
||
string str1 = ToEncrypt("1981", src);
|
||
//2 配置登录服务器IP PORT
|
||
FileData d3 = new FileData();
|
||
d3.filename = "loginServer";
|
||
d3.hash = str1;
|
||
d3.length = 0;
|
||
list.listinfo.Add(d3);
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
//对字符串进行加密
|
||
static string ToEncrypt(string encryptKey, string str)
|
||
{
|
||
try
|
||
{
|
||
byte[] P_byte_key = Encoding.Unicode.GetBytes(encryptKey);//将密钥字符串转换为字节序列
|
||
byte[] P_byte_data = Encoding.Unicode.GetBytes(str); //将字符串转换为字节序列
|
||
MemoryStream P_Stream_MS = new MemoryStream();//创建内存流对象
|
||
{
|
||
using (CryptoStream P_CryptStream_Stream = new CryptoStream(P_Stream_MS, new DESCryptoServiceProvider().CreateEncryptor(P_byte_key, P_byte_key), CryptoStreamMode.Write))
|
||
{
|
||
P_CryptStream_Stream.Write(P_byte_data, 0, P_byte_data.Length);//向加密流中写入字节序列
|
||
P_CryptStream_Stream.FlushFinalBlock();//将数据压入基础流
|
||
byte[] P_bt_temp = P_Stream_MS.ToArray();//从内存流中获取字节序列
|
||
return Convert.ToBase64String(P_bt_temp);
|
||
}
|
||
}
|
||
|
||
}
|
||
catch (CryptographicException ce)
|
||
{
|
||
throw new Exception(ce.Message);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
[MenuItem("Axibug/Create ClassTypes")]
|
||
public static void FindAllUnityClass()
|
||
{
|
||
EditorUtility.DisplayProgressBar("Progress", "Find Class...", 0);
|
||
string[] dirs = { "Assets/Resources/Prefabs" };
|
||
var asstIds = AssetDatabase.FindAssets("t:Prefab", dirs);
|
||
int count = 0;
|
||
List<string> classList = new List<string>();
|
||
for (int i = 0; i < asstIds.Length; i++)
|
||
{
|
||
string path = AssetDatabase.GUIDToAssetPath(asstIds[i]);
|
||
var pfb = AssetDatabase.LoadAssetAtPath<GameObject>(path);
|
||
foreach (Transform item in pfb.transform)
|
||
{
|
||
var coms = item.GetComponentsInChildren<Component>();
|
||
foreach (var com in coms)
|
||
{
|
||
string tName = com.GetType().FullName;
|
||
if (!classList.Contains(tName)/* && tName.StartsWith("UnityEngine")*/)
|
||
{
|
||
classList.Add(tName);
|
||
}
|
||
}
|
||
}
|
||
count++;
|
||
EditorUtility.DisplayProgressBar("Find Class", pfb.name, count / (float)asstIds.Length);
|
||
}
|
||
for (int i = 0; i < classList.Count; i++)
|
||
{
|
||
classList[i] = string.Format("<type fullname=\"{0}\" preserve=\"all\"/>", classList[i]);
|
||
}
|
||
System.IO.File.WriteAllLines(Application.dataPath + "/ClassTypes.txt", classList);
|
||
EditorUtility.ClearProgressBar();
|
||
}
|
||
}
|
||
}
|
||
|
||
#endif
|
||
|
||
|
||
|
||
|