示例#1
0
 internal void PrefabStageDirtinessChanged(PrefabStage prefabStage)
 {
     if (prefabStageDirtinessChanged != null)
     {
         prefabStageDirtinessChanged(prefabStage);
     }
 }
        internal PrefabStage OpenPrefabMode(string prefabAssetPath, GameObject instanceRoot, Analytics.ChangeType changeTypeAnalytics)
        {
            if (EditorApplication.isPlaying)
            {
                bool blockPrefabModeInPlaymode = CheckIfAnyComponentShouldBlockPrefabModeInPlayMode(prefabAssetPath);
                if (blockPrefabModeInPlaymode)
                {
                    return(null);
                }
            }

            PrefabStage prefabStage = GetCurrentPrefabStage();
            bool        setAsFirstItemAfterMainStage = prefabStage == null || !IsPartOfPrefabStage(instanceRoot, prefabStage);

            var    previousSelection = Selection.activeGameObject;
            UInt64 previousFileID    = (instanceRoot != null) ? GetFileIDForCorrespondingObjectFromSourceAtPath(previousSelection, prefabAssetPath) : 0;

            if (SwitchToStage(m_NavigationHistory.GetOrCreatePrefabStage(prefabAssetPath), setAsFirstItemAfterMainStage, false, changeTypeAnalytics))
            {
                // If selection did not change by switching stage (by us or user) then handle automatic selection in new prefab mode
                if (Selection.activeGameObject == previousSelection)
                {
                    HandleSelectionWhenSwithingToNewPrefabMode(GetCurrentPrefabStage().prefabContentsRoot, previousFileID);
                }
            }
            SceneView.RepaintAll();

            var newPrefabStage = m_PrefabStages.Last();

            Assert.IsTrue(newPrefabStage.prefabAssetPath == prefabAssetPath);
            return(newPrefabStage);
        }
 static bool IsPartOfPrefabStage(GameObject gameObject, PrefabStage prefabStage)
 {
     if (gameObject == null)
     {
         return(false);
     }
     return(FindGameObjectRecursive(prefabStage.prefabContentsRoot.transform, gameObject));
 }
示例#4
0
        // Returns false if the user clicked Cancel to save otherwise returns true
        internal bool AskUserToSaveModifiedPrefabStageBeforeDestroyingStage(PrefabStage prefabStage)
        {
            if (prefabStage != null)
            {
                return(prefabStage.AskUserToSaveDirtySceneBeforeDestroyingScene());
            }

            return(true);
        }
        internal static bool IsGameObjectThePrefabRootInAnyPrefabStage(GameObject gameObject)
        {
            PrefabStage prefabStage = GetCurrentPrefabStage();

            if (prefabStage != null && prefabStage.isValid)
            {
                return(prefabStage.prefabContentsRoot == gameObject);
            }
            return(false);
        }
示例#6
0
        void DestroyPrefabStage(PrefabStage prefabStage)
        {
            if (prefabStage == null)
            {
                return;
            }

            prefabStage.CloseStage();
            m_PrefabStages.Remove(prefabStage);
        }
        internal static PrefabStage OpenPrefabMode(string prefabAssetPath, GameObject openedFromInstance, PrefabStage.Mode prefabStageMode, StageNavigationManager.Analytics.ChangeType changeTypeAnalytics)
        {
            if (EditorApplication.isPlaying)
            {
                bool blockPrefabModeInPlaymode = CheckIfAnyComponentShouldBlockPrefabModeInPlayMode(prefabAssetPath);
                if (blockPrefabModeInPlaymode)
                {
                    return(null);
                }
            }

            PrefabStage prevPrefabStage = GetCurrentPrefabStage();
            bool        setAsFirstItemAfterMainStage = prevPrefabStage == null || !IsPartOfPrefabStage(openedFromInstance, prevPrefabStage);

            var    previousSelection = Selection.activeGameObject;
            UInt64 previousFileID    = (openedFromInstance != null) ? GetFileIDForCorrespondingObjectFromSourceAtPath(previousSelection, prefabAssetPath) : 0;

            // Ensure valid prefabStageMode (if no context then do not allow Prefab Mode in Context)
            if (openedFromInstance == null && prefabStageMode != PrefabStage.Mode.InIsolation)
            {
                prefabStageMode = PrefabStage.Mode.InIsolation;
            }

            Stage contextStage = null;

            if (prefabStageMode == PrefabStage.Mode.InContext)
            {
                var stageHistory = StageNavigationManager.instance.stageHistory;
                contextStage = stageHistory[stageHistory.Count - 1].GetContextStage();
            }

            var prefabStage = GetExistingPrefabStage(prefabAssetPath, openedFromInstance, prefabStageMode);

            if (prefabStage == null)
            {
                prefabStage = PrefabStage.CreatePrefabStage(prefabAssetPath, openedFromInstance, prefabStageMode, contextStage);
            }
            if (StageNavigationManager.instance.SwitchToStage(prefabStage, setAsFirstItemAfterMainStage, changeTypeAnalytics))
            {
                // If selection did not change by switching stage by us or user (or if current selection is not part of
                // the opened prefab stage) then handle automatic selection in new prefab mode.
                if (Selection.activeGameObject == previousSelection || !prefabStage.IsPartOfPrefabContents(Selection.activeGameObject))
                {
                    HandleSelectionWhenSwithingToNewPrefabMode(GetCurrentPrefabStage().prefabContentsRoot, previousFileID);
                }

                SceneView.RepaintAll();
                return(prefabStage);
            }
            else
            {
                // Failed to switch to new stage
                return(null);
            }
        }
示例#8
0
 internal void PrefabStageReloaded(PrefabStage prefabStage)
 {
     if (prefabStage == currentItem.prefabStage)
     {
         if (prefabStageReloaded != null)
         {
             prefabStageReloaded(currentItem);
         }
     }
     else
     {
         Debug.LogError("Reloading a Prefab scene that is not the current stage is not supported currently.");
     }
 }
示例#9
0
 /// <summary>
 /// 检测是否处于Prefab Mode
 /// </summary>
 /// <param name="prefabStage"></param>
 /// <returns></returns>
 public static bool CheckIsPrefabMode(out UnityEditor.SceneManagement.PrefabStage prefabStage)
 {
     prefabStage = UnityEditor.SceneManagement.PrefabStageUtility.GetCurrentPrefabStage();
     if (prefabStage != null)
     {
         // 当前正处于Prefab Mode
         return(true);
     }
     else
     {
         // 当前没有处于Prefab Mode
         return(false);
     }
 }
示例#10
0
    public static void SavePrefab(UnityEditor.SceneManagement.PrefabStage prefabStage)
    {
        if (prefabStage == null)
        {
            throw new ArgumentNullException();
        }

        var savePrefabMethod = prefabStage.GetType().GetMethod("SavePrefab", BindingFlags.NonPublic | BindingFlags.Instance);

        if (savePrefabMethod == null)
        {
            throw new InvalidOperationException();
        }

        savePrefabMethod.Invoke(prefabStage, null);
    }
示例#11
0
        internal bool SwitchToStage(StageNavigationItem newStage, bool setAsFirstItemAfterMainStage, bool setPreviousSelection, Analytics.ChangeType changeTypeAnalytics)
        {
            if (newStage.isPrefabStage && !newStage.prefabAssetExists)
            {
                Debug.LogError("Cannot switch to new stage! Prefab asset does not exist: " + (!string.IsNullOrEmpty(newStage.prefabAssetPath) ? newStage.prefabAssetPath : newStage.prefabAssetGUID));
                {
                    return(false);
                }
            }

            StopAnimationPlaybackAndPreviewing();

            // Close current stage (returns false if user cancels closing prefab scene)
            if (!CleanupCurrentStageBeforeSwitchingStage())
            {
                return(false);
            }

            newStage.setSelectionAndScrollWhenBecomingCurrentStage = setPreviousSelection;

            if (stageChanging != null)
            {
                stageChanging(currentItem, newStage);
            }

            // Switch to new stage.
            if (!newStage.isMainStage)
            {
                // Create prefab stage and add it to the list of Prefab stages before loading the prefab contents so the
                // user callbacks Awake and OnEnable are able to query the current prefab stage
                PrefabStage prefabStage = new PrefabStage();
                m_PrefabStages.Add(prefabStage);

                var success = prefabStage.OpenStage(newStage.prefabAssetPath);
                if (!success)
                {
                    m_PrefabStages.RemoveAt(m_PrefabStages.Count - 1);
                    return(false);
                }
            }

            // Set new stage after we allowed the user to cancel changing stage
            OnStageSwitched(newStage, setAsFirstItemAfterMainStage, changeTypeAnalytics);

            return(true);
        }
示例#12
0
        // Use public API StageUtility.GetCurrentStage
        internal static StageHandle GetCurrentStageHandle()
        {
            PrefabStage prefabStage = PrefabStageUtility.GetCurrentPrefabStage();

            if (prefabStage == null)
            {
                return new StageHandle()
                       {
                           m_IsMainStage = true
                       }
            }
            ;
            else
            {
                return new StageHandle()
                       {
                           m_CustomScene = prefabStage.scene
                       }
            };
        }
        internal static bool IsGameObjectInInvalidPrefabStage(GameObject gameObject)
        {
            PrefabStage prefabStage = GetCurrentPrefabStage();

            return(prefabStage != null && prefabStage.scene == gameObject.scene && !prefabStage.isValid);
        }
示例#14
0
 void OnPrefabStageSavedAsNewPrefab(PrefabStage prefabStage)
 {
     // Current open path has changed: update state in breadcrumbs
     currentItem.SetPrefabAssetPath(prefabStage.prefabAssetPath);
 }