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)); }
// 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); }
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); } }
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."); } }
/// <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); } }
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); }
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); }
// 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); }
void OnPrefabStageSavedAsNewPrefab(PrefabStage prefabStage) { // Current open path has changed: update state in breadcrumbs currentItem.SetPrefabAssetPath(prefabStage.prefabAssetPath); }