// Use this for initialization void Start() { building = GetComponent <SimpleBuildingBehaviour>(); if (building.enabled) { StartCoroutine(GenerateResources()); } }
// Use this for initialization void Start() { building = GetComponent <SimpleBuildingBehaviour>(); if (building != null && building.isActiveAndEnabled && building.world.GetTileType(transform.position) == MapTile.MapTileType.LEANING) { MapTile tile = building.world.GetTileFromWorldPosition(transform.position); //Next we rotate the road to "lean with terrain". If it DOES lean then we stretch it in case it goes up a hill so that it reaches all the way if (building.world.isTileLeaningDownY(tile)) { Vector3 scale = transform.localScale; if (transform.rotation.eulerAngles.y % 180 < 1) { scale.z *= 1.5f; } transform.localScale = scale; transform.Rotate(new Vector3(-45, 0, 0), Space.World); } if (building.world.isTileLeaningUpY(tile)) { Vector3 scale = transform.localScale; if (transform.rotation.eulerAngles.y % 180 < 1) { scale.z *= 1.5f; } transform.localScale = scale; transform.Rotate(new Vector3(45, 0, 0), Space.World); } if (building.world.isTileLeaningDownX(tile)) { Vector3 scale = transform.localScale; if (transform.rotation.eulerAngles.y % 180 > 1) { scale.z *= 1.5f; } transform.localScale = scale; transform.Rotate(new Vector3(0, 0, 45), Space.World); } if (building.world.isTileLeaningUpX(tile)) { Vector3 scale = transform.localScale; if (transform.rotation.eulerAngles.y % 180 > 1) { scale.z *= 1.5f; } transform.localScale = scale; transform.Rotate(new Vector3(0, 0, -45), Space.World); } } }
public void Bulldoze(int x, int y) { int key = world.GetTileCoordKey(x, y); if (buildingTiles.ContainsKey(key)) { //A building is only stored once in buildings but stored for every tile it occupies in WorldBehaviour.buildings SimpleBuildingBehaviour buildingBehaviour = buildingTiles[key]; RemoveBuilding(buildingBehaviour); } }
/// <summary> /// Adds a building to the world. This could be through construction or when loading a game. /// If you load a game then there might be finished buildings but they still must be properly registered! /// </summary> /// <param name="building">Building.</param> internal void RegisterBuilding(SimpleBuildingBehaviour building) { building.transform.SetParent(transform); if (building.isSceneBuilding) { if (!sceneBuildings.Contains(building)) { sceneBuildings.Add(building); //Set the building to be in a correct tile (you could see this as rounding off the position) MapTile tile = world.GetTileFromWorldPosition(building.transform.position); Vector3 pos = world.GetWorldPositionFromTile(tile); building.transform.position = pos; //Next we need to make the tiles occupied with this building so that other vuildings can't be built in the same location int width = building.buildingType.buildArea.width; int length = building.buildingType.buildArea.length; //If we have an even number as width or length then we want the center to be moved by one step pos += new Vector3(width % 2 - 1, 0, length % 2 - 1) * world.worldData.tileWidth / 2f; //Calc tile coords int startX = (int)((pos.x - width * 0.5f) / world.worldData.tileWidth); int startY = (int)((pos.z - length * 0.5f) / world.worldData.tileWidth); int stopX = startX + width; int stopY = startY + length; //We add a reference to this building in every tile it occupies for (int i = startX; i <= stopX; i++) { for (int j = startY; j <= stopY; j++) { int key = world.GetTileCoordKey(i, j); buildingTiles.Add(key, building); } } } } else { buildings.Add(building.buildingInstanceData.key, building); } }
public void ShowBuildingInfo(SimpleBuildingBehaviour building) { currentBuilding = null; txtName.text = building.buildingType.name; var productionScript = building.GetComponent <ResourceGeneratorBehaviour>(); if (productionScript) { txtProduction.text = productionScript.resourceGenerated.ToString(); txtConsumtion.text = productionScript.resourceConsumed.ToString(); rdoProductionActive.isOn = productionScript.isActive; rdoProductionActive.gameObject.SetActive(true); } else { txtProduction.text = ""; txtConsumtion.text = ""; rdoProductionActive.gameObject.SetActive(false); } gameObject.SetActive(true); currentBuilding = building; }
public void RemoveBuilding(SimpleBuildingBehaviour buildingBehaviour) { int buildingPosKey = buildingBehaviour.positionKey; buildings.Remove(buildingPosKey); for (int i = 0; i < buildingBehaviour.width; i++) { for (int j = 0; j < buildingBehaviour.length; j++) { int tmpKey = world.GetTileCoordKey(buildingPosKey % world.tileMapSize + i, buildingPosKey / world.tileMapSize + j); buildingTiles.Remove(tmpKey); //Debug.Log("Removing building at x: " + (buildingPosKey % tileMapSize + i) + " y: " + (buildingPosKey / tileMapSize + j)); } } GameObject.Destroy(buildingBehaviour.gameObject); if (OnBuildingsChanged != null) { OnBuildingsChanged(); } }
// Use this for initialization void Start() { building = GetComponentInParent <SimpleBuildingBehaviour>(); meter = GetComponent <UIMeterBehaviour>(); }
/// <summary> /// Instantiates the building by actually creating the gameobject and assigning it to the world /// </summary> /// <param name="x">The x coordinate.</param> /// <param name="y">The y coordinate.</param> /// <param name="buildingInstance">Building instance.</param> protected void InstantiateBuilding(int x, int y, SimpleBuildingInstance buildingInstance) { SimpleBuildingType buildingType = buildingTypes[buildingInstance.buildingTypeIndex]; int width = buildingType.buildArea.width; int length = buildingType.buildArea.length; //If we turned the building -90 or 90 degrees then switch width and length if (buildingInstance.direction % 2 == 1) { width = buildingType.buildArea.length; length = buildingType.buildArea.width; } int startX = x; int stopX = x + width - 1; int startY = y; int stopY = y + length - 1; buildingInstance.x = x; buildingInstance.y = y; //Calculate dead center of building area to place the actual game object Vector3 pos = (world.GetWorldPositionFromTile(startX, startY, true) + world.GetWorldPositionFromTile(stopX, stopY, true)) / 2; GameObject building = (GameObject)GameObject.Instantiate(buildingType.prefab, pos, Quaternion.identity); building.name = buildingType.name; Collider buildingCollider = building.GetComponent <Collider>(); if (buildingCollider != null) { buildingCollider.enabled = true; } Vector3 scale = building.transform.localScale; scale = Vector3.Scale(buildingType.scale, scale); building.transform.localScale = scale; Vector3 rot = building.transform.eulerAngles; rot.y = 90 * buildingInstance.direction; building.transform.rotation = Quaternion.Euler(rot); if (buildingType.doLeanWithTerrain) { if (world.isTileLeaningDownX(x, y)) { building.transform.Rotate(45, 0, 0); } if (world.isTileLeaningUpX(x, y)) { building.transform.Rotate(-45, 0, 0); } if (world.isTileLeaningDownY(x, y)) { building.transform.Rotate(-45, 0, 0); } if (world.isTileLeaningUpY(x, y)) { building.transform.Rotate(45, 0, 0); } } SimpleBuildingBehaviour buildingBehaviour = building.GetComponent <SimpleBuildingBehaviour>(); buildingBehaviour.positionKey = world.GetTileCoordKey(x, y); buildingBehaviour.buildingType = buildingType; buildingBehaviour.buildingInstanceData = buildingInstance; buildingBehaviour.width = width; buildingBehaviour.length = length; buildingBehaviour.Setup(); //Add construction utilities if applicable if (buildingBehaviour.underConstructionBuilding != null && constructionUtilitiesPrefab != null) { GameObject constructionUtilities = Instantiate <GameObject>(constructionUtilitiesPrefab); constructionUtilities.transform.SetParent(buildingBehaviour.underConstructionBuilding.transform); constructionUtilities.transform.localPosition = Vector3.zero; } //We add a reference to this building in every tile it occupies for (int i = x; i <= stopX; i++) { for (int j = y; j <= stopY; j++) { int key = world.GetTileCoordKey(i, j); buildingTiles.Add(key, buildingBehaviour); } } if (OnBuildingsChanged != null) { OnBuildingsChanged(); } }