Exemple #1
0
    /// <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;
    }
Exemple #3
0
 void FixedUpdate()
 {
     if (currentSpawnedBuilding)
     {
         if (PlacementHelpers.RaycastFromMouse(out hit, terrainLayer))
         {
             currentSpawnedBuilding.transform.position = new Vector3(hit.point.x, hit.point.y, hit.point.z);
         }
     }
 }
Exemple #4
0
 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;
            }
        }
    }
Exemple #6
0
    /// <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);
        }
    }
Exemple #7
0
    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);
    }
Exemple #8
0
    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");
        }
    }
Exemple #9
0
    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);
    }
Exemple #10
0
    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();
            }
        }
    }