public static void createCopyBrush(bool destroySourceTiles) { YuME_tileFunctions.checkTileSelectionStatus(); if (YuME_mapEditor.currentBrushType != YuME_mapEditor.brushTypes.copyBrush && YuME_mapEditor.selectedTiles.Count > 0) { YuME_mapEditor.currentBrushType = YuME_mapEditor.brushTypes.copyBrush; if (YuME_mapEditor.brushTile != null) { DestroyImmediate(YuME_mapEditor.brushTile); } if (YuME_mapEditor.findTileMapParent()) { Undo.RegisterFullObjectHierarchyUndo(YuME_mapEditor.tileMapParent, "Create Brush"); YuME_mapEditor.brushTile = new GameObject(); YuME_mapEditor.brushTile.transform.eulerAngles = new Vector3(YuME_mapEditor.tileRotationX, YuME_mapEditor.tileRotation, 0f); YuME_mapEditor.brushTile.transform.parent = YuME_mapEditor.tileMapParent.transform; YuME_mapEditor.brushTile.name = "YuME_brushTile"; YuME_mapEditor.brushTile.transform.position = YuME_mapEditor.selectedTiles[0].transform.position; YuME_mapEditor.tileChildObjects.Clear(); foreach (GameObject tile in YuME_mapEditor.selectedTiles) { #if UNITY_2018_3_OR_NEWER GameObject tempTile = (GameObject)PrefabUtility.InstantiatePrefab(PrefabUtility.GetCorrespondingObjectFromSource(tile) as GameObject); #else GameObject tempTile = (GameObject)PrefabUtility.InstantiatePrefab(PrefabUtility.GetPrefabParent(tile) as GameObject); #endif tempTile.transform.parent = YuME_mapEditor.brushTile.transform; tempTile.transform.position = tile.transform.position; tempTile.transform.eulerAngles = tile.transform.eulerAngles; tempTile.transform.localScale = tile.transform.localScale; YuME_mapEditor.tileChildObjects.Add(tempTile); if (destroySourceTiles) { DestroyImmediate(tile); } } YuME_mapEditor.selectedTiles.Clear(); YuME_mapEditor.showWireBrush = false; } } }
public static void createCustomBrush(string customBrushName) { subMeshCount = 0; YuME_tileFunctions.checkTileSelectionStatus(); GameObject tileParentObject = new GameObject(); tileParentObject.AddComponent <YuME_tileGizmo>(); tileParentObject.GetComponent <YuME_tileGizmo>().customBrushMeshName = new List <string>(); string customBrushGUID = Guid.NewGuid().ToString("N"); tileParentObject.name = customBrushName + "_YuME.prefab"; string destinationPath = YuTools_Utils.getAssetPath(YuME_mapEditor.availableTileSets[YuME_mapEditor.currentTileSetIndex]) + "CustomBrushes/"; if (YuME_mapEditor.selectedTiles.Count > 0) { // When creating a custom brush we need to find the lowest Z transform in the selection to become the pivot transform GameObject bottomLevelOfSelection = YuME_mapEditor.selectedTiles[0]; foreach (GameObject checkObjects in YuME_mapEditor.selectedTiles) { if (checkObjects.transform.position.z < bottomLevelOfSelection.transform.position.z) { bottomLevelOfSelection = checkObjects; } } // center the parent object around the lowest block to make sure all the selected brushes are centered around the parent tileParentObject.transform.position = bottomLevelOfSelection.transform.position; // New Custom Brush implementation. Uses a technique similar to the freeze map, except for selected tils List <GameObject> tilesToCombine = new List <GameObject>(); List <Transform> _freezeTiles = new List <Transform>(); List <Transform> freezeTiles = new List <Transform>(); foreach (GameObject tile in YuME_mapEditor.selectedTiles) { tile.GetComponentsInChildren <Transform>(false, _freezeTiles); freezeTiles.AddRange(_freezeTiles); } foreach (Transform tile in freezeTiles) { if (tile.GetComponent <MeshRenderer>()) { tilesToCombine.Add(tile.gameObject); } } tilesToCombine = tilesToCombine.OrderBy(x => x.GetComponent <MeshRenderer>().sharedMaterial.name).ToList(); Material previousMaterial = tilesToCombine[0].GetComponent <MeshRenderer>().sharedMaterial; List <CombineInstance> combine = new List <CombineInstance>(); CombineInstance tempCombine = new CombineInstance(); int vertexCount = 0; foreach (GameObject mesh in tilesToCombine) { vertexCount += mesh.GetComponent <MeshFilter>().sharedMesh.vertexCount; if (vertexCount > 60000) { vertexCount = 0; newSubMesh(combine, mesh.GetComponent <MeshRenderer>().sharedMaterial, tileParentObject, destinationPath, customBrushGUID); combine = new List <CombineInstance>(); } if (mesh.GetComponent <MeshRenderer>().sharedMaterial.name != previousMaterial.name) { newSubMesh(combine, previousMaterial, tileParentObject, destinationPath, customBrushGUID); combine = new List <CombineInstance>(); } tempCombine.mesh = mesh.GetComponent <MeshFilter>().sharedMesh; tempCombine.transform = mesh.GetComponent <MeshFilter>().transform.localToWorldMatrix; combine.Add(tempCombine); previousMaterial = mesh.GetComponent <MeshRenderer>().sharedMaterial; } newSubMesh(combine, previousMaterial, tileParentObject, destinationPath, customBrushGUID); tileParentObject.transform.position = Vector3.zero; // Add the prefab to the project #if UNITY_2018_3_OR_NEWER PrefabUtility.SaveAsPrefabAsset(tileParentObject, destinationPath + tileParentObject.name); #else PrefabUtility.CreatePrefab(destinationPath + tileParentObject.name, tileParentObject); #endif AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); // refesh the asset database to tell unity changes have been made // remove our temporary builder object Debug.Log("Custom Brush " + tileParentObject.name + " created."); DestroyImmediate(tileParentObject); YuME_mapEditor.selectedTiles.Clear(); // reload the custom brushes YuME_mapEditor.loadCustomBrushes(); } }