//生成引用关系文件,保存asset public static void CreateReferenceAsset() { referenceAsset = ScriptableObject.CreateInstance <ReferenceAsset>(); referenceAsset.infoList = new List <ReferenceInfo>(); foreach (string assetPath in referenceCache.Keys) { ReferenceInfo info = new ReferenceInfo(); info.path = assetPath; info.guid = AssetDatabase.AssetPathToGUID(info.path); info.parents = new List <string>(); foreach (string referencerPath in referenceCache[assetPath]) { ReferenceInfo referencerInfo = new ReferenceInfo(); referencerInfo.path = referencerPath; referencerInfo.guid = AssetDatabase.AssetPathToGUID(referencerInfo.path); info.parents.Add(referencerPath); } referenceAsset.infoList.Add(info); } AssetDatabase.CreateAsset(referenceAsset, "Assets/ReferenceAsset.asset"); //AssetDatabase.SaveAssets(); //AssetDatabase.Refresh(); }
private static void SetAssetBundleNameReferenceMode(string path) { if (alreadyProcessedPath.Contains(path)) { return; } alreadyProcessedPath.Add(path); ReferenceInfo info = CFindReferencesInProject.getReferenceInfoByPath(path); AssetImporter importer = AssetImporter.GetAtPath(path); Assert.AreNotEqual(importer, null, "path not found:" + path); if (info.parents.Count == 0) { //没有被引用 setAssetBundleNameFilter(importer, info.path); } else if (info.parents.Count == 1) { //只被一个对象引用了 setAssetBundleNameFilter(importer, info.parents[0]); } else { //被多个对象引用了 bool allParentsSameAbName = true; string parentAbName = null; for (int i = 0; i < info.parents.Count; i++) { AssetImporter parentImporter = AssetImporter.GetAtPath(info.parents[i]); if (parentAbName == null) { parentAbName = parentImporter.assetBundleName; } else if (parentAbName != parentImporter.assetBundleName) { allParentsSameAbName = false; break; } } if (allParentsSameAbName) { //多个对象属于同一个ab,设置为父对象的ab名字 importer.assetBundleName = parentAbName; } else { //多对象属于不同的ab,单独打包 setAssetBundleNameFilter(importer, info.path); } } //处理引用的其他资源 SetAssetBundleNameReferenceModeDependencies(info.path); }
private static string FindRoot(ReferenceInfo info) { if (allreadyFoundPaths.Contains(info.path)) { return(null); } allreadyFoundPaths.Add(info.path); string path = info.path; while (info.parents != null && info.parents.Count > 0) { foreach (string parentPath in info.parents) { ReferenceInfo parentInfo = getReferenceInfoByPath(parentPath); return(FindRoot(parentInfo)); } } return(path); }