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