254 lines
8.2 KiB
C#
254 lines
8.2 KiB
C#
using UnityEngine;
|
|
using UnityEditor;
|
|
using System;
|
|
using UnityEditor.IMGUI.Controls;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
|
|
//public abstract class BaseWindow
|
|
//{
|
|
|
|
//}
|
|
namespace WeChatWASM.Analysis
|
|
{
|
|
public class BaseWindow<T> where T : class, new()
|
|
{
|
|
//private AssetDataTable m_table;
|
|
Vector2 assetListScrollPosition = Vector2.zero;
|
|
|
|
float splitterPos = 1000;
|
|
Rect splitterRect;
|
|
float splitterWidth = 5;
|
|
bool dragging;
|
|
|
|
Vector2 refrenceListScrollPostion = Vector2.zero;
|
|
|
|
public EditorWindow win;
|
|
|
|
public string currentFolder;
|
|
public Boolean needRefreshCurrentFolder;
|
|
|
|
public string[] currentAssetPathList;
|
|
public AssetTreeView assetTreeView;
|
|
public List<string> selectedAssetGuid = new List<string>();
|
|
public static ReferenceFinderData assetRefrenceDatas = new ReferenceFinderData();
|
|
public Boolean initializedRefrenceData = false;
|
|
|
|
public TreeViewState treeViewState;
|
|
|
|
// 是否需要刷新扫描结果
|
|
public Boolean needUpdateMainContent = false;
|
|
// 是否更新资源引用结果
|
|
public Boolean needUpdateAssetTree = false;
|
|
|
|
// 单例
|
|
public static T instance;
|
|
public static readonly object locker = new object();
|
|
|
|
public BaseWindow()
|
|
{
|
|
win = AnalysisWindow.GetCurrentWindow();
|
|
|
|
if (!initializedRefrenceData)
|
|
{
|
|
if (!assetRefrenceDatas.ReadFromCache())
|
|
{
|
|
assetRefrenceDatas.CollectDependenciesInfo();
|
|
}
|
|
initializedRefrenceData = true;
|
|
}
|
|
}
|
|
|
|
public static T GetInstance()
|
|
{
|
|
lock (locker)
|
|
{
|
|
if (instance == null)
|
|
{
|
|
instance = new T();
|
|
}
|
|
}
|
|
return instance;
|
|
}
|
|
|
|
public void Show()
|
|
{
|
|
GUILayout.BeginHorizontal();
|
|
|
|
DrawOptionBtn();
|
|
DrawMainContent();
|
|
DrawSplitter();
|
|
DrawReferenceLayout();
|
|
|
|
GUILayout.EndHorizontal();
|
|
}
|
|
|
|
public void DrawOptionBtn()
|
|
{
|
|
GUILayout.BeginVertical();
|
|
|
|
DrawOptionArea();
|
|
|
|
GUILayout.EndVertical();
|
|
}
|
|
|
|
public virtual void DrawOptionArea()
|
|
{
|
|
|
|
}
|
|
|
|
public string GetCurrentFolder()
|
|
{
|
|
string path = "Assets";
|
|
|
|
foreach (UnityEngine.Object obj in Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets))
|
|
{
|
|
path = AssetDatabase.GetAssetPath(obj);
|
|
if (!string.IsNullOrEmpty(path) && File.Exists(path))
|
|
{
|
|
path = Path.GetDirectoryName(path);
|
|
break;
|
|
}
|
|
}
|
|
return path;
|
|
}
|
|
|
|
public void DrawMainContent()
|
|
{
|
|
assetListScrollPosition = GUILayout.BeginScrollView(assetListScrollPosition, GUILayout.Width(splitterPos), GUILayout.MinWidth(splitterPos), GUILayout.MaxWidth(splitterPos));
|
|
RefreshTable();
|
|
GUILayout.EndScrollView();
|
|
}
|
|
|
|
public virtual void RefreshTable()
|
|
{
|
|
}
|
|
|
|
public void DrawSplitter()
|
|
{
|
|
// splitter
|
|
GUILayout.Box("",
|
|
GUILayout.Width(splitterWidth),
|
|
GUILayout.MaxWidth(splitterWidth),
|
|
GUILayout.MinWidth(splitterWidth),
|
|
GUILayout.ExpandHeight(true));
|
|
splitterRect = GUILayoutUtility.GetLastRect();
|
|
|
|
if (Event.current != null)
|
|
{
|
|
switch (Event.current.rawType)
|
|
{
|
|
case EventType.MouseDown:
|
|
if (splitterRect.Contains(Event.current.mousePosition))
|
|
{
|
|
dragging = true;
|
|
}
|
|
break;
|
|
case EventType.MouseDrag:
|
|
if (dragging)
|
|
{
|
|
splitterPos += Event.current.delta.x;
|
|
win.Repaint();
|
|
}
|
|
break;
|
|
case EventType.MouseUp:
|
|
if (dragging)
|
|
{
|
|
dragging = false;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void DrawReferenceLayout()
|
|
{
|
|
GUILayout.BeginVertical();
|
|
if (GUILayout.Button("检查依赖", GUILayout.Width(160), GUILayout.Height(40)))
|
|
{
|
|
if (currentAssetPathList.Length > 0)
|
|
{
|
|
selectedAssetGuid.Clear();
|
|
selectedAssetGuid.Add(AssetDatabase.AssetPathToGUID(currentAssetPathList[0]));
|
|
needUpdateAssetTree = true;
|
|
}
|
|
}
|
|
var btnRect = GUILayoutUtility.GetLastRect();
|
|
|
|
// asset reference
|
|
var scrollViewWidth = win.position.width - splitterRect.xMax;
|
|
var scrollViewY = btnRect.yMax + 5;
|
|
|
|
refrenceListScrollPostion = GUILayout.BeginScrollView(refrenceListScrollPostion, GUILayout.Width(scrollViewWidth), GUILayout.MinWidth(scrollViewWidth), GUILayout.MaxWidth(scrollViewWidth), GUILayout.ExpandHeight(true));
|
|
UpdateAssetTree();
|
|
if (assetTreeView != null)
|
|
{
|
|
var rect = GUILayoutUtility.GetRect(0f, Screen.width, 0f, Screen.height);
|
|
if (Event.current.type != EventType.Layout)
|
|
{
|
|
assetTreeView.OnGUI(rect);
|
|
}
|
|
}
|
|
GUILayout.EndScrollView();
|
|
|
|
GUILayout.EndVertical();
|
|
}
|
|
|
|
public void UpdateAssetTree()
|
|
{
|
|
if (needUpdateAssetTree && selectedAssetGuid.Count != 0)
|
|
{
|
|
var root = SelectedAssetGuidToRootItem(selectedAssetGuid);
|
|
if (assetTreeView == null)
|
|
{
|
|
if (treeViewState == null)
|
|
{
|
|
treeViewState = new TreeViewState();
|
|
}
|
|
var headerState = AssetTreeView.CreateDefaultMultiColumnHeaderState(win.position.width - splitterRect.x);
|
|
var multiColumnHeader = new MultiColumnHeader(headerState);
|
|
assetTreeView = new AssetTreeView(treeViewState, multiColumnHeader);
|
|
}
|
|
assetTreeView.assetRoot = root;
|
|
assetTreeView.CollapseAll();
|
|
assetTreeView.Reload();
|
|
needUpdateAssetTree = false;
|
|
}
|
|
}
|
|
|
|
//生成root相关
|
|
private HashSet<string> updatedAssetSet = new HashSet<string>();
|
|
//通过选择资源列表生成TreeView的根节点
|
|
private AssetViewItem SelectedAssetGuidToRootItem(List<string> selectedAssetGuid)
|
|
{
|
|
updatedAssetSet.Clear();
|
|
int elementCount = 0;
|
|
var root = new AssetViewItem { id = elementCount, depth = -1, displayName = "Root", data = null };
|
|
int depth = 0;
|
|
foreach (var childGuid in selectedAssetGuid)
|
|
{
|
|
root.AddChild(CreateTree(childGuid, ref elementCount, depth));
|
|
}
|
|
updatedAssetSet.Clear();
|
|
return root;
|
|
}
|
|
//通过每个节点的数据生成子节点
|
|
private AssetViewItem CreateTree(string guid, ref int elementCount, int _depth)
|
|
{
|
|
if (!updatedAssetSet.Contains(guid))
|
|
{
|
|
assetRefrenceDatas.UpdateAssetState(guid);
|
|
updatedAssetSet.Add(guid);
|
|
}
|
|
++elementCount;
|
|
var referenceData = assetRefrenceDatas.assetDict[guid];
|
|
var root = new AssetViewItem { id = elementCount, displayName = referenceData.name, data = referenceData, depth = _depth };
|
|
var childGuids = referenceData.references;
|
|
foreach (var childGuid in childGuids)
|
|
{
|
|
root.AddChild(CreateTree(childGuid, ref elementCount, _depth + 1));
|
|
}
|
|
return root;
|
|
}
|
|
}
|
|
} |