summaryrefslogtreecommitdiff
path: root/AssetBrowser.cs
diff options
context:
space:
mode:
Diffstat (limited to 'AssetBrowser.cs')
-rw-r--r--AssetBrowser.cs240
1 files changed, 113 insertions, 127 deletions
diff --git a/AssetBrowser.cs b/AssetBrowser.cs
index 3049f5b..cf62ffa 100644
--- a/AssetBrowser.cs
+++ b/AssetBrowser.cs
@@ -1,15 +1,9 @@
-/////////////////////////////////////////////////////////////////////////////////
-//
-// author: chaifeixiang
-// date: 2018.5.20
-// desc: Unity中找文件依赖关系的编辑器工具,需要Unity5.4及以上版本
-//
-//
-//
-//
-//
-/////////////////////////////////////////////////////////////////////////////////
-
+///////////////////////////////////////////////////
+// author: chai
+// email: chaifix@163.com
+//
+// Send me email if you have any ideas or problems.
+///////////////////////////////////////////////////
using UnityEditor;
using UnityEngine;
using System;
@@ -20,8 +14,6 @@ using Object = UnityEngine.Object;
class AssetData
{
- // 枚举值为遍历的优先级,用于AssetData.Dependcies和AssetDataManager.Assets
- // 必须是紧凑的索引
public enum AssetType
{
Scene = 0,
@@ -38,16 +30,17 @@ class AssetData
Unknown = 255,
}
-
+
+ // for sorting in same asset type situation
public enum SubType
{
// Texture
- png = 0,
- jpg,
- bmp,
+ png = 0,
+ jpg,
+ bmp,
// Mesh
- fbx,
- FBX,
+ fbx,
+ FBX,
//
Unknown = 255,
}
@@ -90,7 +83,7 @@ class AssetData
DiskSizeStr = EditorUtility.FormatBytes(DiskSize);
}
- #region 资源属性
+ #region asset properties
public string GUID;
public string Name;
public int RefCount = 0;
@@ -155,16 +148,16 @@ class AssetDataManager
Assets[i] = new Dictionary<string, AssetData>();
}
- #region Asset字典
- // 所有资源
+ #region Asset Dictionary
+ // all assets
public Dictionary<string, AssetData> AllAssets = new Dictionary<string, AssetData>();
- // 分类统计
+ // assets by type
public Dictionary<string, AssetData>[] Assets = new Dictionary<string, AssetData>[(int)AssetData.AssetType.TypeCount];
- // 反向依赖
+ // reverse reference
public Dictionary<string, List<string>> AssetsReverse = new Dictionary<string, List<string>>();
#endregion
- #region 过滤
+ #region file extensions
public static List<string> ValidExtension = new List<string>
{
".unity", // scene
@@ -363,7 +356,7 @@ class Drawer
GUI.skin.label.normal.textColor = drawColor;
}
- #region 配置项
+ #region configuration
public Color ColorHeavy = new Color(0.2f, 0.2f, 0.2f);
public Color ColorLight = new Color(0.3f, 0.3f, 0.3f);
public GUIStyle SelectorButtonStyle;
@@ -372,12 +365,12 @@ class Drawer
public GUIStyle MidAlignment;
#endregion
- #region 状态
+ #region draw state
private Color drawColor = new Color();
#endregion
}
-// 文件树
+// file tree
class FileTree
{
public class Node
@@ -387,9 +380,9 @@ class FileTree
GUID = guid;
Foldout = false;
}
- public bool Foldout; // 是否展开
+ public bool Foldout; // fold out or not
public string GUID; // GUID
- public List<Node> Children = new List<Node>(); // 子节点
+ public List<Node> Children = new List<Node>(); // sub node
}
public List<Node> root = new List<Node>();
@@ -400,29 +393,29 @@ class AssetBrowser : EditorWindow
private static AssetBrowser editor;
private static Drawer drawer;
- #region 目录
+ #region file tree
private FileTree assetsTree = new FileTree();
- private FileTree assetsTreeBuffer = new FileTree();
+ private FileTree assetsTreeBuffer = new FileTree();
#endregion
- #region GUI 组件配置数值
+ #region GUI configurations
private Rect window = new Rect();
private int contentWidth = 1600;
private int contentHeight = 1000;
- private readonly int kLineHeight = 20; // 行高
+ private readonly int kLineHeight = 20; // line height
private Vector2 scrollPos = new Vector2(0, 0);
- private int directoryOffsetY = 5; // 资源目录Y偏移度
- private int filtersOffsetY = 27; // 过滤器Y偏移度
- private int headerOffsetY = 50; // 标题Y偏移度
- private int assetsTreeOffsetY = 70; // 列表偏移度
+ private int directoryOffsetY = 5; // assets tree y offset
+ private int filtersOffsetY = 27; // filters y offset
+ private int headerOffsetY = 50; // header y offset
+ private int assetsTreeOffsetY = 70; // list y offset
private int kTabWidth = 13;
#endregion
- #region 数据
+ #region data
private FileTree.Node selectedNode = null;
#endregion
- #region 过滤器
+ #region filters
private string filterdirectory = "";
private string filterFile = "";
private bool filterScene = false;
@@ -436,17 +429,16 @@ class AssetBrowser : EditorWindow
private bool filterCSV = false;
#endregion
- #region 排序
+ #region sort
private enum OrderBase
{
- Name,
- Ref,
- RevRef,
- Type,
- DiskSize,
+ Name,
+ Ref,
+ RevRef,
+ Type,
+ DiskSize,
Path
}
- // 排序依据
private OrderBase orderBase = OrderBase.Path;
private int orderName = 1;
private int orderRef = 1;
@@ -466,32 +458,32 @@ class AssetBrowser : EditorWindow
private enum Colum
{
- Name, // 资源名
- Ref, // 引用数
- RevRef, // 被引用数
- Type, // 资源类型
- DiskSize, // 硬盘大小
- Path, // 资源路径
+ Name, // Asset Name
+ Ref, // Reference Count
+ RevRef, // Referenced Count
+ Type, // Asset Type
+ DiskSize, // Asset's Disk Size
+ Path, // Location
}
private Dictionary<Colum, string> ColumHeader = new Dictionary<Colum, string>
{
- {Colum.Name, "资源引用关系"},
- {Colum.Ref, "引用数"},
- {Colum.RevRef, "被引用数"},
- {Colum.Type, "资源类型"},
- {Colum.DiskSize, "硬盘大小"},
- {Colum.Path, "资源路径"},
+ {Colum.Name, "Asset Name"},
+ {Colum.Ref, "Reference Count"},
+ {Colum.RevRef, "Referenced Count"},
+ {Colum.Type, "Asset Type"},
+ {Colum.DiskSize, "Disk Size"},
+ {Colum.Path, "Location"},
};
private Dictionary<Colum, int> ColumWidth = new Dictionary<Colum, int>
{
- {Colum.Name, 450},
- {Colum.Ref, 70},
- {Colum.RevRef, 70},
- {Colum.Type, 70},
- {Colum.DiskSize, 70},
- {Colum.Path, 870},
+ {Colum.Name, 500},
+ {Colum.Ref, 100},
+ {Colum.RevRef, 100},
+ {Colum.Type, 100},
+ {Colum.DiskSize, 100},
+ {Colum.Path, 700},
};
private Dictionary<Colum, int> ColumOffsetX = null;
@@ -513,22 +505,19 @@ class AssetBrowser : EditorWindow
{
window = editor.position;
}
-
+
public void OnGUI()
{
- // 调试
if (editor == null)
editor = GetWindow<AssetBrowser>();
if (drawer == null)
- drawer = Drawer.Get();
+ drawer = Drawer.Get();
AdjustColumOffsetX();
AdjustWindow();
BeginScrollView();
- // 绘制工具栏
OnToolset();
- // 绘制资源列表
OnAsset();
EndScrollView();
}
@@ -555,11 +544,11 @@ class AssetBrowser : EditorWindow
Rect dragRect = new Rect(0, offsetY, 1000, 20);
string olddirectory = filterdirectory;
- drawer.DrawLabel(new Rect(0, offsetY, 95, kLineHeight), "资源目录 Assets\\");
- drawer.DrawTextfield(new Rect(95, offsetY, 250, kLineHeight), filterdirectory, ref filterdirectory);
+ drawer.DrawLabel(new Rect(0, offsetY, 105, kLineHeight), "Directory Assets\\");
+ drawer.DrawTextfield(new Rect(105, offsetY, 250, kLineHeight), filterdirectory, ref filterdirectory);
if (filterdirectory == null)
filterdirectory = "";
- // 拖拽
+ // drag
Event e = Event.current;
if (dragRect.Contains(e.mousePosition))
{
@@ -588,12 +577,12 @@ class AssetBrowser : EditorWindow
if (filterdirectory != olddirectory)
ProcessTreeBuffer();
bool load;
- drawer.DrawButton(new Rect(350, offsetY, 50, kLineHeight), "载入", out load);
+ drawer.DrawButton(new Rect(360, offsetY, 50, kLineHeight), "Load", out load);
if (load)
{
ProcessAssets();
ProcessTree();
- EditorUtility.DisplayDialog("载入完毕", "载入完毕", "确定");
+ EditorUtility.DisplayDialog("Load done", "Load done", "OK");
}
}
@@ -608,33 +597,33 @@ class AssetBrowser : EditorWindow
bool oldfilterTexture = filterTexture;
bool oldfilterShader = filterShader;
bool oldfilterScript = filterScript;
- bool oldfilterCSV = filterCSV;
- // 文件匹配
- drawer.DrawLabel(new Rect(0, filtersOffsetY + scrollPos.y, 100, kLineHeight), "匹配文件");
- drawer.DrawTextfield(new Rect(50, filtersOffsetY + scrollPos.y, 150, kLineHeight), filterFile, ref filterFile);
- // 类型过滤
+ bool oldfilterCSV = filterCSV;
+ // match file
+ drawer.DrawLabel(new Rect(0, filtersOffsetY + scrollPos.y, 100, kLineHeight), "Match Files");
+ drawer.DrawTextfield(new Rect(67, filtersOffsetY + scrollPos.y, 150, kLineHeight), filterFile, ref filterFile);
+ // type filter
float offsetX = 250;
float offsetY = filtersOffsetY + scrollPos.y;
int width = 70;
- drawer.DrawCheckBox(new Rect(offsetX, offsetY, width, kLineHeight), "场景", filterScene, ref filterScene);
+ drawer.DrawCheckBox(new Rect(offsetX, offsetY, width, kLineHeight), "Scene", filterScene, ref filterScene);
drawer.DrawCheckBox(new Rect(offsetX + width, offsetY, width, kLineHeight), "Prefab", filterPrefab, ref filterPrefab);
- drawer.DrawCheckBox(new Rect(offsetX + width * 2, offsetY, width, kLineHeight), "材质", filterMaterial, ref filterMaterial);
+ drawer.DrawCheckBox(new Rect(offsetX + width * 2, offsetY, width, kLineHeight), "Material", filterMaterial, ref filterMaterial);
drawer.DrawCheckBox(new Rect(offsetX + width * 3, offsetY, width, kLineHeight), "Asset", filterAsset, ref filterAsset);
drawer.DrawCheckBox(new Rect(offsetX + width * 4, offsetY, width, kLineHeight), "Mesh", filterMesh, ref filterMesh);
- drawer.DrawCheckBox(new Rect(offsetX + width * 5, offsetY, width, kLineHeight), "贴图", filterTexture, ref filterTexture);
+ drawer.DrawCheckBox(new Rect(offsetX + width * 5, offsetY, width, kLineHeight), "Texture", filterTexture, ref filterTexture);
drawer.DrawCheckBox(new Rect(offsetX + width * 6, offsetY, width, kLineHeight), "Shader", filterShader, ref filterShader);
- drawer.DrawCheckBox(new Rect(offsetX + width * 7, offsetY, width, kLineHeight), "脚本", filterScript, ref filterScript);
+ drawer.DrawCheckBox(new Rect(offsetX + width * 7, offsetY, width, kLineHeight), "Script", filterScript, ref filterScript);
drawer.DrawCheckBox(new Rect(offsetX + width * 8, offsetY, width, kLineHeight), "CSV", filterCSV, ref filterCSV);
- // 刷新TreeBuffer
- if( oldfilterfile != filterFile ||
- oldfilterScene != filterScene||
- oldfilterPrefab != filterPrefab||
- oldfilterMaterial != filterMaterial||
- oldfilterAsset != filterAsset||
- oldfilterMesh != filterMesh||
- oldfilterTexture != filterTexture||
- oldfilterShader != filterShader||
- oldfilterScript != filterScript||
+ // refresh tree buffer
+ if (oldfilterfile != filterFile ||
+ oldfilterScene != filterScene ||
+ oldfilterPrefab != filterPrefab ||
+ oldfilterMaterial != filterMaterial ||
+ oldfilterAsset != filterAsset ||
+ oldfilterMesh != filterMesh ||
+ oldfilterTexture != filterTexture ||
+ oldfilterShader != filterShader ||
+ oldfilterScript != filterScript ||
oldfilterCSV != filterCSV
)
ProcessTreeBuffer();
@@ -678,7 +667,7 @@ class AssetBrowser : EditorWindow
drawer.DrawButtonMid(new Rect(ColumOffsetX[Colum.Type], headerOffsetY + scrollY, ColumWidth[Colum.Type], kLineHeight), ColumHeader[Colum.Type], out clickType);
drawer.DrawButtonMid(new Rect(ColumOffsetX[Colum.DiskSize], headerOffsetY + scrollY, ColumWidth[Colum.DiskSize], kLineHeight), ColumHeader[Colum.DiskSize], out clickDiskSize);
drawer.DrawButtonMid(new Rect(ColumOffsetX[Colum.Path], headerOffsetY + scrollY, ColumWidth[Colum.Path], kLineHeight), ColumHeader[Colum.Path], out clickPath);
- if(clickName)
+ if (clickName)
{
orderBase = OrderBase.Name;
orderName = -orderName;
@@ -731,7 +720,7 @@ class AssetBrowser : EditorWindow
AssetDataManager assetDataManager = AssetDataManager.Get();
if (!assetDataManager.AllAssets.TryGetValue(node.GUID, out asset))
return false;
- // 文件类型过滤
+ // type
if (asset.FileType == AssetData.AssetType.Scene && !filterScene) return false;
else if (asset.FileType == AssetData.AssetType.Prefab && !filterPrefab) return false;
else if (asset.FileType == AssetData.AssetType.Material && !filterMaterial) return false;
@@ -741,17 +730,16 @@ class AssetBrowser : EditorWindow
else if (asset.FileType == AssetData.AssetType.Script && !filterScript) return false;
else if (asset.FileType == AssetData.AssetType.Shader && !filterShader) return false;
else if (asset.FileType == AssetData.AssetType.Texture && !filterTexture) return false;
- // 文件路径
+ // directory
if (asset.AssetPath.IndexOf(filterdirectory) == -1)
return false;
- // 文件名
+ // asset name
if (asset.Name.IndexOf(filterFile) == -1)
return false;
return true;
}
- // 按照深度绘制
private void DrawNode(FileTree.Node node, int hierachy, ref int count)
{
++count;
@@ -765,7 +753,6 @@ class AssetBrowser : EditorWindow
}
}
- // 绘制单个
private void DrawAssetInfo(FileTree.Node node, int hierachy, int index)
{
Drawer drawer = Drawer.Get();
@@ -774,10 +761,10 @@ class AssetBrowser : EditorWindow
if (!assetDataManager.AllAssets.TryGetValue(node.GUID, out asset))
return;
int offsetY = index * kLineHeight;
- // 绘制背景
+ // draw background
drawer.DrawBackground(new Rect(0, offsetY, contentWidth, kLineHeight), (index & 1) == 1 ? drawer.ColorHeavy : drawer.ColorLight);
- // 绘制定位按钮
- if(selectedNode == node)
+ // draw ping button
+ if (selectedNode == node)
{
bool ping = false;
drawer.DrawPing(new Rect(hierachy * kTabWidth, offsetY, 10, kLineHeight), ref ping);
@@ -790,10 +777,10 @@ class AssetBrowser : EditorWindow
}
}
}
- // 绘制折叠按钮
+ // draw foldout button
if (node.Children.Count > 0)
drawer.DrawFoldout(new Rect(hierachy * kTabWidth + 7, offsetY, kLineHeight, kLineHeight), ref node.Foldout);
- // 绘制选择按钮
+ // draw selector
bool clicked;
drawer.DrawSelector(new Rect(hierachy * kTabWidth + 19 + 7, offsetY, contentWidth, kLineHeight), selectedNode == node, out clicked);
if (clicked)
@@ -808,21 +795,21 @@ class AssetBrowser : EditorWindow
}
if (selectedNode == node)
drawer.SetTextColor(Color.white);
- // 绘制图标
+ // draw asset icon
drawer.DrawAssetIcon(new Rect(hierachy * kTabWidth + 19 + 7, offsetY, ColumWidth[Colum.Name], kLineHeight), asset);
- // 绘制引用数
+ // draw reference count
drawer.DrawLabel(new Rect(ColumOffsetX[Colum.Ref], offsetY, 100, kLineHeight), asset.RefCount.ToString());
- // 绘制反向引用数
+ // draw referenced count
List<string> revRef;
int revRefCount = 0;
if (assetDataManager.AssetsReverse.TryGetValue(node.GUID, out revRef))
revRefCount = revRef.Count;
drawer.DrawLabel(new Rect(ColumOffsetX[Colum.RevRef], offsetY, 100, kLineHeight), revRefCount.ToString());
- // 绘制资源类型
+ // draw asset type
drawer.DrawLabel(new Rect(ColumOffsetX[Colum.Type], offsetY, 100, kLineHeight), asset.Extension);
- // 绘制硬盘大小
+ // draw disk size
drawer.DrawLabel(new Rect(ColumOffsetX[Colum.DiskSize], offsetY, 100, kLineHeight), asset.DiskSizeStr);
- // 绘制资源路径
+ // draw location
drawer.DrawLabel(new Rect(ColumOffsetX[Colum.Path], offsetY, 1000, kLineHeight), asset.AssetPath);
if (selectedNode == node)
drawer.ResetTextColor();
@@ -852,14 +839,14 @@ class AssetBrowser : EditorWindow
ProcessTreeBuffer();
}
- // 文件树缓冲
+ // file tree buffer
private void ProcessTreeBuffer()
{
assetsTreeBuffer.root.Clear();
- foreach(FileTree.Node node in assetsTree.root)
+ foreach (FileTree.Node node in assetsTree.root)
{
- if(!Filter(node))
- continue;
+ if (!Filter(node))
+ continue;
assetsTreeBuffer.root.Add(node);
}
orderBase = OrderBase.Path;
@@ -874,15 +861,15 @@ class AssetBrowser : EditorWindow
else return 0;
}
- // Tree Buffer重新排序
+ // sort tree buffer
private void ReorderTreeBuffer()
{
assetsTreeBuffer.root.Sort((FileTree.Node a, FileTree.Node b) =>
{
- AssetData aa, ab;
+ AssetData aa, ab;
AssetDataManager.Get().AllAssets.TryGetValue(a.GUID, out aa);
AssetDataManager.Get().AllAssets.TryGetValue(b.GUID, out ab);
- if(aa == null || ab == null)
+ if (aa == null || ab == null)
return 0;
if (orderBase == OrderBase.Name) return clamp(orderName * aa.Name.CompareTo(ab.Name));
else if (orderBase == OrderBase.Ref) return clamp(orderRef * (aa.RefCount - ab.RefCount));
@@ -900,11 +887,11 @@ class AssetBrowser : EditorWindow
}
else if (orderBase == OrderBase.Type)
{
- if(aa.FileType == ab.FileType)
+ if (aa.FileType == ab.FileType)
{
- return clamp(orderType * ((int)aa.SubFileType - (int)ab.SubFileType));
+ return clamp(orderType * ((int)aa.SubFileType - (int)ab.SubFileType));
}
- return clamp(orderType * ((int)aa.FileType - (int)ab.FileType));
+ return clamp(orderType * ((int)aa.FileType - (int)ab.FileType));
}
else if (orderBase == OrderBase.DiskSize) return clamp(orderDiskSize * (int)(aa.DiskSize - ab.DiskSize));
else if (orderBase == OrderBase.Path) return clamp(orderPath * aa.AssetPath.CompareTo(ab.AssetPath));
@@ -933,7 +920,6 @@ class AssetBrowser : EditorWindow
}
-// 反向查找
public class AssetReverse : EditorWindow
{
private static Drawer drawer;
@@ -955,13 +941,13 @@ public class AssetReverse : EditorWindow
private enum Colums
{
- cName, // "资源列表和引用关系"
- cLocation, // "资源位置"
+ cName, // "asset name"
+ cLocation, // "location"
}
private static readonly Dictionary<Colums, string> kColumHeader = new Dictionary<Colums, string>{
- {Colums.cName, "资源名"},
- {Colums.cLocation, "位置"},
+ {Colums.cName, "Asset Name"},
+ {Colums.cLocation, "Location"},
};
private static readonly Dictionary<Colums, int> kColumWidth = new Dictionary<Colums, int>{