public static IEnumerable <ReferenceViewerClassbase> AllReferencedByComponent(GameObject[] currentObjects, ReferenceIgnoreType ignoreType, string search = null) { var list = new List <ReferenceViewerClassbase> (); foreach (var currentObject in currentObjects) { var referencedByList = allReferenceInfo .Where(item => currentObject == ReferenceExplorerUtility.GetGameObject(item.referenceTarget)); if (string.IsNullOrEmpty(search) == false) { var dic = ReferenceExplorerUtility.GetTExtCommand(search); if (dic.ContainsKey("type")) { var typeText = dic ["type"]; referencedByList = referencedByList .Where(item => item.referenceName.ToLower().IndexOf(typeText) != -1 || item.referenceTarget.GetType().FullName.ToLower().IndexOf(typeText) != -1 || item.fromObject.GetType().FullName.ToLower().IndexOf(typeText) != -1 || ReferenceExplorerUtility.GetGameObject(item.fromObject).name.ToLower().IndexOf(typeText) != -1); } if (dic.ContainsKey("obj")) { var objName = dic ["obj"]; referencedByList = referencedByList .Where(item => ReferenceExplorerUtility.GetGameObject(item.fromObject).name.ToLower().IndexOf(objName) != -1); } if (dic.ContainsKey("param")) { var param = dic ["param"]; referencedByList = referencedByList .Where(item => item.referenceName.IndexOf(param) != -1); } } if (ignoreType == ReferenceIgnoreType.IgnoreSelf) { referencedByList = referencedByList.Where(item => currentObject != ReferenceExplorerUtility.GetGameObject(item.fromObject)) .Where(item => currentObjects.Contains(ReferenceExplorerUtility.GetGameObject(item.fromObject)) == false); } else if (ignoreType == ReferenceIgnoreType.IgnoreFamilly) { referencedByList = referencedByList.Where(item => ReferenceExplorerUtility.IsFamilly(item.fromObject, currentObject) == false) .Where(item => currentObjects.Contains(ReferenceExplorerUtility.GetGameObject(item.fromObject)) == false); } var allComponentType = referencedByList .Select(item => item.fromObject.GetType()) .Distinct().OrderBy(item => item.FullName); foreach (var uniqueComponentType in allComponentType) { var componentItme = new ReferenceViewerClassbase(); componentItme.type = uniqueComponentType; componentItme.referenceInfoList = referencedByList .Where(item => item.fromObject.GetType() == uniqueComponentType) .OrderBy(item => ReferenceExplorerUtility.GetGameObject(item.fromObject).name) .ToList(); list.Add(componentItme); } } return(list.Where(item => item.referenceInfoList.Count > 0)); }
public static void ExportObjectReference(bool isContainFamilly, bool isContainCallbacks) { try{ ReferenceExplorerData.RestoreAllData(); EditorUtility.DisplayProgressBar("Export GameObject Graph", "get all objects", 0); var objectNames = ReferenceExplorerData.allReferenceInfo .Where(item => ReferenceExplorerUtility.GetGameObject(item.referenceTarget) != null && ReferenceExplorerUtility.GetGameObject(item.referenceTarget) != null) .SelectMany(item => new GameObject[] { ReferenceExplorerUtility.GetGameObject(item.referenceTarget), ReferenceExplorerUtility.GetGameObject(item.fromObject) }).Distinct(); EditorUtility.DisplayProgressBar("Export GameObject Graph", "check reference", 0.2f); List <ReferenceInfoObject> referenceInfoList = new List <ReferenceInfoObject>(); foreach (var referenceInfo in ReferenceExplorerData.allReferenceInfo) { var fromObject = ReferenceExplorerUtility.GetGameObject(referenceInfo.fromObject); var targetObject = ReferenceExplorerUtility.GetGameObject(referenceInfo.referenceTarget); if (targetObject == null || fromObject == null) { continue; } if (isContainFamilly == false && ReferenceExplorerUtility.IsFamilly(fromObject, targetObject)) { continue; } if (referenceInfoList.Any(item => ReferenceExplorerUtility.GetGameObject(item.fromObject) == fromObject || ReferenceExplorerUtility.GetGameObject(item.targetObject) == targetObject) == true || fromObject == targetObject) { continue; } referenceInfoList.Add(new ReferenceInfoObject() { targetObject = fromObject, fromObject = targetObject, }); } EditorUtility.DisplayProgressBar("Export GameObject Graph", "exporting", 0.7f); StringBuilder exportBuilder = new StringBuilder(); exportBuilder.AppendLine("graph"); exportBuilder.AppendLine("["); foreach (var objName in objectNames) { if (referenceInfoList.Any(item => item.fromObject == objName || item.targetObject == objName) == false) { continue; } var isPrefab = PrefabUtility.GetPrefabObject(objName) == null; exportBuilder.AppendLine(" node"); exportBuilder.AppendLine(" ["); exportBuilder.AppendLine(" id "+ objName.GetHashCode()); exportBuilder.AppendLine(" label \""+ objName.name + "\""); exportBuilder.AppendLine(" graphics"); exportBuilder.AppendLine(" ["); if (isPrefab) { exportBuilder.AppendLine(" fill \"#FFFF99\""); } exportBuilder.AppendLine(" w "+ objName.name.Length * 10); exportBuilder.AppendLine(" ]"); exportBuilder.AppendLine(" ]"); } foreach (var referenceInfo in referenceInfoList) { exportBuilder.AppendLine(" edge"); exportBuilder.AppendLine(" ["); exportBuilder.AppendLine(" target "+ referenceInfo.fromObject.GetHashCode()); exportBuilder.AppendLine(" source "+ referenceInfo.targetObject.GetHashCode()); exportBuilder.AppendLine(" ]"); } exportBuilder.AppendLine("]"); EditorUtility.DisplayProgressBar("Export GameObject Graph", "done", 0.7f); System.IO.File.WriteAllText(System.DateTime.Now.ToFileTime() + ".gml", exportBuilder.ToString()); }finally{ EditorUtility.ClearProgressBar(); } }