del AssetDependencyGraph

This commit is contained in:
StarBeats 2025-04-17 19:42:47 +08:00
parent 066ffea0a9
commit 1535347d45
47 changed files with 0 additions and 3155 deletions

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: a359b65f33dc9df43950bf68bd99b6ee
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,14 +0,0 @@
{
"name": "AssetDependencyGraph-Editor",
"references": [],
"optionalUnityReferences": [],
"includePlatforms": [
"Editor"
],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": []
}

View File

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 0f6edbbfd6f04b1479b191b629a0421f
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 9303f9c952516f34cbc668b8d9217ee7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,242 +0,0 @@
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
namespace AssetDependencyGraph
{
[BsonIgnoreExtraElements]
public class AssetIdentify
{
public string Path;
public string AssetType;
[AllowNull]
public string Guid;
[AllowNull]
public string Md5;
}
[BsonIgnoreExtraElements]
public class AssetNode
{
public AssetIdentify Self;
public string AssetType;
public HashSet<AssetIdentify> Dependencies = new();
public HashSet<AssetIdentify> Dependent = new();
}
[BsonIgnoreExtraElements]
public sealed class FolderNode : AssetNode
{
}
[BsonIgnoreExtraElements]
public sealed class PackageNode : AssetNode
{
}
public class AssetDependencyGraphDB
{
MongoClient client;
IMongoCollection<FolderNode> FolderNodes;
IMongoCollection<PackageNode> PackageNodes;
IMongoCollection<AssetNode> AssetNodes;
Dictionary<string, AssetNode> findCacheDic = new();
public AssetDependencyGraphDB(string user, string passwd, string ip)
{
MongoClientSettings settings;
if(string.IsNullOrEmpty(user) && !string.IsNullOrEmpty(ip))
{
settings = MongoClientSettings.FromUrl(new MongoUrl($"mongodb://{ip}:27017/"));
}
else
{
settings = MongoClientSettings.FromUrl(new MongoUrl($"mongodb://{user}:{passwd}@{ip}:27017/"));
}
settings.ConnectTimeout = TimeSpan.FromSeconds(5);
settings.MinConnectionPoolSize = 1;
settings.MaxConnectionPoolSize = 25;
client = new MongoClient(settings);
var db = client.GetDatabase("assetgraph");
FolderNodes = db.GetCollection<FolderNode>("folder_nodes");
PackageNodes = db.GetCollection<PackageNode>("package_nodes");
AssetNodes = db.GetCollection<AssetNode>("asset_nodes");
}
public void Clean()
{
client.DropDatabase("assetgraph");
var db = client.GetDatabase("assetgraph");
FolderNodes = db.GetCollection<FolderNode>("folder_nodes");
PackageNodes = db.GetCollection<PackageNode>("package_nodes");
AssetNodes = db.GetCollection<AssetNode>("asset_nodes");
}
public void UpdateOrInsert<T>(T node) where T : AssetNode
{
switch (node)
{
case FolderNode folderNode:
{
var filter = Builders<FolderNode>.Filter.And(
Builders<FolderNode>.Filter.Eq(fn=>fn.Self.Path,node.Self.Path)
);
var found = FolderNodes.Find(filter);
if (found == null || found.CountDocuments() == 0)
{
FolderNodes.InsertOne(folderNode);
}
else
{
var result = FolderNodes.UpdateOne(filter, Builders<FolderNode>.Update.Combine(
Builders<FolderNode>.Update.Set(fn => fn.Self, folderNode.Self),
Builders<FolderNode>.Update.Set(fn => fn.AssetType, folderNode.AssetType),
Builders<FolderNode>.Update.Set(fn => fn.Dependencies, folderNode.Dependencies),
Builders<FolderNode>.Update.Set(fn => fn.Dependent, folderNode.Dependent)
));
}
break;
}
case PackageNode packageNode:
{
var filter = Builders<PackageNode>.Filter.And(
Builders<PackageNode>.Filter.Eq(fn => fn.Self.Path, node.Self.Path)
);
var found = PackageNodes.Find(filter);
if (found == null || found.CountDocuments() == 0)
{
PackageNodes.InsertOne(packageNode);
}
else
{
var result = PackageNodes.UpdateOne(filter, Builders<PackageNode>.Update.Combine(
Builders<PackageNode>.Update.Set(fn => fn.Self, packageNode.Self),
Builders<PackageNode>.Update.Set(fn => fn.AssetType, packageNode.AssetType),
Builders<PackageNode>.Update.Set(fn => fn.Dependencies, packageNode.Dependencies),
Builders<PackageNode>.Update.Set(fn => fn.Dependent, packageNode.Dependent)
));
}
break;
}
case AssetNode assetNode:
{
var filter = Builders<AssetNode>.Filter.And(
Builders<AssetNode>.Filter.Eq(fn => fn.Self.Path, node.Self.Path)
);
var found = AssetNodes.Find(filter);
if (found == null || found.CountDocuments() == 0)
{
AssetNodes.InsertOne(assetNode);
}
else
{
var result = AssetNodes.UpdateOne(filter, Builders<AssetNode>.Update.Combine(
Builders<AssetNode>.Update.Set(fn => fn.Self, assetNode.Self),
Builders<AssetNode>.Update.Set(fn => fn.AssetType, assetNode.AssetType),
Builders<AssetNode>.Update.Set(fn => fn.Dependencies, assetNode.Dependencies),
Builders<AssetNode>.Update.Set(fn => fn.Dependent, assetNode.Dependent)
));
}
break;
}
default:
break;
}
}
public void Delete<T>(T node) where T : AssetNode
{
switch (node)
{
case FolderNode folderNode:
{
var filter = Builders<FolderNode>.Filter.And(
Builders<FolderNode>.Filter.Eq(fn => fn.Self.Path, node.Self.Path)
);
var found = FolderNodes.Find(filter);
if (found != null && found.CountDocuments() == 0)
{
// TODO: del ref dep
FolderNodes.DeleteOne(filter);
}
break;
}
case PackageNode packageNode:
{
var filter = Builders<PackageNode>.Filter.And(
Builders<PackageNode>.Filter.Eq(fn => fn.Self.Path, node.Self.Path)
);
var found = PackageNodes.Find(filter);
if (found != null && found.CountDocuments() == 0)
{
// TODO: del ref dep
PackageNodes.DeleteOne(filter);
}
break;
}
case AssetNode assetNode:
{
var filter = Builders<AssetNode>.Filter.And(
Builders<AssetNode>.Filter.Eq(fn => fn.Self.Path, node.Self.Path)
);
var found = AssetNodes.Find(filter);
if (found != null && found.CountDocuments() == 0)
{
// TODO: del ref dep
AssetNodes.DeleteOne(filter);
}
break;
}
default:
break;
}
}
public AssetNode Find(string path)
{
if(findCacheDic.TryGetValue(path, out var assetNode))
{
return assetNode;
}
var filter = Builders<AssetNode>.Filter.And(
Builders<AssetNode>.Filter.Eq(fn => fn.Self.Path, path)
);
var found = AssetNodes.Find(filter);
if (found != null && found.CountDocuments() != 0)
{
assetNode = found.First();
findCacheDic[path] = assetNode;
return assetNode;
}
var filter1 = Builders<PackageNode>.Filter.And(
Builders<PackageNode>.Filter.Eq(fn => fn.Self.Path, path)
);
var found1 = PackageNodes.Find(filter1);
if (found1 != null && found1.CountDocuments() != 0)
{
assetNode = found1.First();
findCacheDic[path] = assetNode;
return assetNode;
}
var filter2 = Builders<FolderNode>.Filter.And(
Builders<FolderNode>.Filter.Eq(fn => fn.Self.Path, path)
);
var found2 = FolderNodes.Find(filter2);
if (found2 != null && found2.CountDocuments() != 0)
{
assetNode = found2.First();
findCacheDic[path] = assetNode;
return assetNode;
}
return null;
}
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 3b678f0fc58371c4cb7735b9906443fd
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,912 +0,0 @@
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.Experimental.GraphView;
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements;
using Object = UnityEngine.Object;
namespace AssetDependencyGraph
{
public class AssetGraphView : GraphView
{
public AssetGraphView()
{
SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale);
this.AddManipulator(new ContentDragger());
this.AddManipulator(new SelectionDragger());
this.AddManipulator(new RectangleSelector());
this.AddManipulator(new FreehandSelector());
VisualElement background = new VisualElement
{
style =
{
backgroundColor = new Color(0.17f, 0.17f, 0.17f, 1f)
}
};
Insert(0, background);
background.StretchToParentSize();
}
}
public class AssetGroup
{
public AssetNode AssetNode;
public Group GroupNode = new Group();
public Node MainGraphNode = new Node();
public Rect MainGraphNodeLastPosition = new Rect();
public List<GraphElement> AssetGraphNodes = new List<GraphElement>();
public List<GraphElement> AssetGraphConnections = new List<GraphElement>();
public List<Node> DependenciesForPlacement = new List<Node>();
}
public class AssetDependencyGraph : EditorWindow
{
private const float NodeWidth = 300.0f;
DependencyAnalyzer da = new DependencyAnalyzer();
AssetDependencyGraphDB db = new AssetDependencyGraphDB("", "CCS20190109", "localhost");
Dictionary<string, Toggle> type2Toogle = new();
(string assetType, bool show)[] assetTypeHidenTogleItems = new[] {
("Executable" , true), ("UnityAssembly", true), ("SourceFile", true),
("MakeFile", true), ("DatFile", true), ("AudioClip", true),
("VideoClip", true), ("Texture", false), ("Shader", false),
("ComputeShader", false), ("ShaderHeader", false), ("Binary", true),
("TextFile", true), ("Excel", true), ("UnknowFileType", false),
};
Toggle AlignmentToggle;
private GraphView graphView;
private readonly List<Object> selectedObjects = new List<Object>();
private readonly List<AssetGroup> assetGroups = new List<AssetGroup>();
private readonly Dictionary<string, Node> fullPathNodeLookup = new Dictionary<string, Node>();
[MenuItem("Window/Asset Dependency Graph")]
public static void CreateTestGraphViewWindow()
{
var window = GetWindow<AssetDependencyGraph>(true);
window.titleContent = new GUIContent("Asset Dependency Graph");
}
public void OnEnable()
{
CreateGraph();
}
public void OnDisable()
{
rootVisualElement.Remove(graphView);
}
void CreateGraph()
{
graphView = new AssetGraphView
{
name = "Asset Dependency Graph",
};
VisualElement toolbar = CreateToolbar();
VisualElement toolbar2 = CreateFilterbar();
rootVisualElement.Add(toolbar);
rootVisualElement.Add(toolbar2);
rootVisualElement.Add(graphView);
graphView.StretchToParentSize();
toolbar.BringToFront();
toolbar2.BringToFront();
}
VisualElement CreateToolbar()
{
var toolbar = new VisualElement
{
style =
{
flexDirection = FlexDirection.Row,
flexGrow = 0,
backgroundColor = new Color(0.25f, 0.25f, 0.25f, 0.75f)
}
};
var options = new VisualElement
{
style = { alignContent = Align.Center }
};
toolbar.Add(options);
toolbar.Add(new Button(ExploreAsset)
{
text = "Explore Asset",
});
toolbar.Add(new Button(ClearGraph)
{
text = "Clear"
});
toolbar.Add(new Button(ResetGroups)
{
text = "Reset Groups"
});
toolbar.Add(new Button(ResetAllNodes)
{
text = "Reset Nodes"
});
toolbar.Add(new Button(() =>
{
da.Analyze(Application.dataPath);
})
{
text = "Analyze Asset"
});
var ts = new ToolbarSearchField();
ts.RegisterValueChangedCallback(x =>
{
if (string.IsNullOrEmpty(x.newValue))
{
graphView.FrameAll();
return;
}
graphView.ClearSelection();
graphView.graphElements.ToList().ForEach(y =>
{
if (y is Node node && y.title.IndexOf(x.newValue, System.StringComparison.OrdinalIgnoreCase) >= 0)
{
graphView.AddToSelection(node);
}
});
graphView.FrameSelection();
});
toolbar.Add(ts);
AlignmentToggle = new Toggle();
AlignmentToggle.text = "Horizontal Layout";
AlignmentToggle.value = true;
AlignmentToggle.RegisterValueChangedCallback(x =>
{
ResetAllNodes();
});
toolbar.Add(AlignmentToggle);
return toolbar;
}
VisualElement CreateFilterbar()
{
var toolbar = new VisualElement
{
style =
{
flexDirection = FlexDirection.Row,
flexGrow = 0,
backgroundColor = new Color(0.25f, 0.25f, 0.25f, 0.75f)
}
};
var options = new VisualElement
{
style = { alignContent = Align.Center }
};
toolbar.Add(options);
toolbar.Add(new Label("Filters: "));
foreach (var pair in assetTypeHidenTogleItems)
{
var assetTypeTogle = new Toggle();
assetTypeTogle.text = "Hide " + pair.assetType;
assetTypeTogle.value = pair.show;
assetTypeTogle.RegisterValueChangedCallback(x =>
{
FilterAssetGroups();
});
toolbar.Add(assetTypeTogle);
type2Toogle[pair.assetType] = assetTypeTogle;
}
return toolbar;
}
private void ExploreAsset()
{
Object[] objs = Selection.objects;
foreach (var obj in objs)
{
//Prevent readding same object
if (selectedObjects.Contains(obj))
{
Debug.Log("Object already loaded");
return;
}
selectedObjects.Add(obj);
AssetGroup AssetGroup = new AssetGroup();
AssetGroup.AssetNode = db.Find(AssetDatabase.GetAssetPath(obj).ToUniversalPath());
assetGroups.Add(AssetGroup);
// assetPath will be empty if obj is null or isn't an asset (a scene object)
if (obj == null)
return;
AssetGroup.GroupNode = new Group { title = obj.name };
PopulateGroup(AssetGroup, obj, new Rect(10, graphView.contentRect.height / 2, 0, 0));
}
}
void PopulateGroup(AssetGroup AssetGroup, Object obj, Rect position)
{
if (obj == null)
{
obj = AssetDatabase.LoadMainAssetAtPath(AssetGroup.AssetNode.Self.Path);
if (obj == null)
{
Debug.Log("Object doesn't exist anymore");
return;
}
}
AssetGroup.MainGraphNode = CreateNode(AssetGroup, AssetGroup.AssetNode, obj, true);
AssetGroup.MainGraphNode.userData = 0;
AssetGroup.MainGraphNode.SetPosition(position);
if (!graphView.Contains(AssetGroup.GroupNode))
{
graphView.AddElement(AssetGroup.GroupNode);
}
graphView.AddElement(AssetGroup.MainGraphNode);
AssetGroup.GroupNode.AddElement(AssetGroup.MainGraphNode);
CreateDependencyNodes(AssetGroup, AssetGroup.AssetNode, AssetGroup.MainGraphNode, AssetGroup.GroupNode, 1);
CreateDependentNodes(AssetGroup, AssetGroup.AssetNode, AssetGroup.MainGraphNode, AssetGroup.GroupNode, -1);
AssetGroup.AssetGraphNodes.Add(AssetGroup.MainGraphNode);
AssetGroup.GroupNode.capabilities &= ~Capabilities.Deletable;
AssetGroup.GroupNode.Focus();
AssetGroup.MainGraphNode.RegisterCallback<GeometryChangedEvent, AssetGroup>(
UpdateGroupDependencyNodePlacement, AssetGroup
);
}
//Recreate the groups but use the already created groups instead of new ones
void FilterAssetGroups()
{
//first collect the main node's position and then clear the graph
foreach (var AssetGroup in assetGroups)
{
AssetGroup.MainGraphNodeLastPosition = AssetGroup.MainGraphNode.GetPosition();
}
fullPathNodeLookup.Clear();
foreach (var AssetGroup in assetGroups)
{
//clear the nodes and dependencies after getting the position of the main node
CleanGroup(AssetGroup);
PopulateGroup(AssetGroup, null, AssetGroup.MainGraphNodeLastPosition);
}
}
void CleanGroup(AssetGroup assetGroup)
{
if (assetGroup.AssetGraphConnections.Count > 0)
{
foreach (var edge in assetGroup.AssetGraphConnections)
{
graphView.RemoveElement(edge);
}
}
assetGroup.AssetGraphConnections.Clear();
foreach (var node in assetGroup.AssetGraphNodes)
{
graphView.RemoveElement(node);
}
assetGroup.AssetGraphNodes.Clear();
assetGroup.DependenciesForPlacement.Clear();
}
private void CreateDependencyNodes(AssetGroup assetGroup, AssetNode asssetNode, Node selfGraphNode, Group groupGraphNode, int depth)
{
foreach (var dependAssetId in asssetNode.Dependencies)
{
AssetNode dependAssetNode = db.Find(dependAssetId.Path);
var typeName = dependAssetNode.AssetType;
//filter out selected asset types
if (FilterType(typeName))
{
continue;
}
Node dependGraphNode = CreateNode(assetGroup, dependAssetNode, AssetDatabase.LoadMainAssetAtPath(dependAssetId.Path.ToUnityRelatePath()), false);
if (!assetGroup.AssetGraphNodes.Contains(dependGraphNode))
{
dependGraphNode.userData = depth;
}
//CreateDependencyNodes(assetGroup, dependAssetNode, dependGraphNode, groupGraphNode, depth + 1);
//if the node doesnt exists yet, put it in the group
if (!graphView.Contains(dependGraphNode))
{
graphView.AddElement(dependGraphNode);
assetGroup.DependenciesForPlacement.Add(dependGraphNode);
groupGraphNode.AddElement(dependGraphNode);
}
else
{
//TODO: if it already exists, put it in a separate group for shared assets
//Check if the dependencyNode is in the same group or not
//if it's a different group move it to a new shared group
/*
if (SharedToggle.value) {
if (!assetGroup.m_AssetNodes.Contains(dependencyNode)) {
if (assetGroup.SharedGroup == null) {
assetGroup.SharedGroup = new AssetGroup();
AssetGroups.Add(assetGroup.SharedGroup);
assetGroup.SharedGroup.assetPath = assetGroup.assetPath;
assetGroup.SharedGroup.groupNode = new Group { title = "Shared Group" };
assetGroup.SharedGroup.mainNode = dependencyNode;
assetGroup.SharedGroup.mainNode.userData = 0;
}
if (!m_GraphView.Contains(assetGroup.SharedGroup.groupNode)) {
m_GraphView.AddElement(assetGroup.SharedGroup.groupNode);
}
//add the node to the group and remove it from the previous group
assetGroup.m_AssetNodes.Remove(dependencyNode);
//assetGroup.groupNode.RemoveElement(dependencyNode);
assetGroup.m_DependenciesForPlacement.Remove(dependencyNode);
assetGroup.SharedGroup.m_DependenciesForPlacement.Add(dependencyNode);
if (!assetGroup.SharedGroup.groupNode.ContainsElement(dependencyNode)) {
assetGroup.SharedGroup.groupNode.AddElement(dependencyNode);
}
assetGroup.SharedGroup.m_AssetNodes.Add(dependencyNode);
}
}*/
}
Edge edge = CreateEdge(dependGraphNode, selfGraphNode);
assetGroup.AssetGraphConnections.Add(edge);
assetGroup.AssetGraphNodes.Add(dependGraphNode);
}
}
private void CreateDependentNodes(AssetGroup assetGroup, AssetNode asssetNode, Node selfGraphNode, Group groupGraphNode, int depth)
{
foreach (var dependAssetId in asssetNode.Dependent)
{
AssetNode dependAssetNode = db.Find(dependAssetId.Path);
var typeName = dependAssetNode.AssetType;
//filter out selected asset types
if (FilterType(typeName))
{
continue;
}
Node dependentGraphNode = CreateNode(assetGroup, dependAssetNode, AssetDatabase.LoadMainAssetAtPath(dependAssetId.Path.ToUnityRelatePath()), false);
if (!assetGroup.AssetGraphNodes.Contains(dependentGraphNode))
{
dependentGraphNode.userData = depth;
}
//CreateDependencyNodes(assetGroup, dependAssetNode, dependGraphNode, groupGraphNode, depth - 1);
//if the node doesnt exists yet, put it in the group
if (!graphView.Contains(dependentGraphNode))
{
graphView.AddElement(dependentGraphNode);
assetGroup.DependenciesForPlacement.Add(dependentGraphNode);
groupGraphNode.AddElement(dependentGraphNode);
}
else
{
//TODO: if it already exists, put it in a separate group for shared assets
//Check if the dependencyNode is in the same group or not
//if it's a different group move it to a new shared group
/*
if (SharedToggle.value) {
if (!assetGroup.m_AssetNodes.Contains(dependencyNode)) {
if (assetGroup.SharedGroup == null) {
assetGroup.SharedGroup = new AssetGroup();
AssetGroups.Add(assetGroup.SharedGroup);
assetGroup.SharedGroup.assetPath = assetGroup.assetPath;
assetGroup.SharedGroup.groupNode = new Group { title = "Shared Group" };
assetGroup.SharedGroup.mainNode = dependencyNode;
assetGroup.SharedGroup.mainNode.userData = 0;
}
if (!m_GraphView.Contains(assetGroup.SharedGroup.groupNode)) {
m_GraphView.AddElement(assetGroup.SharedGroup.groupNode);
}
//add the node to the group and remove it from the previous group
assetGroup.m_AssetNodes.Remove(dependencyNode);
//assetGroup.groupNode.RemoveElement(dependencyNode);
assetGroup.m_DependenciesForPlacement.Remove(dependencyNode);
assetGroup.SharedGroup.m_DependenciesForPlacement.Add(dependencyNode);
if (!assetGroup.SharedGroup.groupNode.ContainsElement(dependencyNode)) {
assetGroup.SharedGroup.groupNode.AddElement(dependencyNode);
}
assetGroup.SharedGroup.m_AssetNodes.Add(dependencyNode);
}
}*/
}
Edge edge = CreateEdge(selfGraphNode, dependentGraphNode);
assetGroup.AssetGraphConnections.Add(edge);
assetGroup.AssetGraphNodes.Add(dependentGraphNode);
}
}
Edge CreateEdge(Node dependencyNode, Node parentNode)
{
Edge edge = new Edge
{
input = dependencyNode.inputContainer[0] as Port,
output = parentNode.outputContainer[0] as Port,
};
edge.input?.Connect(edge);
edge.output?.Connect(edge);
dependencyNode.RefreshPorts();
graphView.AddElement(edge);
edge.capabilities &= ~Capabilities.Deletable;
return edge;
}
private Node CreateNode(AssetGroup assetGroup, AssetNode assetNode, Object obj, bool isMainNode)
{
Node resultNode;
string fullPath = assetNode.Self.Path;
if (fullPathNodeLookup.TryGetValue(fullPath, out resultNode))
{
//----not sure what this is, the more dependencies the further removed on the chart?
//int currentDepth = (int)resultNode.userData;
//resultNode.userData = currentDepth + 1;
return resultNode;
}
if (AssetDatabase.TryGetGUIDAndLocalFileIdentifier(obj, out var assetGuid, out long _))
{
var objNode = new Node
{
title = obj.name,
style =
{
width = NodeWidth
}
};
objNode.extensionContainer.style.backgroundColor = new Color(0.24f, 0.24f, 0.24f, 0.8f);
#region Select button
objNode.titleContainer.Add(new Button(() =>
{
Selection.activeObject = obj;
EditorGUIUtility.PingObject(obj);
})
{
style =
{
height = 16.0f,
alignSelf = Align.Center,
alignItems = Align.Center
},
text = "Select"
});
objNode.titleContainer.Add(new Button(() =>
{
// assetNode
})
{
style =
{
height = 16.0f,
alignSelf = Align.Center,
alignItems = Align.Center
},
text = "Delete"
});
#endregion
#region Padding
var infoContainer = new VisualElement
{
style =
{
paddingBottom = 4.0f,
paddingTop = 4.0f,
paddingLeft = 4.0f,
paddingRight = 4.0f
}
};
#endregion
#region Asset Path, removed to improve visibility with large amount of assets
// infoContainer.Add(new Label {
// text = assetPath,
//#if UNITY_2019_1_OR_NEWER
// style = { whiteSpace = WhiteSpace.Normal }
//#else
// style = { wordWrap = true }
//#endif
// });
#endregion
#region Asset type
var typeName = assetNode.AssetType;
var typeLabel = new Label
{
text = $"Type: {typeName}",
};
infoContainer.Add(typeLabel);
objNode.extensionContainer.Add(infoContainer);
#endregion
var typeContainer = new VisualElement
{
style =
{
paddingBottom = 4.0f,
paddingTop = 4.0f,
paddingLeft = 4.0f,
paddingRight = 4.0f,
backgroundColor = GetColorByAssetType(typeName)
}
};
objNode.extensionContainer.Add(typeContainer);
#region Node Icon, replaced with color
//Texture assetTexture = AssetPreview.GetAssetPreview(obj);
//if (!assetTexture)
// assetTexture = AssetPreview.GetMiniThumbnail(obj);
//if (assetTexture)
//{
// AddDivider(objNode);
// objNode.extensionContainer.Add(new Image
// {
// image = assetTexture,
// scaleMode = ScaleMode.ScaleToFit,
// style =
// {
// paddingBottom = 4.0f,
// paddingTop = 4.0f,
// paddingLeft = 4.0f,
// paddingRight = 4.0f
// }
// });
//}
#endregion
// Ports
var dependentAmount = 0;
foreach (var item in assetNode.Dependent)
{
if (item.AssetType != "Folder")
{
++dependentAmount;
}
}
if (assetNode.Dependent.Count > 0)
{
Port port = objNode.InstantiatePort(Orientation.Horizontal, Direction.Input, Port.Capacity.Single, typeof(Object));
port.Add(new Button(() =>
{
CreateDependentNodes(assetGroup, assetNode, fullPathNodeLookup[fullPath], assetGroup.GroupNode, (int)fullPathNodeLookup[fullPath].userData - 1);
EditorApplication.delayCall += () => ResetAllNodes();
})
{
style =
{
height = 16.0f,
alignSelf = Align.Center,
alignItems = Align.Center
},
text = "展开"
});
port.portName = dependentAmount + "个引用";
objNode.inputContainer.Add(port);
}
var dependencyAmount = assetNode.Dependencies.Count;
if (dependencyAmount > 0)
{
Port port = objNode.InstantiatePort(Orientation.Horizontal, Direction.Output, Port.Capacity.Single, typeof(Object));
port.Add(new Button(() =>
{
CreateDependencyNodes(assetGroup, assetNode, fullPathNodeLookup[fullPath], assetGroup.GroupNode, (int)fullPathNodeLookup[fullPath].userData + 1);
EditorApplication.delayCall += () => ResetAllNodes();
})
{
style =
{
height = 16.0f,
alignSelf = Align.Center,
alignItems = Align.FlexEnd
},
text = "展开"
});
port.portName = dependencyAmount + "个依赖";
objNode.outputContainer.Add(port);
objNode.RefreshPorts();
}
resultNode = objNode;
resultNode.RefreshExpandedState();
resultNode.RefreshPorts();
resultNode.capabilities &= ~Capabilities.Deletable;
resultNode.capabilities |= Capabilities.Collapsible;
}
fullPathNodeLookup[fullPath] = resultNode;
return resultNode;
}
bool FilterType(string type)
{
if (type2Toogle.TryGetValue(type, out var result))
{
return result.value;
}
return false;
}
StyleColor GetColorByAssetType(string typeName)
{
switch (typeName)
{
case "MonoScript":
return Color.black;
case "Material":
return new Color(0.1f, 0.5f, 0.1f); //green
case "Texture2D":
return new Color(0.5f, 0.1f, 0.1f); //red
case "RenderTexture":
return new Color(0.8f, 0.1f, 0.1f); //red
case "Shader":
return new Color(0.1f, 0.1f, 0.5f); //dark blue
case "ComputeShader":
return new Color(0.1f, 0.1f, 0.5f); //dark blue
case "GameObject":
return new Color(0f, 0.8f, 0.7f); //light blue
case "AnimationClip":
return new Color(1, 0.7f, 1); //pink
case "AnimatorController":
return new Color(1, 0.7f, 0.8f); //pink
case "AudioClip":
return new Color(1, 0.8f, 0); //orange
case "AudioMixerController":
return new Color(1, 0.8f, 0); //orange
case "Font":
return new Color(0.9f, 1, 0.9f); //light green
case "TMP_FontAsset":
return new Color(0.9f, 1, 0.9f); //light green
case "Mesh":
return new Color(0.5f, 0, 0.5f); //purple
case "TerrainLayer":
return new Color(0.5f, 0.8f, 0f); //green
default:
break;
}
return CustomColor(typeName);
}
//Add custom assets here
StyleColor CustomColor(string assetType)
{
switch (assetType)
{
case "GearObject":
return new Color(0.9f, 0, 0.9f); //pink
case "TalentObject":
return new Color(0.9f, 0, 0.9f); //
case "AbilityInfo":
return new Color(0.9f, 0, 0.9f); //
case "HealthSO":
return new Color(0.9f, 0, 0.9f); //
default:
break;
}
//standard color
return new Color(0.24f, 0.24f, 0.24f, 0.8f);
}
private static void AddDivider(Node objNode)
{
var divider = new VisualElement { name = "divider" };
divider.AddToClassList("horizontal");
objNode.extensionContainer.Add(divider);
}
private void ClearGraph()
{
selectedObjects.Clear();
foreach (var assetGroup in assetGroups)
{
EmptyGroup(assetGroup);
}
fullPathNodeLookup.Clear();
assetGroups.Clear();
}
void EmptyGroup(AssetGroup assetGroup)
{
if (assetGroup.AssetGraphConnections.Count > 0)
{
foreach (var edge in assetGroup.AssetGraphConnections)
{
graphView.RemoveElement(edge);
}
}
assetGroup.AssetGraphConnections.Clear();
foreach (var node in assetGroup.AssetGraphNodes)
{
graphView.RemoveElement(node);
}
assetGroup.AssetGraphNodes.Clear();
assetGroup.DependenciesForPlacement.Clear();
graphView.RemoveElement(assetGroup.GroupNode);
assetGroup.GroupNode = null;
}
private void UpdateGroupDependencyNodePlacement(GeometryChangedEvent e, AssetGroup assetGroup)
{
assetGroup.MainGraphNode.UnregisterCallback<GeometryChangedEvent, AssetGroup>(
UpdateGroupDependencyNodePlacement
);
ResetNodes(assetGroup);
}
void ResetAllNodes()
{
foreach (var assetGroup in assetGroups)
{
ResetNodes(assetGroup);
}
}
//Reset the node positions of the given group
void ResetNodes(AssetGroup assetGroup)
{
// The current y offset in per depth
var depthOffset = new Dictionary<int, float>();
foreach (var node in assetGroup.DependenciesForPlacement)
{
int depth = (int)node.userData;
if (!depthOffset.ContainsKey(depth))
depthOffset.Add(depth, 0.0f);
if (AlignmentToggle.value)
{
depthOffset[depth] += node.layout.height;
}
else
{
depthOffset[depth] += node.layout.width;
}
}
// Move half of the node into negative y space so they're on either size of the main node in y axis
var depths = new List<int>(depthOffset.Keys);
foreach (int depth in depths)
{
if (depth == 0)
continue;
float offset = depthOffset[depth];
depthOffset[depth] = (0f - offset / 2.0f);
}
Rect mainNodeRect = assetGroup.MainGraphNode.GetPosition();
foreach (var node in assetGroup.DependenciesForPlacement)
{
int depth = (int)node.userData;
if (AlignmentToggle.value)
{
node.SetPosition(new Rect(mainNodeRect.x + node.layout.width * 1.5f * depth, mainNodeRect.y + depthOffset[depth], 0, 0));
}
else
{
node.SetPosition(new Rect(mainNodeRect.x + depthOffset[depth], mainNodeRect.y + node.layout.height * 1.5f * depth, 0, 0));
}
if (AlignmentToggle.value)
{
depthOffset[depth] += node.layout.height;
}
else
{
depthOffset[depth] += node.layout.width;
}
}
}
//fix the position of the groups so they dont overlap
void ResetGroups()
{
float y = 0;
float x = 0;
foreach (var assetGroup in assetGroups)
{
if (AlignmentToggle.value)
{
Rect pos = assetGroup.GroupNode.GetPosition();
pos.x = x;
assetGroup.GroupNode.SetPosition(pos);
x += assetGroup.GroupNode.GetPosition().width;
}
else
{
Rect pos = assetGroup.GroupNode.GetPosition();
pos.y = y;
assetGroup.GroupNode.SetPosition(pos);
y += assetGroup.GroupNode.GetPosition().height;
}
}
}
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 43eecbcf2afaca84aa2af29388e193de
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,351 +0,0 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
using UnityEditor;
namespace AssetDependencyGraph
{
public static class FileExtensionHelper
{
public static string GetTypeByExtension(string ext)
{
switch (ext.ToLowerInvariant())
{
case ".a":
case ".dll":
case ".so":
case ".exe":
case ".dynlib":
return "Executable";
case ".asmdef":
case ".asmref":
return "UnityAssembly";
case ".cs":
case ".lua":
case ".js":
case ".ts":
case ".java":
case ".h":
case ".cpp":
case ".cxx":
case ".mm":
case ".py":
case ".bat":
case ".jar":
case ".arr":
case ".jslib":
return "SourceFile";
case ".gradle":
return "MakeFile";
case ".dat":
case ".data":
return "DatFile";
case ".mp3":
case ".ogg":
case ".wav":
return "AudioClip";
case ".mp4":
case ".webm":
return "VideoClip";
case ".mat":
return "Material";
case ".rendertexture":
case ".dds":
case ".exr":
case ".hdr":
case ".png":
case ".jpg":
case ".gif":
case ".psd":
case ".bmp":
case ".tiff":
case ".tga":
case ".gradient":
case ".spriteatlas":
return "Texture";
case ".obj":
case ".fbx":
case ".mesh":
return "Mesh";
case ".shader":
case ".surfshader":
case ".shadergraph":
return "Shader";
case ".compute":
return "ComputeShader";
case ".hlsl":
case ".cginc":
case ".shadersubgraph":
return "ShaderHeader";
case ".otf":
case ".ttf":
return "Font";
case ".byte":
case ".bytes":
case ".bin":
return "Binary";
case ".txt":
case ".md":
case ".chm":
case ".yml":
case ".url":
case ".json":
case ".json5":
case ".xml":
case ".uxml":
case ".nson":
case ".config":
case ".pdf":
return "TextFile";
case ".xlsx":
case ".xls":
return "Excel";
default:
return "UnknowFileType";
}
}
public static bool IsPackage(string ext)
{
switch (ext.ToLowerInvariant())
{
case ".prefab":
case ".unity":
return true;
default:
return false;
}
}
public static bool NeedAnalyzeDepend(string ext)
{
switch (ext.ToLowerInvariant())
{
case ".prefab":
case ".unity":
case ".asset":
return true;
default:
return false;
}
}
public static bool Exclude(string path) => path.EndsWith(".meta")
|| path.EndsWith(".unitypackage")
|| path.EndsWith(".preset")
|| path.EndsWith(".backup")
|| path.EndsWith(".tmp")
|| path.EndsWith(".editor")
|| path.EndsWith(".zip")
|| path.EndsWith(".scenetemplate");
}
public interface IDependencyAnalysis
{
void Analyze(string path, ConcurrentDictionary<AssetIdentify, AssetNode> result);
public (AssetIdentify id, AssetNode node) GetOrCreateFolderNode(string path, ConcurrentDictionary<AssetIdentify, AssetNode> result)
{
AssetIdentify k = null;
foreach (var item in result.Keys)
{
if (item.Path == path)
{
k = item;
}
}
if (k == null)
{
k = new AssetIdentify()
{
Path = path,
AssetType = "Folder",
Guid = null,
Md5 = null
};
result[k] = new FolderNode()
{
Self = k,
AssetType = "Folder",
};
}
return (k, result[k]);
}
public (AssetIdentify id, AssetNode node) GetOrCreateAssetNode(string path, ConcurrentDictionary<AssetIdentify, AssetNode> result)
{
AssetIdentify k = null;
foreach (var item in result.Keys)
{
if (item.Path == path)
{
k = item;
}
}
if (k == null)
{
k = new AssetIdentify()
{
Path = path,
Guid = null,
//Md5 = Utils.Md5(path)
};
if (FileExtensionHelper.IsPackage(Path.GetExtension(path)))
{
result[k] = new PackageNode()
{
Self = k,
};
}
else
{
result[k] = new AssetNode()
{
Self = k,
};
}
}
return (k, result[k]);
}
}
public class FolderDependencyAnalysis : IDependencyAnalysis
{
public void Analyze(string path, ConcurrentDictionary<AssetIdentify, AssetNode> result)
{
var dependencyAnalysis = (this as IDependencyAnalysis);
var k = dependencyAnalysis.GetOrCreateFolderNode(path, result);
foreach (string file in Directory.EnumerateFiles(path))
{
if (FileExtensionHelper.Exclude(file))
{
continue;
}
var p = file.ToUnityRelatePath().ToUniversalPath();
var selfNode = result[k.id];
var kv = dependencyAnalysis.GetOrCreateAssetNode(p, result);
kv.node.Dependent.Add(selfNode.Self);
selfNode.Dependencies.Add(kv.id);
}
foreach (string directory in Directory.EnumerateDirectories(path))
{
var p = directory.ToUnityRelatePath().ToUniversalPath();
var selfNode = result[k.id];
var kv = dependencyAnalysis.GetOrCreateFolderNode(p, result);
kv.node.Dependent.Add(selfNode.Self);
selfNode.Dependencies.Add(kv.id);
}
}
}
public class UnityDependencyAnalysis2 : IDependencyAnalysis
{
UnityLmdb unityLmdb;
HashSet<string> processed = new();
public UnityDependencyAnalysis2()
{
unityLmdb = new UnityLmdb();
unityLmdb.ResolveGuidPath();
}
public void Analyze(string path, ConcurrentDictionary<AssetIdentify, AssetNode> result)
{
if (!processed.Add(path))
{
return;
}
var dependencyAnalysis = (this as IDependencyAnalysis);
var kv = dependencyAnalysis.GetOrCreateAssetNode(path, result);
var relatePath = path.ToUnityRelatePath();
kv.id.Guid = unityLmdb.GetGuidByPath(relatePath);
var selfNode = kv.node;
var ext = Path.GetExtension(path);
var assetType = FileExtensionHelper.GetTypeByExtension(ext);
selfNode.AssetType = assetType;
kv.id.AssetType = assetType;
if (FileExtensionHelper.NeedAnalyzeDepend(ext))
{
var dependencies = UnityFileApi.DependencyTool.GetDependencies(path);
for (int i = 0; i < dependencies.Count; i++)
{
var dep = dependencies[i].ToUnityRelatePath();
var depkv = dependencyAnalysis.GetOrCreateAssetNode(dep, result);
depkv.node.Dependent.Add(selfNode.Self);
selfNode.Dependencies.Add(depkv.id);
Analyze(dep, result);
}
}
}
}
internal class DependencyAnalyzer
{
private Dictionary<Predicate<string>, IDependencyAnalysis> dependencyAnalysisDic = new();
private ConcurrentDictionary<AssetIdentify, AssetNode> assetIdentify2AssetNodeDic = new();
private List<string> allPath = new();
public DependencyAnalyzer()
{
//dependencyAnalysisDic.Add(new Predicate<string>(path => !Directory.Exists(path)), new UnityDependencyAnalysis1());
//dependencyAnalysisDic.Add(new Predicate<string>(path => !Directory.Exists(path)), new UnityDependencyAnalysis2());
dependencyAnalysisDic.Add(new Predicate<string>(path => Directory.Exists(path)), new FolderDependencyAnalysis());
}
private void Visivt(string path)
{
path = path.ToUniversalPath();
if (FileExtensionHelper.Exclude(path))
{
return;
}
allPath.Add(path);
}
public void Analyze(string rootFolder)
{
Stopwatch sw = Stopwatch.StartNew();
sw.Start();
Utils.TraverseDirectory(rootFolder, Visivt, -1);
Parallel.ForEach(allPath, (path) =>
{
path = path.ToUnityRelatePath();
foreach (var item in dependencyAnalysisDic)
{
if (item.Key(path))
{
item.Value.Analyze(path, assetIdentify2AssetNodeDic);
}
}
});
sw.Stop();
UnityEngine.Debug.Log($"分析引用耗时:{sw.ElapsedMilliseconds / 1000f}s");
AssetDependencyGraphDB db = new AssetDependencyGraphDB("", "", "localhost");
sw.Restart();
db.Clean();
Parallel.ForEach(assetIdentify2AssetNodeDic, item =>
{
db.UpdateOrInsert(item.Value);
});
sw.Stop();
UnityEngine.Debug.Log($"更新数据库:{sw.ElapsedMilliseconds / 1000f}s");
}
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: dfb4fe91c835f1a44853adfc3644470a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,125 +0,0 @@
using LightningDB;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace AssetDependencyGraph
{
public sealed class UnityLmdb
{
private Dictionary<string, string> guid2Path = new();
private Dictionary<string, string> path2Guid = new();
private static readonly string unityPath;
private static readonly string projPath;
static UnityLmdb()
{
var args = Environment.GetCommandLineArgs();
unityPath = Path.GetDirectoryName(args[0]);
for (int i = 0; i < args.Length; i++)
{
if (args[i].ToLowerInvariant() == "-projectpath")
{
projPath = args[i + 1];
break;
}
}
}
public static byte[] Guid2LmdbKey(string guid)
{
var inputByteArray = new byte[guid.Length / 2];
StringBuilder sb = new StringBuilder();
for (int i = 0; i < guid.Length; i += 2)
{
sb.Append(guid[i + 1]);
sb.Append(guid[i]);
}
guid = sb.ToString();
for (var x = 0; x < inputByteArray.Length; x++)
{
inputByteArray[x] = (byte)Convert.ToInt32(guid.Substring(x * 2, 2), 16);
}
return inputByteArray;
}
public static string LmdbKey2Guid(byte[] bytes)
{
StringBuilder ret = new StringBuilder();
for (var i = 0; i < bytes.Length; i++)
{
ret.AppendFormat("{0:x2}", bytes[i]);
if (ret.Length == 32)
{
break;
}
}
for (int i = 0; i < ret.Length; i += 2)
{
var c = ret[i];
ret[i] = ret[i + 1];
ret[i + 1] = c;
}
var hex = ret.ToString();
return hex;
}
public void ResolveGuidPath()
{
var sourceDbPath = Path.Combine(projPath, "Library", "SourceAssetDB");
var dbPath = Path.Combine(projPath, "Library", "SourceAssetDB1");
File.Copy(sourceDbPath, dbPath, true);
using var env = new LightningEnvironment(dbPath, configuration: new()
{
MaxDatabases = 64,
MaxReaders = 64,
});
env.Open(EnvironmentOpenFlags.NoSubDir | EnvironmentOpenFlags.ReadOnly);
using var tx = env.BeginTransaction(TransactionBeginFlags.ReadOnly);
using (var db = tx.OpenDatabase("GuidToPath", closeOnDispose: true))
using (var cursor = tx.CreateCursor(db))
{
foreach (var item in cursor.AsEnumerable())
{
guid2Path[LmdbKey2Guid(item.Item1.AsSpan().ToArray())] = Encoding.UTF8.GetString(item.Item2.AsSpan()).ToLowerInvariant().Trim();
}
}
using (var db = tx.OpenDatabase("PathToGuid", closeOnDispose: true))
using (var cursor = tx.CreateCursor(db))
{
foreach (var item in cursor.AsEnumerable())
{
path2Guid[Encoding.UTF8.GetString(item.Item1.AsSpan()).ToLowerInvariant().Trim()] = LmdbKey2Guid(item.Item2.AsSpan().ToArray());
}
}
}
public string GetGuidByPath(string path)
{
if (path2Guid.ContainsKey(path))
{
return path2Guid[path];
}
else
{
return null;
}
}
public string GetPathByGuid(string guid)
{
if (guid2Path.ContainsKey(guid))
{
return guid2Path[guid];
}
else
{
return null;
}
}
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 7ffc50b27ba42c94c8b2cafa818c13eb
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,91 +0,0 @@
using System;
using System.IO;
using System.Text;
using UnityEngine;
namespace AssetDependencyGraph
{
public static class Utils
{
static readonly string dataPath;
static Utils()
{
dataPath = Application.dataPath;
}
public static string Md5(string filename)
{
try
{
FileStream fs = new FileStream(filename, FileMode.Open);
System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(fs);
fs.Close();
return BitConverter.ToString(retVal).ToLower().Replace("-", "");
}
catch
{
throw;
}
}
public static void TraverseDirectory(string path, Action<string> action, int depth = 1)
{
if(depth == 0)
{
return;
}
foreach (string file in Directory.EnumerateFiles(path))
{
action.Invoke(file);
}
foreach (string directory in Directory.EnumerateDirectories(path))
{
action.Invoke(directory);
TraverseDirectory(directory, action, --depth);
}
}
public static string ToUniversalPath(this string path)
{
return path.Replace("\\", "/");
}
public static string ToUnityRelatePath(this string path)
{
if(path.StartsWith(dataPath.ToUniversalPath().Replace("Assets", "")) && !path.StartsWith(dataPath.ToUniversalPath() + "/Assets"))
{
return path.Replace(dataPath.ToUniversalPath().Replace("Assets", ""), "");
}
return path.Replace(dataPath.ToUniversalPath(), "Assets");
}
public static string ToUnityFullPath(this string path)
{
if(path.StartsWith("Packages"))
{
var fullPath = (dataPath.ToUniversalPath().Replace("Assets", "") + path);
fullPath ??= (dataPath.ToUniversalPath().Replace("Assets", "Library/PackageCache") + path);
if (!File.Exists(fullPath) && Directory.Exists(fullPath))
{
Debug.LogWarning($"ToUnityFullPath failure:{path}");
}
return fullPath;
}
return dataPath.ToUniversalPath().Replace("Assets", "") + path;
}
public static string ByteString(this byte[] bytes)
{
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
stringBuilder.Append(Convert.ToString(bytes[i], 2) );
}
return stringBuilder.ToString();
}
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: c90ae90b250ea244ca1b14d395893854
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: a251feda1c6acfa418d3cb94f0255dbe
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,81 +0,0 @@
fileFormatVersion: 2
guid: 38356707733942742b1bd8da40abed2e
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
: Any
second:
enabled: 0
settings:
Exclude Android: 1
Exclude Editor: 0
Exclude Linux64: 1
Exclude OSXUniversal: 1
Exclude Win: 1
Exclude Win64: 1
Exclude iOS: 1
- first:
Android: Android
second:
enabled: 0
settings: {}
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: AnyCPU
DefaultValueInitialized: true
OS: Windows
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
iPhone: iOS
second:
enabled: 0
settings: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,87 +0,0 @@
fileFormatVersion: 2
guid: fe95ecf4b38fba648b13da516d4d36b5
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
: Any
second:
enabled: 0
settings:
Exclude Android: 1
Exclude Editor: 0
Exclude Linux64: 1
Exclude OSXUniversal: 1
Exclude Win: 1
Exclude Win64: 1
Exclude iOS: 1
- first:
Android: Android
second:
enabled: 0
settings:
AndroidSharedLibraryType: Executable
CPU: ARMv7
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: AnyCPU
DefaultValueInitialized: true
OS: Windows
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: None
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
iPhone: iOS
second:
enabled: 0
settings:
AddToEmbeddedBinaries: false
CPU: AnyCPU
CompileFlags:
FrameworkDependencies:
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,83 +0,0 @@
fileFormatVersion: 2
guid: f80f2e68fd0af0b4e86097f187a00ffa
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
: Any
second:
enabled: 0
settings:
Exclude Android: 1
Exclude Editor: 0
Exclude Linux64: 1
Exclude OSXUniversal: 1
Exclude Win: 1
Exclude Win64: 1
Exclude iOS: 1
- first:
Android: Android
second:
enabled: 0
settings:
AndroidSharedLibraryType: Executable
CPU: ARMv7
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: AnyCPU
DefaultValueInitialized: true
OS: Windows
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
iPhone: iOS
second:
enabled: 0
settings: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,87 +0,0 @@
fileFormatVersion: 2
guid: 9e4c5c5a6e7fdcf4a9bf7c06b691779d
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
: Any
second:
enabled: 0
settings:
Exclude Android: 1
Exclude Editor: 0
Exclude Linux64: 1
Exclude OSXUniversal: 1
Exclude Win: 1
Exclude Win64: 1
Exclude iOS: 1
- first:
Android: Android
second:
enabled: 0
settings:
AndroidSharedLibraryType: Executable
CPU: ARMv7
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: x86_64
DefaultValueInitialized: true
OS: Windows
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: None
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
iPhone: iOS
second:
enabled: 0
settings:
AddToEmbeddedBinaries: false
CPU: AnyCPU
CompileFlags:
FrameworkDependencies:
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,81 +0,0 @@
fileFormatVersion: 2
guid: 8639b566b8d0cfd4daca122ad15c9c71
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
: Any
second:
enabled: 0
settings:
Exclude Android: 1
Exclude Editor: 0
Exclude Linux64: 1
Exclude OSXUniversal: 1
Exclude Win: 1
Exclude Win64: 1
Exclude iOS: 1
- first:
Android: Android
second:
enabled: 0
settings: {}
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: AnyCPU
DefaultValueInitialized: true
OS: Windows
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
iPhone: iOS
second:
enabled: 0
settings: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,83 +0,0 @@
fileFormatVersion: 2
guid: 1ead4ac145c227142af0602db4c79b87
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
: Any
second:
enabled: 0
settings:
Exclude Android: 1
Exclude Editor: 0
Exclude Linux64: 1
Exclude OSXUniversal: 1
Exclude Win: 1
Exclude Win64: 1
Exclude iOS: 1
- first:
Android: Android
second:
enabled: 0
settings:
AndroidSharedLibraryType: Executable
CPU: ARMv7
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: AnyCPU
DefaultValueInitialized: true
OS: Windows
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
iPhone: iOS
second:
enabled: 0
settings: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,83 +0,0 @@
fileFormatVersion: 2
guid: 78d79268cf082b846a2a63642acc37f4
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
: Any
second:
enabled: 0
settings:
Exclude Android: 1
Exclude Editor: 0
Exclude Linux64: 1
Exclude OSXUniversal: 1
Exclude Win: 1
Exclude Win64: 1
Exclude iOS: 1
- first:
Android: Android
second:
enabled: 0
settings:
AndroidSharedLibraryType: Executable
CPU: ARMv7
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: AnyCPU
DefaultValueInitialized: true
OS: Windows
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
iPhone: iOS
second:
enabled: 0
settings: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,81 +0,0 @@
fileFormatVersion: 2
guid: 3de0577458e380243be22140907c0bc0
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
: Any
second:
enabled: 0
settings:
Exclude Android: 1
Exclude Editor: 0
Exclude Linux64: 1
Exclude OSXUniversal: 1
Exclude Win: 1
Exclude Win64: 1
Exclude iOS: 1
- first:
Android: Android
second:
enabled: 0
settings: {}
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: AnyCPU
DefaultValueInitialized: true
OS: Windows
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
iPhone: iOS
second:
enabled: 0
settings: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,81 +0,0 @@
fileFormatVersion: 2
guid: c945cad0736669340b6639d058b729c8
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
: Any
second:
enabled: 0
settings:
Exclude Android: 1
Exclude Editor: 0
Exclude Linux64: 1
Exclude OSXUniversal: 1
Exclude Win: 1
Exclude Win64: 1
Exclude iOS: 1
- first:
Android: Android
second:
enabled: 0
settings: {}
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: AnyCPU
DefaultValueInitialized: true
OS: Windows
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
iPhone: iOS
second:
enabled: 0
settings: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,83 +0,0 @@
fileFormatVersion: 2
guid: e44a450d127d0824cbc021fc238d7b80
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
: Any
second:
enabled: 0
settings:
Exclude Android: 1
Exclude Editor: 0
Exclude Linux64: 1
Exclude OSXUniversal: 1
Exclude Win: 1
Exclude Win64: 1
Exclude iOS: 1
- first:
Android: Android
second:
enabled: 0
settings:
AndroidSharedLibraryType: Executable
CPU: ARMv7
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: AnyCPU
DefaultValueInitialized: true
OS: Windows
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
iPhone: iOS
second:
enabled: 0
settings: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,81 +0,0 @@
fileFormatVersion: 2
guid: e1cd43f2c984df240a8c23991b2f1e1c
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
: Any
second:
enabled: 0
settings:
Exclude Android: 1
Exclude Editor: 0
Exclude Linux64: 1
Exclude OSXUniversal: 1
Exclude Win: 1
Exclude Win64: 1
Exclude iOS: 1
- first:
Android: Android
second:
enabled: 0
settings: {}
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: AnyCPU
DefaultValueInitialized: true
OS: Windows
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
iPhone: iOS
second:
enabled: 0
settings: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,87 +0,0 @@
fileFormatVersion: 2
guid: 75990583b0a472b44bd9f0946b424361
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
: Any
second:
enabled: 0
settings:
Exclude Android: 1
Exclude Editor: 0
Exclude Linux64: 1
Exclude OSXUniversal: 1
Exclude Win: 1
Exclude Win64: 1
Exclude iOS: 1
- first:
Android: Android
second:
enabled: 0
settings:
AndroidSharedLibraryType: Executable
CPU: ARMv7
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: AnyCPU
DefaultValueInitialized: true
OS: Windows
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: None
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
iPhone: iOS
second:
enabled: 0
settings:
AddToEmbeddedBinaries: false
CPU: AnyCPU
CompileFlags:
FrameworkDependencies:
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,87 +0,0 @@
fileFormatVersion: 2
guid: 4c6f3ef996ab94842b02f3e832349bc1
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
: Any
second:
enabled: 0
settings:
Exclude Android: 1
Exclude Editor: 0
Exclude Linux64: 1
Exclude OSXUniversal: 1
Exclude Win: 1
Exclude Win64: 1
Exclude iOS: 1
- first:
Android: Android
second:
enabled: 0
settings:
AndroidSharedLibraryType: Executable
CPU: ARMv7
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: x86_64
DefaultValueInitialized: true
OS: Windows
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: None
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
iPhone: iOS
second:
enabled: 0
settings:
AddToEmbeddedBinaries: false
CPU: AnyCPU
CompileFlags:
FrameworkDependencies:
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,81 +0,0 @@
fileFormatVersion: 2
guid: 2f19ef81d4f8ae746801dadcb62225a5
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
: Any
second:
enabled: 0
settings:
Exclude Android: 1
Exclude Editor: 0
Exclude Linux64: 1
Exclude OSXUniversal: 1
Exclude Win: 1
Exclude Win64: 1
Exclude iOS: 1
- first:
Android: Android
second:
enabled: 0
settings:
AndroidSharedLibraryType: Executable
CPU: ARMv7
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: x86_64
DefaultValueInitialized: true
OS: Windows
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: None
- first:
iPhone: iOS
second:
enabled: 0
settings:
AddToEmbeddedBinaries: false
CPU: AnyCPU
CompileFlags:
FrameworkDependencies:
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,87 +0,0 @@
fileFormatVersion: 2
guid: 83f2ea0e93026104faa9df07b11e4a1c
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
: Any
second:
enabled: 0
settings:
Exclude Android: 1
Exclude Editor: 0
Exclude Linux64: 1
Exclude OSXUniversal: 1
Exclude Win: 1
Exclude Win64: 1
Exclude iOS: 1
- first:
Android: Android
second:
enabled: 0
settings:
AndroidSharedLibraryType: Executable
CPU: ARMv7
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: AnyCPU
DefaultValueInitialized: true
OS: Windows
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: None
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
iPhone: iOS
second:
enabled: 0
settings:
AddToEmbeddedBinaries: false
CPU: AnyCPU
CompileFlags:
FrameworkDependencies:
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,81 +0,0 @@
fileFormatVersion: 2
guid: 9883f43a7e5cf0a47828e7f96db4726e
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
: Any
second:
enabled: 0
settings:
Exclude Android: 1
Exclude Editor: 0
Exclude Linux64: 1
Exclude OSXUniversal: 1
Exclude Win: 1
Exclude Win64: 1
Exclude iOS: 1
- first:
Android: Android
second:
enabled: 0
settings:
AndroidSharedLibraryType: Executable
CPU: ARMv7
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: x86_64
DefaultValueInitialized: true
OS: Windows
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: None
- first:
iPhone: iOS
second:
enabled: 0
settings:
AddToEmbeddedBinaries: false
CPU: AnyCPU
CompileFlags:
FrameworkDependencies:
userData:
assetBundleName:
assetBundleVariant: