static bool IsEditable(Asset asset, AssetGroupViewData failures) { if (asset.readOnly || asset.locked) { failures.AddEntry(asset.path, $"readOnly = {asset.readOnly}, locked = {asset.locked}"); return(false); } // do not append to failures if it is a readonly package var packageInfo = UnityEditor.PackageManager.PackageInfo.FindForAssetPath(asset.assetPath); return(packageInfo == null || packageInfo.source == PackageSource.Embedded || packageInfo.source == PackageSource.Local); }
static bool IsEditable(AssetList assetList, AssetGroupViewData failures) { if (!Provider.enabled || !Provider.isActive || !Provider.CheckoutIsValid(assetList, CheckoutMode.Both)) { return(true); } var task = Provider.Checkout(assetList, CheckoutMode.Both); task.Wait(); if (!task.success) { foreach (var asset in assetList) { failures.AddEntry(asset.assetPath, "Checkout from version control failed."); } return(false); } return(true); }
void DisplayAssetGroup(AssetGroupViewData group, GUIContent label, string statusMessage, MessageType status) { if (group.Expanded = EditorGUILayout.BeginFoldoutHeaderGroup(group.Expanded, label)) { ++EditorGUI.indentLevel; if (!string.IsNullOrEmpty(statusMessage)) { EditorGUILayout.HelpBox(statusMessage, status); } foreach (var path in group.AssetPathsAndStatuses) { var rowRect = EditorGUI.IndentedRect( EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight) ); s_TempContent.text = path.Key; s_TempContent.tooltip = path.Value; GUI.Label(new Rect(rowRect) { xMax = rowRect.xMax - Styles.FindAssetButtonWidth }, s_TempContent); if ( GUI.Button(new Rect(rowRect) { xMin = rowRect.xMax - Styles.FindAssetButtonWidth }, Content.FindAsset) ) { EditorGUIUtility.PingObject(AssetDatabase.LoadMainAssetAtPath(path.Key)); } } --EditorGUI.indentLevel; } EditorGUILayout.EndFoldoutHeaderGroup(); }
static void UpgradePrefabAsset(Asset asset, AssetList prefabsWithShapes, ICollection <Asset> upgradedAssets, AssetGroupViewData successes, AssetGroupViewData failures ) { // exit if we have already upgraded the asset (e.g. it is a parent and we already upgraded it via a variant) if (upgradedAssets.Contains(asset)) { return; } upgradedAssets.Add(asset); // exit if it is a prefab parent that doesn't actually have any shapes if (!prefabsWithShapes.Contains(asset)) { return; } GameObject prefab = null; try { prefab = PrefabUtility.LoadPrefabContents(asset.path); } catch (Exception e) { failures.AddEntry(asset.path, $"{e.Message}\n\n{e.StackTrace}"); return; } // if the prefab is a variant, ensure the prefab it inherits is upgraded first if (PrefabUtility.GetPrefabAssetType(prefab) == PrefabAssetType.Variant) { var sourcePrefab = PrefabUtility.GetCorrespondingObjectFromSource(prefab); var sourceAsset = new Asset(AssetDatabase.GetAssetPath(sourcePrefab)); UpgradePrefabAsset(sourceAsset, prefabsWithShapes, upgradedAssets, successes, failures); } // next upgrade any nested prefabs foreach ( var rootAsset in prefab.GetComponentsInChildren <Transform>(true) .Select(PrefabUtility.GetNearestPrefabInstanceRoot) .Where(r => r != null && r != prefab) // skip if the child is not a nested prefab .Select(r => new Asset(AssetDatabase.GetAssetPath(r))) .Where(r => prefabsWithShapes.Any(a => a.assetPath == r.assetPath)) // skip if the nested prefab isn't one with a shape ) { UpgradePrefabAsset(rootAsset, prefabsWithShapes, upgradedAssets, successes, failures); } bool success = true; try { UpgradePrefabInstance(prefab); PrefabUtility.SaveAsPrefabAsset(prefab, asset.path); } catch (Exception e) { failures.AddEntry(asset.path, $"{e.Message}\n\n{e.StackTrace}"); } finally { PrefabUtility.UnloadPrefabContents(prefab); } if (success) { successes.AddEntry(asset.path, string.Empty); } }