Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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();
        }
Пример #4
0
        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);
            }
        }