using System; using System.Collections.Generic; using System.IO; using System.Linq; using UnityEngine; namespace NBC.Asset.Editor { [Serializable] public class HistoryData { public int Index; public List Bundles = new List(); } [Serializable] public class HistoriesData { private int _historyCount = 5; public List Histories = new List(); public HistoryData LastHistoryData => Histories.Last(); public int LastIndex { get { var index = 0; if (Histories.Count > 0) { index = Histories[^1].Index; } return index; } } public bool AddHistory(List bundles) { var data = new HistoryData(); foreach (var bundle in bundles) { var b = new BuildBundle { Name = bundle.Name, Hash = bundle.Hash, Size = bundle.Size }; data.Bundles.Add(b); } if (CanAdd(data)) { data.Index = LastIndex + 1; Histories.Add(data); } if (Histories.Count > _historyCount) { var count = Histories.Count - _historyCount; for (int i = 0; i < count; i++) { Histories.RemoveAt(0); } } return true; } public bool CanAdd(HistoryData data) { var changes = new List(); if (Histories.Count > 0 && Histories.Last() != null) { var last = Histories.Last(); foreach (var bundle in data.Bundles) { var old = last.Bundles.Find(t => t.Name == bundle.Name); if (old != null) { if (old.Size != bundle.Size || old.Hash != bundle.Hash) { changes.Add(bundle); } } else changes.Add(bundle); } } else { changes.AddRange(data.Bundles); } return changes.Count > 0; } } public static class Histories { private static readonly string FilePath = BuildSettings.GetCachePath("BuildHistories.json"); private static HistoriesData _data; public static HistoryData LastHistoryData => _data != null ? _data.LastHistoryData : null; public static void AddHistory(List bundles) { if (_data == null) { Reload(); } if (_data != null && _data.AddHistory(bundles)) { Save(); } else { Debug.LogError("添加历史记录失败!"); } } public static void Reload() { _data = Util.ReadJson(FilePath) ?? new HistoriesData(); } public static void Save() { if (_data != null) { Util.WriteJson(_data, FilePath); } } public static VersionData GetLastVersion() { if (!Directory.Exists(BuildSettings.PlatformPath)) { return null; } var files = Directory.GetFiles(BuildSettings.PlatformPath); List paths = new List(); foreach (var file in files) { var name = Path.GetFileName(file); if (name.StartsWith("version")) paths.Add(file); } var lastFilePath = string.Empty; if (paths.Count > 0) { long lastCreationTime = 0; foreach (var path in paths) { var file = new FileInfo(path); if (file.Exists) { var t = file.CreationTime.ToFileTime(); if (t > lastCreationTime) { lastCreationTime = t; lastFilePath = path; } } } } if (!string.IsNullOrEmpty(lastFilePath)) { return Util.ReadJson(lastFilePath); } return null; } } }