using System.Collections.Generic; using System.IO; using System.Linq; using TyphoonGUIStyle; using UnityEditor; using UnityEngine; namespace TyphoonUI { [CustomEditor(typeof(UIPackage))] public class UIPackageEditor : Editor { private UIPackage Self => target as UIPackage; private Vector2 _scroll; private bool _foldout = true; public override void OnInspectorGUI() { base.OnInspectorGUI(); if (!string.IsNullOrEmpty(Self.ErrorString)) { GUILayout.Label(new GUIContent(Self.ErrorString, Styles.IconError), Styles.HelpBox); } if (GUILayout.Button("更新Package", Styles.BtnBlue, GUILayout.Height(26))) { UpdatePackage(Self); } GUILayout.Space(10); var rectTitle = GUIDrawer.DrawTitleLabel("资源导出项", GUILayout.Height(24)); var rectFoldout = rectTitle; rectFoldout.width = 60; rectFoldout.height -= 8; rectFoldout.center = rectTitle.center; rectFoldout.x = rectTitle.xMax - rectFoldout.width - 8; if (GUI.Button(rectFoldout, _foldout ? "收起" : "展开")) { _foldout = !_foldout; } if (_foldout) { GUILayout.BeginScrollView(_scroll); var components = Self.Components; if (components != null) { var no = 0; foreach (var element in components) { no += 1; if (element == null) { continue; } GUILayout.BeginHorizontal(); GUILayout.Label(no.ToString(), Styles.TitleBar, GUILayout.Width(66), GUILayout.Height(22)); var icon = AssetDatabase.GetCachedIcon(AssetDatabase.GetAssetPath(element)); if (GUILayout.Button(new GUIContent(element.name, icon), Styles.TitleBar, GUILayout.Height(22))) { TyphoonUIEditor.PingObject(element); } GUILayout.EndHorizontal(); } } GUILayout.EndScrollView(); } Repaint(); } /// /// 计算package资源 /// public static List CalculatePackageComponents(UIPackage package, out string error) { error = ""; var hash = new HashSet(); var objectsOfPacking = package.ObjectsOfPacking; var folder = new HashSet(); foreach (var element in objectsOfPacking) { if (element == null) { continue; } if (element is GameObject) { hash.Add(element as GameObject); continue; } var path = AssetDatabase.GetAssetPath(element); if (Directory.Exists(path)) { folder.Add(path); } } if (folder.Count > 0) { var guids = AssetDatabase.FindAssets("t:prefab", folder.ToArray()); foreach (var guid in guids) { var path = AssetDatabase.GUIDToAssetPath(guid); var obj = AssetDatabase.LoadAssetAtPath(path); if (obj != null) { hash.Add(obj); } } } //检查同名资源 var warnGroups = hash.GroupBy(e => e.name).Where(e => e.Count() > 1).ToList(); if (warnGroups.Count > 0) { foreach (var item in warnGroups) { error = $"[ERROR][UIPackage][{package.name}] 出现同名资源 {item.Key}"; Debug.LogError(error); } } package.ErrorString = error; return hash.ToList(); } /// /// 包资源需要更新 /// /// public static bool PackageIsChanged(UIPackage package) { var current = CalculatePackageComponents(package, out _); return !current.SequenceEqual(package.Components); } /// /// 更新资源包 /// public static void UpdatePackage(UIPackage package) { var current = CalculatePackageComponents(package, out _); if (current.SequenceEqual(package.Components)) { //元素相同,不更新 return; } //更新元素 package.Components = current; EditorUtility.SetDirty(package); AssetDatabase.SaveAssets(); } } }