private void RenderCreatePrefabButton()
 {
     if (GUILayout.Button(GetContentForCreatePrefabButton(), GUILayout.Width(180.0f)))
     {
         PrefabFactory.CreateFromSelectedObjects(_settings.Pivot);
     }
 }
示例#2
0
        private static void ReadAllPrefabsInCategory(PrefabCategory prefabCategory, XmlNodeList prefabNodes)
        {
            if (prefabNodes.Count == 0)
            {
                return;
            }

            for (int prefabNodeIndex = 0; prefabNodeIndex < prefabNodes.Count; ++prefabNodeIndex)
            {
                XmlNode prefabNode     = prefabNodes[prefabNodeIndex];
                XmlNode prefabNameNode = prefabNode.SelectSingleNode(PrefabConfigXMLInfo.PrefabNameNode);
                XmlNode prefabPathNode = prefabNode.SelectSingleNode(PrefabConfigXMLInfo.PrefabPathNode);
                if (prefabPathNode == null)
                {
                    continue;
                }
                XmlNode offsetFromGridNode   = prefabNode.SelectSingleNode(PrefabConfigXMLInfo.PrefabOffsetFromGridSurfaceNode);
                XmlNode offsetFromObjectNode = prefabNode.SelectSingleNode(PrefabConfigXMLInfo.PrefabOffsetFromObjectSurfaceNode);

                GameObject unityPrefab = AssetDatabase.LoadAssetAtPath(prefabPathNode.InnerText, typeof(GameObject)) as GameObject;
                if (unityPrefab == null)
                {
                    continue;
                }

                Prefab prefab = PrefabFactory.Create(unityPrefab);
                if (prefabNameNode != null && !string.IsNullOrEmpty(prefabNameNode.InnerText))
                {
                    prefab.Name = prefabNameNode.InnerText;
                }

                float offsetFromGrid = 0.0f;
                if (offsetFromGridNode != null)
                {
                    try { offsetFromGrid = float.Parse(offsetFromGridNode.InnerText); }
                    catch (Exception) { }
                }
                prefab.OffsetFromGridSurface = offsetFromGrid;

                float offsetFromObject = 0.0f;
                if (offsetFromObjectNode != null)
                {
                    try { offsetFromObject = float.Parse(offsetFromObjectNode.InnerText); }
                    catch (Exception) { }
                }
                prefab.OffsetFromObjectSurface = offsetFromObject;

                ReadPrefabTagAssociations(prefab, prefabNode.SelectNodes(PrefabConfigXMLInfo.PrefabAssociatedTagNode));
                prefabCategory.AddPrefab(prefab);
            }
        }
示例#3
0
        private void PerformDropUsingFirstPrefabInValidUnityPrefabCollection(List <GameObject> validUnityPrefabs)
        {
            GameObject     firstValidUnityPrefab       = GetFirstUnityPrefabFromValidUnityPrefabsCollection(validUnityPrefabs);
            PrefabCategory categoryWhichContainsPrefab = PrefabCategoryDatabase.Get().GetPrefabCategoryWhichContainsPrefab(firstValidUnityPrefab);

            if (categoryWhichContainsPrefab != null)
            {
                AssignPrefabToDestinationTileConnection(categoryWhichContainsPrefab.GetPrefabByUnityPrefab(firstValidUnityPrefab));
            }
            else
            {
                Prefab firstValidPrefab = GetFirstPrefabFromValidPrefabsCollection(PrefabFactory.Create(validUnityPrefabs));
                CreatePrefabToCategoryAssociationAndAssignPrefabToDestinationTileConnection(firstValidPrefab);
            }
        }
        protected override void PerformDrop()
        {
            if (_dropDestination == DropDestination.Element)
            {
                if (_destinationDecorPaintBrushElement == null)
                {
                    return;
                }

                List <GameObject> validUnityPrefabsInvolvedInDropOperation = PrefabValidator.GetValidPrefabsFromEntityCollection(DragAndDrop.objectReferences, false);
                if (validUnityPrefabsInvolvedInDropOperation.Count != 0)
                {
                    PerformDropUsingFirstPrefabInValidUnityPrefabCollection(validUnityPrefabsInvolvedInDropOperation);
                }
            }
            else
            {
                if (_destinationBrush == null)
                {
                    return;
                }

                List <GameObject> validUnityPrefabs = PrefabValidator.GetValidPrefabsFromEntityCollection(DragAndDrop.objectReferences, false);
                if (validUnityPrefabs.Count != 0)
                {
                    UndoEx.RecordForToolAction(_destinationBrush);
                    foreach (GameObject unityPrefab in validUnityPrefabs)
                    {
                        DecorPaintObjectPlacementBrushElement newElement = _destinationBrush.CreateNewElement();

                        PrefabCategory categoryWhichContainsPrefab = PrefabCategoryDatabase.Get().GetPrefabCategoryWhichContainsPrefab(unityPrefab);
                        if (categoryWhichContainsPrefab != null)
                        {
                            newElement.Prefab = categoryWhichContainsPrefab.GetPrefabByUnityPrefab(unityPrefab);
                        }
                        else
                        {
                            Prefab prefab = PrefabFactory.Create(unityPrefab);
                            UndoEx.RecordForToolAction(_destinationBrush.DestinationCategoryForElementPrefabs);
                            PrefabWithPrefabCategoryAssociationQueue.Instance.Enqueue(PrefabWithPrefabCategoryAssociationFactory.Create(prefab, _destinationBrush.DestinationCategoryForElementPrefabs));
                            newElement.Prefab = prefab;
                        }
                    }
                }
            }

            Octave3DWorldBuilder.ActiveInstance.RepaintAllEditorWindows();
        }
示例#5
0
 public void AddPrefab(GameObject unityPrefab)
 {
     if (!ContainsPrefab(unityPrefab))
     {
         if (!PrefabCategoryDatabase.Get().IsThereCategoryWhichContainsPrefab(unityPrefab))
         {
             Prefab prefab = PrefabFactory.Create(unityPrefab);
             _prefabs.AddEntity(prefab);
         }
         else
         {
             PrefabCategory categoryWhichContainsPrefab = PrefabCategoryDatabase.Get().GetPrefabCategoryWhichContainsPrefab(unityPrefab);
             LogPrefabAlreadyExistsInCategoryMessage(categoryWhichContainsPrefab.Name);
         }
     }
 }
示例#6
0
        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 ExtractAllValidPrefabsInDroppedFolder()
        {
            List <GameObject> validUnityPrefabs = ProjectAssetDatabase.LoadAllValidPrefabsInFolder(FolderPath, _extractPrefabsInSubfolders, true);

            _validPrefabs = PrefabFactory.Create(validUnityPrefabs);
        }
示例#8
0
        private void ExtractAllValidDroppedPrefabs()
        {
            List <GameObject> validUnityPrefabs = PrefabValidator.GetValidPrefabsFromEntityCollection(DragAndDrop.objectReferences, false);

            _validDroppedPrefabs = PrefabFactory.Create(validUnityPrefabs);
        }