private void OnDestroy() { if (_instance == this) { _instance = null; } }
//Instance handling private void Awake() { if (_instance != null) { Destroy(gameObject); } _instance = this; }
protected override GameObject GetTileObject(ProceduralMapManager proceduralManager) { if (proceduralManager.MapBuildingsScripteableObject.Road == null) { Debug.LogError("Road kit prefab does not exist"); return(null); } //Store where roads are present near this tile NearbyRoadsPos nearbyRoads = NearbyRoadsPos.None; //Loop over each tile to find if we have roads or not foreach (KeyValuePair <NearbyRoadsPos, Vector2Int> dir in Directions) { ETileType type; //Check the type of tile in on the side if (GetTileAtPos(m_gridX + dir.Value.x, m_gridZ + dir.Value.y, out type)) { if (type == ETileType.Road) { //Bitwise operation to add the current dir to the enum for later checks nearbyRoads |= dir.Key; } } } GameObject roadObject = Instantiate(proceduralManager.MapBuildingsScripteableObject.Road); #region Cross and Center //Check every posibility of flag composition to decide what kind of road goes in the current tile //Check if the road is a center pice if (Enum.GetValues(typeof(NearbyRoadsPos)).Cast <NearbyRoadsPos>().All((otherFlag) => { return((nearbyRoads & otherFlag) == otherFlag); })) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.Center, RoadObject.RoadObjectOrientation.North); return(roadObject); } //Check if it is a X crossroad if (nearbyRoads == (NearbyRoadsPos.North | NearbyRoadsPos.South | NearbyRoadsPos.East | NearbyRoadsPos.West)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.Cross, RoadObject.RoadObjectOrientation.North); return(roadObject); } #endregion #region Closed End //Check if we have a closed top double sided pedestrian road if ((nearbyRoads & (NearbyRoadsPos.West | NearbyRoadsPos.East | NearbyRoadsPos.North)) == 0) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.ClosedEnd, RoadObject.RoadObjectOrientation.South); return(roadObject); } //Check if we have a closed bottom double sided pedestrian road if ((nearbyRoads & (NearbyRoadsPos.West | NearbyRoadsPos.East | NearbyRoadsPos.South)) == 0) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.ClosedEnd, RoadObject.RoadObjectOrientation.North); return(roadObject); } //Check if we have a closed right double sided pedestrian road if ((nearbyRoads & (NearbyRoadsPos.West | NearbyRoadsPos.South | NearbyRoadsPos.North)) == 0) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.ClosedEnd, RoadObject.RoadObjectOrientation.East); return(roadObject); } //Check if we have a closed left double sided pedestrian road if ((nearbyRoads & (NearbyRoadsPos.East | NearbyRoadsPos.South | NearbyRoadsPos.North)) == 0) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.ClosedEnd, RoadObject.RoadObjectOrientation.West); return(roadObject); } #endregion #region Double sided //Check if we got doubled sided upwards road if ((nearbyRoads & (NearbyRoadsPos.East | NearbyRoadsPos.West)) == 0 && (nearbyRoads & (NearbyRoadsPos.North | NearbyRoadsPos.South)) == (NearbyRoadsPos.North | NearbyRoadsPos.South)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.DoubleSided, RoadObject.RoadObjectOrientation.North); return(roadObject); } //Check if we got doubled sided sidewards road if ((nearbyRoads & (NearbyRoadsPos.North | NearbyRoadsPos.South)) == 0 && (nearbyRoads & (NearbyRoadsPos.East | NearbyRoadsPos.West)) == (NearbyRoadsPos.East | NearbyRoadsPos.West)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.DoubleSided, RoadObject.RoadObjectOrientation.East); return(roadObject); } #endregion #region OpenL //Check if we got a onesided L top closed road if ((nearbyRoads & (NearbyRoadsPos.West | NearbyRoadsPos.North)) == 0 && (nearbyRoads & (NearbyRoadsPos.East | NearbyRoadsPos.South | NearbyRoadsPos.SouthEast)) == (NearbyRoadsPos.East | NearbyRoadsPos.South | NearbyRoadsPos.SouthEast)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.OpenL, RoadObject.RoadObjectOrientation.East); return(roadObject); } //Check if we got a L bottom closed road if ((nearbyRoads & (NearbyRoadsPos.West | NearbyRoadsPos.South)) == 0 && (nearbyRoads & (NearbyRoadsPos.East | NearbyRoadsPos.North | NearbyRoadsPos.NorthEast)) == (NearbyRoadsPos.East | NearbyRoadsPos.North | NearbyRoadsPos.NorthEast)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.OpenL, RoadObject.RoadObjectOrientation.North); return(roadObject); } //Check if we got an onesided reverse L top closed road if ((nearbyRoads & (NearbyRoadsPos.East | NearbyRoadsPos.North)) == 0 && (nearbyRoads & (NearbyRoadsPos.West | NearbyRoadsPos.South | NearbyRoadsPos.SouthWest)) == (NearbyRoadsPos.West | NearbyRoadsPos.South | NearbyRoadsPos.SouthWest)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.OpenL, RoadObject.RoadObjectOrientation.South); return(roadObject); } //Check if we got an onesided reverse L bottom closed road if ((nearbyRoads & (NearbyRoadsPos.East | NearbyRoadsPos.South)) == 0 && (nearbyRoads & (NearbyRoadsPos.West | NearbyRoadsPos.North | NearbyRoadsPos.NortWest)) == (NearbyRoadsPos.West | NearbyRoadsPos.North | NearbyRoadsPos.NortWest)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.OpenL, RoadObject.RoadObjectOrientation.West); return(roadObject); } #endregion #region OneSided //Check if we have an upwards onesided left pedestrian road if ((nearbyRoads & (NearbyRoadsPos.West)) == 0 && (nearbyRoads & (NearbyRoadsPos.East | NearbyRoadsPos.North | NearbyRoadsPos.South | NearbyRoadsPos.NorthEast | NearbyRoadsPos.SouthEast)) == (NearbyRoadsPos.East | NearbyRoadsPos.North | NearbyRoadsPos.South | NearbyRoadsPos.NorthEast | NearbyRoadsPos.SouthEast)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.OneSided, RoadObject.RoadObjectOrientation.North); return(roadObject); } //Check if we have an upwards onesided right pedestrian road if ((nearbyRoads & (NearbyRoadsPos.East)) == 0 && (nearbyRoads & (NearbyRoadsPos.West | NearbyRoadsPos.North | NearbyRoadsPos.South | NearbyRoadsPos.NortWest | NearbyRoadsPos.SouthWest)) == (NearbyRoadsPos.West | NearbyRoadsPos.North | NearbyRoadsPos.South | NearbyRoadsPos.NortWest | NearbyRoadsPos.SouthWest)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.OneSided, RoadObject.RoadObjectOrientation.South); return(roadObject); } //Check if we have an sidewards onesided top pedestrian road if ((nearbyRoads & (NearbyRoadsPos.North)) == 0 && (nearbyRoads & (NearbyRoadsPos.South | NearbyRoadsPos.East | NearbyRoadsPos.West | NearbyRoadsPos.SouthEast | NearbyRoadsPos.SouthWest)) == (NearbyRoadsPos.South | NearbyRoadsPos.East | NearbyRoadsPos.West | NearbyRoadsPos.SouthEast | NearbyRoadsPos.SouthWest)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.OneSided, RoadObject.RoadObjectOrientation.East); return(roadObject); } //Check if we have an sidewards onesided bottom pedestrian road if ((nearbyRoads & (NearbyRoadsPos.South)) == 0 && (nearbyRoads & (NearbyRoadsPos.North | NearbyRoadsPos.East | NearbyRoadsPos.West | NearbyRoadsPos.NortWest | NearbyRoadsPos.NorthEast)) == (NearbyRoadsPos.North | NearbyRoadsPos.East | NearbyRoadsPos.West | NearbyRoadsPos.NortWest | NearbyRoadsPos.NorthEast)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.OneSided, RoadObject.RoadObjectOrientation.West); return(roadObject); } #endregion #region Closed T //Check if upwards T junctation if ((nearbyRoads & (NearbyRoadsPos.South)) == 0 && (nearbyRoads & (NearbyRoadsPos.North | NearbyRoadsPos.East | NearbyRoadsPos.West)) == (NearbyRoadsPos.North | NearbyRoadsPos.East | NearbyRoadsPos.West)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.ClosedT, RoadObject.RoadObjectOrientation.North); return(roadObject); } //Check if East T junctation if ((nearbyRoads & (NearbyRoadsPos.West)) == 0 && (nearbyRoads & (NearbyRoadsPos.North | NearbyRoadsPos.East | NearbyRoadsPos.South)) == (NearbyRoadsPos.North | NearbyRoadsPos.East | NearbyRoadsPos.South)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.ClosedT, RoadObject.RoadObjectOrientation.East); return(roadObject); } //Check if downwards T junctation if ((nearbyRoads & (NearbyRoadsPos.North)) == 0 && (nearbyRoads & (NearbyRoadsPos.East | NearbyRoadsPos.South | NearbyRoadsPos.West)) == (NearbyRoadsPos.East | NearbyRoadsPos.South | NearbyRoadsPos.West)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.ClosedT, RoadObject.RoadObjectOrientation.South); return(roadObject); } //Check if West T junctation if ((nearbyRoads & (NearbyRoadsPos.East)) == 0 && (nearbyRoads & (NearbyRoadsPos.North | NearbyRoadsPos.South | NearbyRoadsPos.West)) == (NearbyRoadsPos.North | NearbyRoadsPos.South | NearbyRoadsPos.West)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.ClosedT, RoadObject.RoadObjectOrientation.West); return(roadObject); } #endregion #region Cloed L //Check for upwards right L junctation if ((nearbyRoads & (NearbyRoadsPos.NorthEast | NearbyRoadsPos.South | NearbyRoadsPos.West)) == 0 && (nearbyRoads & (NearbyRoadsPos.North | NearbyRoadsPos.East)) == (NearbyRoadsPos.North | NearbyRoadsPos.East)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.ClosedL, RoadObject.RoadObjectOrientation.North); return(roadObject); } //Check for upwards left L junctation if ((nearbyRoads & (NearbyRoadsPos.NortWest | NearbyRoadsPos.East | NearbyRoadsPos.South)) == 0 && (nearbyRoads & (NearbyRoadsPos.North | NearbyRoadsPos.West)) == (NearbyRoadsPos.North | NearbyRoadsPos.West)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.ClosedL, RoadObject.RoadObjectOrientation.West); return(roadObject); } //Check for downwards right L junctation if ((nearbyRoads & (NearbyRoadsPos.North | NearbyRoadsPos.SouthEast | NearbyRoadsPos.West)) == 0 && (nearbyRoads & (NearbyRoadsPos.South | NearbyRoadsPos.East)) == (NearbyRoadsPos.South | NearbyRoadsPos.East)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.ClosedL, RoadObject.RoadObjectOrientation.East); return(roadObject); } //Check for downwards left L junctation if ((nearbyRoads & (NearbyRoadsPos.North | NearbyRoadsPos.East | NearbyRoadsPos.SouthWest)) == 0 && (nearbyRoads & (NearbyRoadsPos.South | NearbyRoadsPos.West)) == (NearbyRoadsPos.South | NearbyRoadsPos.West)) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.ClosedL, RoadObject.RoadObjectOrientation.South); return(roadObject); } #endregion #region Corners //Check if we got a top right corner only road if ((nearbyRoads & NearbyRoadsPos.NorthEast) == 0) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.Corner, RoadObject.RoadObjectOrientation.North); return(roadObject); } //Check if we got a top left corner only road if ((nearbyRoads & NearbyRoadsPos.NortWest) == 0) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.Corner, RoadObject.RoadObjectOrientation.West); return(roadObject); } //Check if we got a top right corner only road if ((nearbyRoads & NearbyRoadsPos.SouthEast) == 0) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.Corner, RoadObject.RoadObjectOrientation.East); return(roadObject); } //Check if we got a right left corner only road if ((nearbyRoads & NearbyRoadsPos.SouthWest) == 0) { roadObject.GetComponent <RoadObject>().SetRoadType(RoadObject.RoadObjectType.Corner, RoadObject.RoadObjectOrientation.South); return(roadObject); } #endregion return(roadObject); }
private void OnGUI() { if (m_prefabs.Count == 0) { PopulatePrefabsList(); } if (m_MapManager == null) { m_MapManager = GameObject.FindObjectOfType <ProceduralMapManager>(); if (m_MapManager == null) { GUI.Label(new Rect(0, 0, 300, 20), "No ProceduralMapManager Detected in scene!", EditorStyles.boldLabel); GUI.Label(new Rect(5, 20, 300, 100), "You cannot use the ProceduralMapTool if the map is not flagged as procedural. Would you like to flag it?", EditorStyles.wordWrappedLabel); if (GUI.Button(new Rect(5, 55, 300, 20), "Flag it!")) { Instantiate(AssetDatabase.LoadAssetAtPath <GameObject>("Assets/Prefabs/ProceduralTiles/ProceduralMapManager.prefab")); } return; } } m_MapManager.RefreshTileList(); GUI.Label(new Rect(0, 0, 150, 20), "Tile Spawn", EditorStyles.boldLabel); m_newTile = (ETileType)EditorGUI.EnumPopup(new Rect(15, 20, 300, 20), "Tile Type", m_newTile); m_gridX = EditorGUI.IntField(new Rect(15, 40, 300, 15), "Grid X Pos", m_gridX); m_gridZ = EditorGUI.IntField(new Rect(15, 60, 300, 15), "Grid Z Pos", m_gridZ); if (!MapTile.CanMoveToGridPos(m_gridX, m_gridZ, m_newTile)) { IList <KeyValuePair <int, int> > m_cellsToView = new List <KeyValuePair <int, int> >(); m_cellsToView.Add(new KeyValuePair <int, int>(m_gridX, m_gridZ)); while (m_cellsToView.Count > 0) { int x = m_cellsToView[0].Key; int z = m_cellsToView[0].Value; m_cellsToView.RemoveAt(0); for (short i = 0; i < 8; i++) { if (MapTile.CanMoveToGridPos(x + dirX[i], z + dirZ[i], m_newTile)) { m_gridX = x + dirX[i]; m_gridZ = z + dirZ[i]; m_cellsToView.Clear(); break; } else { m_cellsToView.Add(new KeyValuePair <int, int>(x + dirX[i], z + dirZ[i])); } } } } GUI.enabled = m_newTile == ETileType.Firestation ? m_MapManager.GetTileCount(m_newTile) == 0 : true; //Buttons if (GUI.Button(new Rect(15, 80, 300, 15), "Spawn tile", EditorStyles.miniButton)) { if (m_prefabs[m_newTile] != null) { GameObject o = Instantiate(m_prefabs[m_newTile], MapTile.ConvertGridToPosition(m_gridX, m_gridZ, m_newTile), Quaternion.identity); MapTile mt = o.GetComponent <MapTile>(); mt.TileType = m_newTile; Selection.activeGameObject = o; SceneView.lastActiveSceneView.LookAt(o.gameObject.transform.position); } } GUI.enabled = true; GUI.Label(new Rect(0, 100, 150, 20), "City Generation", EditorStyles.boldLabel); //Buttons if (GUI.Button(new Rect(15, 120, 150, 20), "Generate Preview City")) { m_MapManager.DeleteCityPreview(); m_MapManager.GenerateCityPreview(); } GUI.enabled = GameObject.FindGameObjectWithTag("PreviewBuilding") != null; //Buttons if (GUI.Button(new Rect(170, 120, 150, 20), "Remove Preview")) { m_MapManager.DeleteCityPreview(); } GUI.enabled = true; //Buttons if (GUI.Button(new Rect(15, 145, 150, 20), "Generate City")) { } GUI.enabled = true; GUI.Label(new Rect(0, 175, 150, 20), "Tile Count", EditorStyles.boldLabel); Rect r = new Rect(5, 195, 150, 20); int i2 = 1; foreach (ETileType e in Enum.GetValues(typeof(ETileType))) { GUI.Label(r, Enum.GetName(e.GetType(), e) + ": " + m_MapManager.GetTileCount(e)); if (i2 % 2 == 0) { r.x = 5; r.y += 15; } else { r.x = 175; } i2++; } }
/// <summary> /// Spawns the building and removes the tile /// </summary> public void SpawnBuilding() { ProceduralMapManager proceduralManager = ProceduralMapManager._instance; //If there is no manager return as we cannot spawn any object so just return if (proceduralManager == null || proceduralManager.MapBuildingsScripteableObject == null) { #if UNITY_EDITOR if (!EditorApplication.isPlaying && proceduralManager == null) { proceduralManager = GameObject.FindObjectOfType <ProceduralMapManager>(); if (proceduralManager.MapBuildingsScripteableObject == null) { Debug.Log("Did not find the map building script obect"); return; } } else { #endif Debug.LogError("Cannot spawn buildins without a procedural manager"); return; #if UNITY_EDITOR } #endif } //Get the object that should be placed in this world GameObject tileObject = GetTileObject(proceduralManager); if (tileObject != null) { //Set the position of the object to the tile one tileObject.transform.position = transform.position; //Destroy the tile Destroy(gameObject); //Get the building in the child foreach (Transform child in tileObject.transform) { if (child.GetComponent <BuildingStatus>() != null) { //Get the renderer for the building Renderer buildingRenderer = child.GetComponent <Renderer>(); if (buildingRenderer != null) { //Get the burning material Material burningMaterial = null; #if UNITY_EDITOR if (!EditorApplication.isPlaying) { burningMaterial = buildingRenderer.sharedMaterial; } else { burningMaterial = buildingRenderer.material; } #else burningMaterial = buildingRenderer.material; #endif //Check if we have a burning material first if (burningMaterial.HasProperty("_MaxBuildingTexturesCount") && burningMaterial.HasProperty("_BuildingTextureIndex")) { //Get the maximum int maxTextureIndexExclusive = burningMaterial.GetInt("_MaxBuildingTexturesCount"); //Set the base colour burningMaterial.SetInt("_BuildingTextureIndex", Random.Range((int)0, (int)maxTextureIndexExclusive)); } } } } } }
/// <summary> /// Get the current object that will be positioned onto the tile /// </summary> /// <returns>The building/road game object</returns> protected virtual GameObject GetTileObject(ProceduralMapManager proceduralManager) { //Current position of the road NearbyRoadsPos roadsPos = NearbyRoadsPos.None; //Try to figure out where roads are foreach (KeyValuePair <NearbyRoadsPos, Vector2Int> dirs in Directions) { Vector2 dir = new Vector3(dirs.Value.x * GetTileSize().x, dirs.Value.y * GetTileSize().y); //Get the position the position of the tile in the current direction int newX = m_gridX + (int)dir.x; int newZ = m_gridZ + (int)dir.y; //Get the tite type ETileType e; if (GetTileAtPos(newX, newZ, out e)) { if (e == ETileType.Road) { //We got a road so set orientation to the base dir so we can rotate it later roadsPos |= dirs.Key; } } } //Unset uneeded flags roadsPos &= ~NearbyRoadsPos.NorthEast; roadsPos &= ~NearbyRoadsPos.NortWest; roadsPos &= ~NearbyRoadsPos.SouthEast; roadsPos &= ~NearbyRoadsPos.SouthWest; //Master Orientation Vector2 orientation = Vector2.zero; //Random orientation in each direction in case a sub tile needs to specialice Vector2 xBasedOrientation = Vector2.zero; Vector2 yBasedOrientation = Vector2.zero; NearbyRoadsPos[] allFlags = Enum.GetValues(typeof(NearbyRoadsPos)) .Cast <NearbyRoadsPos>() .Where(c => (roadsPos & c) == c && c != NearbyRoadsPos.None) .ToArray(); //Check if we have any flags if (allFlags.Length == 0) { Debug.Log("Found a tile with no roads neaby"); Debug.LogFormat("X: {0}, Y: {1}", m_gridX, m_gridZ); return(null); } orientation = Directions[allFlags[Random.Range((int)0, (int)allFlags.Length)]]; //Find a valid xbased orientation if ((roadsPos & (NearbyRoadsPos.North | NearbyRoadsPos.South)) != 0) { do { xBasedOrientation = Directions[allFlags[Random.Range((int)0, (int)allFlags.Length)]]; } while (xBasedOrientation.y != 0); } //Find a valid ybased orientation if ((roadsPos & (NearbyRoadsPos.West | NearbyRoadsPos.East)) != 0) { do { yBasedOrientation = Directions[allFlags[Random.Range((int)0, (int)allFlags.Length)]]; } while (yBasedOrientation.x != 0); } //Based on the tile type instanciate the correct object GameObject gameObjectToSpawn = null; switch (m_tileType) { case ETileType.Size1x1: if (proceduralManager.MapBuildingsScripteableObject.Buildings1x1 != null && proceduralManager.MapBuildingsScripteableObject.Buildings1x1.Length > 0) { gameObjectToSpawn = proceduralManager.MapBuildingsScripteableObject.Buildings1x1[Random.Range((int)0, (int)proceduralManager.MapBuildingsScripteableObject.Buildings1x1.Length)]; } break; case ETileType.Size2x1: if (proceduralManager.MapBuildingsScripteableObject.Buildings1x2 != null && proceduralManager.MapBuildingsScripteableObject.Buildings1x2.Length > 0) { gameObjectToSpawn = proceduralManager.MapBuildingsScripteableObject.Buildings1x2[Random.Range((int)0, (int)proceduralManager.MapBuildingsScripteableObject.Buildings1x2.Length)]; } //Make sure to use correct orientation orientation = yBasedOrientation; break; case ETileType.Size1x2: if (proceduralManager.MapBuildingsScripteableObject.Buildings1x2 != null && proceduralManager.MapBuildingsScripteableObject.Buildings1x2.Length > 0) { gameObjectToSpawn = proceduralManager.MapBuildingsScripteableObject.Buildings1x2[Random.Range((int)0, (int)proceduralManager.MapBuildingsScripteableObject.Buildings1x2.Length)]; } //Make sure to use correct orientation orientation = xBasedOrientation; break; case ETileType.Size2x2: if (proceduralManager.MapBuildingsScripteableObject.Buildings2x2 != null && proceduralManager.MapBuildingsScripteableObject.Buildings2x2.Length > 0) { gameObjectToSpawn = proceduralManager.MapBuildingsScripteableObject.Buildings2x2[Random.Range((int)0, (int)proceduralManager.MapBuildingsScripteableObject.Buildings2x2.Length)]; } break; case ETileType.Firestation: if (proceduralManager.MapBuildingsScripteableObject.FireStation != null) { gameObjectToSpawn = proceduralManager.MapBuildingsScripteableObject.FireStation; } break; } GameObject spawnedObject = null; //Spawn the object and set its values if (gameObjectToSpawn != null) { spawnedObject = Instantiate(gameObjectToSpawn); spawnedObject.transform.rotation = Quaternion.FromToRotation(spawnedObject.transform.right, new Vector3(orientation.x, 0, orientation.y)); } //Return it return(spawnedObject); }