/// <summary> /// 计算建筑的碰撞体 /// </summary> /// <param name="col"></param> void FillRectWithTiles(Collider2D col) { if (activeTilesParent) { return; } Rect rect = PlacementHelpers.MakeRectOfCollider(col); float fromX = rect.position.x; float toX = (rect.position.x + rect.width) * col.gameObject.transform.localScale.x; float fromZ = rect.position.y; float toZ = (rect.position.y + rect.height) * col.gameObject.transform.localScale.y; GameObject parent = new GameObject("PlacementGrid"); parent.transform.SetParent(col.gameObject.transform.root); parent.transform.position = col.gameObject.transform.InverseTransformPoint(new Vector3(0, 0.5f, 0)); for (float i = -toX / 2; i <= toX / 2; i += productionTile.transform.localScale.x) { for (float j = -toZ / 2; j <= toZ / 2; j += productionTile.transform.localScale.y) { GameObject tile = Instantiate(productionTile); tile.transform.SetParent(parent.transform); tile.transform.position = new Vector3(i, parent.transform.position.y, j); activeTiles.Add(tile.GetComponent <ProductionTile>()); } } activeTilesParent = parent; }
void FillRectWithTiles(Collider col) { if (activeTilesParent) { return; } Rect rect = PlacementHelpers.MakeRectOfCollider(col); // Récupère la taille de l'objet à construire suivant l'axe X float toX = col.gameObject.transform.localScale.x / 2; // Récupère la taille de l'objet à construire suivant l'axe X float toZ = col.gameObject.transform.localScale.z / 2; GameObject parent = new GameObject("PlacementGrid"); parent.transform.SetParent(col.gameObject.transform.root); parent.transform.position = col.gameObject.transform.InverseTransformPoint(new Vector3(0, 0.5f, 0)); // Création de la zone de construction (suivant les axes X et Z) avec l'affichage des collisions // pour montrer à l'utilisateur si la construction est possible ou non for (float i = -toX; i < toX; i++) { for (float j = -toZ; j < toZ; j++) { GameObject tile = Instantiate(productionTile); tile.transform.SetParent(parent.transform); tile.transform.position = new Vector3(i, parent.transform.position.y, j); activeTiles.Add(tile.GetComponent <ProductionTile>()); } } activeTilesParent = parent; }
void FixedUpdate() { if (currentSpawnedBuilding) { if (PlacementHelpers.RaycastFromMouse(out hit, terrainLayer)) { currentSpawnedBuilding.transform.position = new Vector3(hit.point.x, hit.point.y, hit.point.z); } } }
bool CanPlaceBuilding() { if (PlacementHelpers.IsButtonPressed(uiRaycaster)) { return(false); } for (int i = 0; i < activeTiles.Count; i++) { if (activeTiles[i].colliding) { return(false); } } return(true); }
void FixedUpdate() { if (currentSpawnedBuilding) { if (PlacementHelpers.RaycastFromMouse(out hit, terrainLayer)) { // Positionne l'objet suivant l'axe X truePos.x = Mathf.Ceil(hit.point.x / gridSize) * gridSize; // Garder l'objet constante sur l'axe Y truePos.y = 0; // Positionne l'objet suivant l'axe Z truePos.z = Mathf.Ceil(hit.point.z / gridSize) * gridSize; // Donne la position réel de l'objet à construire currentSpawnedBuilding.transform.position = truePos; } } }
/// <summary> /// 开始放置建筑 /// </summary> /// <param name="building"></param> public void SpawnBuilding(BuildingSO building) { // 如果没有放置建筑,则返回 if (currentSpawnedBuilding) { return; } currentSpawnedBuilding = Instantiate(building.buildingPrefab); buildingToPlace = building; PlacementHelpers.ToggleRenderers(currentSpawnedBuilding, false); Collider2D cols = currentSpawnedBuilding.GetComponent <Collider2D>(); if (cols != null) { FillRectWithTiles(cols); } }
IEnumerator BeginBuilding() { Vector3 pos = currentSpawnedBuilding.transform.position; GameObject instance = currentSpawnedBuilding; currentSpawnedBuilding = null; RaycastHit hitTerrain; if (PlacementHelpers.RaycastFromMouse(out hitTerrain, terrainLayer)) { pos = hitTerrain.point; } underConstructionGO.GetComponent <ShowBuildProgress>().buildingToPlace = buildingToPlace; GameObject go = Instantiate(underConstructionGO, pos, Quaternion.identity); yield return(new WaitForSeconds(buildingToPlace.buildTime)); PlacementHelpers.ToggleRenderers(instance, true); Destroy(go); }
public void SpawnBuilding(BuildingSO building) { // if haven't placed the spawned building, then return if (currentSpawnedBuilding) { return; } currentSpawnedBuilding = Instantiate(building.buildingPrefab); buildingToPlace.currentBuilding = building; PlacementHelpers.ToggleRenderers(currentSpawnedBuilding, false); Collider[] cols = currentSpawnedBuilding.GetComponentsInChildren <Collider>(); if (cols.Length > 0) { FillRectWithTiles(cols[0]); } else { Debug.LogError("Building has no colliders"); } }
IEnumerator BeginBuilding() { Vector3 pos = currentSpawnedBuilding.transform.position; GameObject instance = currentSpawnedBuilding; currentSpawnedBuilding = null; RaycastHit hitTerrain; if (PlacementHelpers.RaycastFromMouse(out hitTerrain, terrainLayer)) { pos = hitTerrain.point; } GameObject go = Instantiate(underConstructionGO, pos, Quaternion.identity); yield return(new WaitForSeconds(buildingToPlace.currentBuilding.buildTime)); Debug.Log("waited " + buildingToPlace.currentBuilding.buildTime + " seconds to build " + buildingToPlace.currentBuilding.name); PlacementHelpers.ToggleRenderers(instance, true); Destroy(go); }
void Update() { if (currentSpawnedBuilding) { if (Input.GetMouseButtonDown(0)) { if (!PlacementHelpers.RaycastFromMouse(out hit, terrainLayer)) { return; } currentSpawnedBuilding.transform.position = hit.point; if (CanPlaceBuilding()) { PlaceBuilding(); } } if (Input.GetMouseButtonDown(1)) { Destroy(currentSpawnedBuilding); } } }
void Update() { if (currentSpawnedBuilding) { // Si clic gauche if (Input.GetMouseButtonDown(0)) { if (!PlacementHelpers.RaycastFromMouse(out hit, terrainLayer)) { return; } float gridDecal = 0.5f; // Déplacer la grille de construction suivant l'axe X truePos.x = Mathf.Ceil(hit.point.x / gridSize) * gridSize - gridDecal; // Garder la grille de construction constante sur l'axe Y truePos.y = currentSpawnedBuilding.gameObject.transform.localScale.y / 2; // Déplacer la grille de construction suivant l'axe Z truePos.z = Mathf.Ceil(hit.point.z / gridSize) * gridSize - gridDecal; // Donne la position réel de l'objet à construire par rapport à la souris currentSpawnedBuilding.transform.position = truePos; // Si il n'y a pas de collision lancer la construction de l'objet if (CanPlaceBuilding()) { PlaceBuilding(); } } // Si clic droit annuler la prévisualisation de la zone de construction if (Input.GetMouseButtonDown(1)) { Destroy(currentSpawnedBuilding); ClearGrid(); } } }