public static Prefab CreateFromSelectedObjects(Pivot prefabPivot) { // Ensure that all necessary data is in place ObjectSelectionPrefabCreationSettings prefabCreationSettings = ObjectSelectionPrefabCreationSettings.Get(); if (string.IsNullOrEmpty(prefabCreationSettings.PrefabName) || string.IsNullOrEmpty(prefabCreationSettings.DestinationFolder)) { return(null); } if (ObjectSelection.Get().NumberOfSelectedObjects == 0) { return(null); } List <GameObject> allSelectedObjects = ObjectSelection.Get().GetAllSelectedGameObjects(); if (allSelectedObjects.Count == 0) { return(null); } // Check if a prefab with the same name already exists bool shouldPrefabBeCreated = true; GameObject prefabWithSameName = ProjectAssetDatabase.LoadPrefabWithNameInFolder(prefabCreationSettings.PrefabName, prefabCreationSettings.DestinationFolder, false); if (prefabWithSameName != null) { if (EditorUtility.DisplayDialog("Are you sure?", "A prefab with the specified name already exists in the specified folder. Would you like to overwrite it?", "Yes", "No")) { // If the user chose 'Yes', we have to remove the existing prefab from its category PrefabCategory categoryWhichContainsSamePrefab = PrefabCategoryDatabase.Get().GetPrefabCategoryWhichContainsPrefab(prefabWithSameName); if (categoryWhichContainsSamePrefab != null) { categoryWhichContainsSamePrefab.RemoveAndDestroyPrefab(prefabWithSameName); } } else { shouldPrefabBeCreated = false; } } if (!shouldPrefabBeCreated) { return(null); } // Create all the objects which will reside in the prefab hierarchy GameObject prefabRoot = new GameObject(prefabCreationSettings.PrefabName); Box objectCollectionWorldBox = Box.GetInvalid(); var allObjectsInPrefabHierarchy = new List <GameObject>(); foreach (GameObject gameObject in allSelectedObjects) { Transform gameObjectTransform = gameObject.transform; GameObject gameObjectClone = Octave3DWorldBuilder.Instantiate(gameObject, gameObjectTransform.position, gameObjectTransform.rotation) as GameObject; allObjectsInPrefabHierarchy.Add(gameObjectClone); Transform cloneTransform = gameObjectClone.transform; gameObjectClone.name = gameObject.name; cloneTransform.localScale = gameObjectTransform.lossyScale; if (objectCollectionWorldBox.IsValid()) { objectCollectionWorldBox.Encapsulate(gameObjectClone.GetWorldBox()); } else { objectCollectionWorldBox = gameObjectClone.GetWorldBox(); } } // Now calculate the root object's position based on the specified pivot point Transform prefabRootTransform = prefabRoot.transform; if (prefabPivot == Pivot.Center) { prefabRootTransform.position = objectCollectionWorldBox.Center; } else if (prefabPivot == Pivot.BottomCenter) { prefabRootTransform.position = objectCollectionWorldBox.GetBoxFaceCenter(BoxFace.Bottom); } // Now that the root object's position is in place, attach all objects as children of the root foreach (GameObject gameObject in allObjectsInPrefabHierarchy) { gameObject.transform.parent = prefabRootTransform; } // Create the prefab and assign it to the chosen category GameObject createdUnityPrefab = ProjectAssetDatabase.CreatePrefab(prefabRoot, prefabCreationSettings.PrefabName, prefabCreationSettings.DestinationFolder); if (createdUnityPrefab == null) { return(null); } UndoEx.RecordForToolAction(prefabCreationSettings.DestinationCategory); Prefab createdPrefab = PrefabFactory.Create(createdUnityPrefab); prefabCreationSettings.DestinationCategory.AddPrefab(createdPrefab); Octave3DWorldBuilder.DestroyImmediate(prefabRoot); PrefabManagementWindow.Get().RepaintOctave3DWindow(); return(createdPrefab); }
private void RenderPrefabPreviewRows() { for (int prefabIndex = 0; prefabIndex < _filteredPrefabs.Count; ++prefabIndex) { // Start a new row? if (prefabIndex % ViewData.NumberOfPrefabsPerRow == 0) { if (prefabIndex != 0) { EditorGUILayout.EndHorizontal(); } EditorGUILayout.BeginHorizontal(); } // Render the prefab entry Prefab prefab = _filteredPrefabs[prefabIndex]; var previewButtonRenderData = new PrefabPreviewButtonRenderData(); previewButtonRenderData.ExtractFromPrefab(prefab, ViewData.PrefabPreviewScale); EditorGUILayout.BeginVertical(GUILayout.Width(previewButtonRenderData.ButtonWidth)); // Render the prefab preview button EditorGUIColor.Push(prefab == _prefabCategory.ActivePrefab ? ViewData.ActivePrefabTint : Color.white); if (EditorGUILayoutEx.PrefabPreview(prefab, true, previewButtonRenderData)) { ObjectPlacementSettings placementSettings = ObjectPlacementSettings.Get(); if (placementSettings.ObjectPlacementMode == ObjectPlacementMode.DecorPaint && placementSettings.DecorPaintObjectPlacementSettings.DecorPaintMode == DecorPaintMode.Brush && DecorPaintObjectPlacementBrushDatabase.Get().ActiveBrush != null && Event.current.button == (int)MouseButton.Right) { UndoEx.RecordForToolAction(DecorPaintObjectPlacementBrushDatabase.Get().ActiveBrush); DecorPaintObjectPlacementBrushElement brushElement = DecorPaintObjectPlacementBrushDatabase.Get().ActiveBrush.CreateNewElement(); brushElement.Prefab = prefab; Octave3DWorldBuilder.ActiveInstance.RepaintAllEditorWindows(); Octave3DWorldBuilder.ActiveInstance.Inspector.Repaint(); } else if (Octave3DWorldBuilder.ActiveInstance.Inspector.ActiveInspectorGUIIdentifier == InspectorGUIIdentifier.ObjectSelection && AllShortcutCombos.Instance.ReplacePrefabsForSelectedObjects.IsActive()) { ObjectSelection.Get().ReplaceSelectedObjectsWithPrefab(prefab); } else { UndoEx.RecordForToolAction(_prefabCategory); _prefabCategory.SetActivePrefab(prefab); } } EditorGUIColor.Pop(); // Render the prefab name labels if necessary if (ViewData.ShowPrefabNames) { Rect previewRectangle = GUILayoutUtility.GetLastRect(); EditorGUILayoutEx.LabelInMiddleOfControlRect(previewRectangle, prefab.Name, previewButtonRenderData.ButtonHeight, GetStyleForPrefabNameLabel()); } // Render the remove prefab button if (GUILayout.Button(GetRemovePrefabButtonContent())) { UndoEx.RecordForToolAction(_prefabCategory); _prefabCategory.RemoveAndDestroyPrefab(prefab); Octave3DWorldBuilder.ActiveInstance.Inspector.Repaint(); } EditorGUILayout.EndVertical(); } // End the last row (if any) if (_filteredPrefabs.Count != 0) { EditorGUILayout.EndHorizontal(); } }