コード例 #1
0
        void DoConversion()
        {
            var log = new StringBuilder();

            try
            {
                // Set serialization mode to mixed then back to force-text to reserialize any assets in binary form
                // that may have somehow persisted (version control makes a state where "Force Text" is enabled with
                // some existing binary assets persisting possible). this happened during testing.
                // mixed doesn't refresh anything, but setting to ForceText re-iterates all assets and double-checks
                // that they are in the correct format.
                EditorSettings.serializationMode = SerializationMode.Mixed;
                EditorSettings.serializationMode = SerializationMode.ForceText;

                EditorApplication.LockReloadAssemblies();

                log.AppendLine("ProBuilder 4 Conversion Log");
                log.AppendLine("");

                if ((m_ConversionReadyState & ConversionReadyState.AssetStoreInstallFound) == ConversionReadyState.AssetStoreInstallFound)
                {
                    log.AppendLine("Removing existing ProBuilder files...");

                    if (RemoveAssetStoreFiles(m_AssetsToDeleteTreeView.GetRoot(), log))
                    {
                        log.AppendLine("\nRemapping Asset Ids...");
                        RemapAssetIds(log);
                    }
                }
                else
                {
                    log.AppendLine("Remapping Asset Ids...");
                    RemapAssetIds(log);
                }
            }
            finally
            {
                m_ConversionLog = log.ToString();

                try
                {
                    Directory.CreateDirectory("Temp");
                    File.WriteAllText(k_ConversionLogPath, m_ConversionLog);
                }
                catch
                {
                    Debug.Log(m_ConversionLog);
                }

                EditorApplication.UnlockReloadAssemblies();
                m_ConversionReadyState       = ConversionReadyState.ConversionRan;
                EditorApplication.delayCall += AssetDatabase.Refresh;
            }
        }
コード例 #2
0
        ConversionReadyState ValidateAssetStoreRemoval()
        {
            ConversionReadyState state = (ConversionReadyState)0;

            List <AssetTreeItem> assets = m_AssetsToDeleteTreeView.GetAssetList();

            if (assets.Any(x => !x.enabled && k_AssetStoreMustDelete.Any(y => x.fullPath.Contains(y))))
            {
                state |= ConversionReadyState.AssetStoreDeleteError;
            }
            else
            {
                state |= ConversionReadyState.Ready;
            }

            if (assets.Any(x => !x.enabled && k_AssetStoreShouldDelete.Any(y => x.fullPath.Contains(y))))
            {
                state |= ConversionReadyState.AssetStoreDeleteWarning;
            }

            return(state);
        }
コード例 #3
0
        void ResetAssetsToDelete()
        {
            m_DeprecatedProBuilderFound = PackageImporter.IsPreProBuilder4InProject();

            if (m_DeprecatedProBuilderFound && !ValidateAssetStoreProBuilderRoot(m_DeprecatedProBuilderDirectory))
            {
                m_DeprecatedProBuilderDirectory = FindAssetStoreProBuilderInstall();
            }

            // If still no old folder found (and PackageImporter tells us one exists), ask the user to point it out
            if (m_DeprecatedProBuilderFound && !ValidateAssetStoreProBuilderRoot(m_DeprecatedProBuilderDirectory))
            {
                int res = EditorUtility.DisplayDialogComplex(
                    "Could Not Find Existing ProBuilder Directory",
                    "Would you like to manually select the Asset Store installed ProBuilder folder and continue with the conversion process, or continue without removing old ProBuilder files (not recommended)?",
                    "Select Folder",
                    "Continue",
                    "Cancel");

                if (res == k_DialogOkay)
                {
                    // if they don't get it right after 3 attempts it's probably not going to happen and they'll be annoyed at
                    // an inescapable dialog loop
                    int userDirectoryPickAttempts = 0;

                    while (userDirectoryPickAttempts++ < 3)
                    {
                        m_DeprecatedProBuilderDirectory = EditorUtility.OpenFolderPanel("Select ProBuilder Directory", "Assets", "");

                        if (string.IsNullOrEmpty(m_DeprecatedProBuilderDirectory))
                        {
                            UnityEngine.Debug.LogWarning("Canceling ProBuilder Asset Store to Package Manager conversion. You may start this process again at any time by accessing the 'Tools>ProBuilder>Repair>Convert to ProBuilder 4' menu item.");
                            EditorApplication.delayCall += Close;
                            break;
                        }

                        if (ValidateAssetStoreProBuilderRoot(m_DeprecatedProBuilderDirectory))
                        {
                            // got a good directory, continue with process
                            break;
                        }
                        else
                        {
                            if (!EditorUtility.DisplayDialog("Selected Folder is not a ProBuilder Install",
                                                             "The folder selected not an old version of ProBuilder. Would you like to select a different directory?", "Yes",
                                                             "Cancel"))
                            {
                                EditorApplication.delayCall += Close;
                                break;
                            }
                        }
                    }
                }
                else if (res == k_DialogCancel)
                {
                    UnityEngine.Debug.LogWarning("Canceling ProBuilder Asset Store to Package Manager conversion. You may start this process again at any time by accessing the 'Tools>ProBuilder>Repair>Convert to ProBuilder 4' menu item.");
                    EditorApplication.delayCall += Close;
                }
            }

            m_AssetsToDeleteTreeView.directoryRoot = m_DeprecatedProBuilderDirectory;
            m_AssetsToDeleteTreeView.SetDirectoryIgnorePatterns(k_AssetStoreDirectorySuggestedDeleteIgnoreFilter);
            m_AssetsToDeleteTreeView.SetFileIgnorePatterns(k_AssetStoreSuggestedFileDeleteIgnoreFilter);
            m_AssetsToDeleteTreeView.Reload();
            m_AssetsToDeleteTreeView.ExpandAll();
            m_MultiColumnHeader.ResizeToFit();
            m_ConversionReadyState = GetReadyState();
        }
コード例 #4
0
        void OnGUI()
        {
            Styles.Init();

            if (m_ConversionReadyState == ConversionReadyState.NoActionRequired ||
                m_ConversionReadyState == ConversionReadyState.ConversionRan)
            {
                if (!string.IsNullOrEmpty(m_ConversionLog))
                {
                    m_ConversionLogScroll = EditorGUILayout.BeginScrollView(m_ConversionLogScroll);
                    GUILayout.Label(m_ConversionLog, EditorStyles.wordWrappedLabel);
                    EditorGUILayout.EndScrollView();
                }
                else
                {
                    GUI.Label(new Rect(0, 0, position.width, position.height), "ProBuilder is up to date!",
                              EditorStyles.centeredGreyMiniLabel);

                    if (Event.current.type == EventType.ContextClick)
                    {
                        var menu = new GenericMenu();
                        menu.AddItem(new GUIContent("Find and replace deprecated Asset IDs"), false, () =>
                        {
                            var log = new StringBuilder();
                            RemapAssetIds(log);
                            Debug.Log(log);
                        });
                        menu.ShowAsContext();
                    }
                }
                return;
            }
            else if ((m_ConversionReadyState & ConversionReadyState.AssetStoreInstallFound) > 0)
            {
                GUILayout.Label("Obsolete Files to Delete", EditorStyles.boldLabel);

                m_AssetTreeRect = GUILayoutUtility.GetRect(position.width, 128, GUILayout.ExpandHeight(true));

                EditorGUI.BeginChangeCheck();

                DrawTreeSettings();

                m_AssetsToDeleteTreeView.OnGUI(m_AssetTreeRect);

                if (EditorGUI.EndChangeCheck())
                {
                    m_ConversionReadyState = GetReadyState();
                }
            }
            else if ((m_ConversionReadyState & ConversionReadyState.DeprecatedAssetIdsFound) > 0)
            {
                var deprecatedIdsRect = GUILayoutUtility.GetRect(position.width, 32, GUILayout.ExpandHeight(true));
                GUI.Label(deprecatedIdsRect, "References to old ProBuilder install found.\n\nProject is ready for conversion.",
                          EditorStyles.centeredGreyMiniLabel);
            }

            if ((m_ConversionReadyState & ConversionReadyState.SerializationError) > 0)
            {
                EditorGUILayout.HelpBox(
                    "Cannot update project with binary or mixed serialization.\n\nPlease swith to ForceText serialization to proceed (you may switch back to ForceBinary or Mixed after the conversion process).",
                    MessageType.Error);

                SerializationMode serializationMode = EditorSettings.serializationMode;

                EditorGUI.BeginChangeCheck();

                serializationMode = (SerializationMode)EditorGUILayout.EnumPopup("Serialization Mode", serializationMode);

                if (EditorGUI.EndChangeCheck())
                {
                    EditorSettings.serializationMode = serializationMode;
                    m_ConversionReadyState           = GetReadyState();
                }
            }

            if ((m_ConversionReadyState & ConversionReadyState.AssetStoreDeleteError) > 0)
            {
                EditorGUILayout.HelpBox(
                    "Cannot update project without removing ProBuilder/Classes and ProBuilder/Editor directories.", MessageType.Error);
            }

            if ((m_ConversionReadyState & ConversionReadyState.AssetStoreDeleteWarning) > 0)
            {
                EditorGUILayout.HelpBox(
                    "Some old ProBuilder files are not marked for deletion. This may cause errors after the conversion process is complete.\n\nTo clear this error use the settings icon to reset the Assets To Delete tree.",
                    MessageType.Warning);
            }

            GUI.enabled =
                (m_ConversionReadyState & (ConversionReadyState.AssetStoreDeleteError | ConversionReadyState.SerializationError)) ==
                ConversionReadyState.Ready;

            GUILayout.BeginHorizontal();
            GUILayout.FlexibleSpace();
            if (GUILayout.Button("Convert to ProBuilder 4", Styles.convertButton))
            {
                DoConversion();
                GUIUtility.ExitGUI();
            }
            GUILayout.FlexibleSpace();
            GUILayout.EndHorizontal();
            #if UNITY_2018_3_OR_NEWER
            GUILayout.Space(16);
            #endif
            GUI.enabled = true;
        }