private void Awake()
    {
        BuildingsManagerBehaviour.Self = this;

        BuildingsManagerBehaviour.Visibles  = new List <GameObject>();
        BuildingsManagerBehaviour.Buildings = new List <GameObject>();
    }
    /**
     * <summary>
     * Unselect and set the slot inactive
     * </summary>
     *
     * <returns>
     * void
     * </returns>
     */
    public void Unselect()
    {
        if (BuilderActionComponentUI.ActiveSlot == null)
        {
            return;
        }

        this.outline.effectColor = this.defaultColor;
        GameObject previewGameObject = BuilderActionComponentUI.ActiveSlot.GetComponent <BuildingSlotUI>().GetPreview();

        previewGameObject.transform.localPosition = Vector3.zero;

        BuilderActionComponentUI.PreviewFollow = false;
        BuilderActionComponentUI.ActiveSlot    = null;

        // For better alignment, may change in the future?
        this.preview.GetComponent <BuildingPreviewBehaviour>().TurnRenderer(false);

        MouseBehaviour.Mode = MouseMode.Default;

        // Show all visible renderers and hide placement (buildings, and resources)
        BuildingsManagerBehaviour.TurnRenderers(true);
        ResourcesManagerBehaviour.TurnRenderers(true);

        BuildingsManagerBehaviour.TurnPlacementIndicator(false);
        ResourcesManagerBehaviour.TurnPlacementIndicator(false);

        this.select = false;
    }
    public void OnPointerClick(PointerEventData pointerEventData)
    {
        if (pointerEventData.button == PointerEventData.InputButton.Left)
        {
            GameObject selectedObject = BuildingsManagerBehaviour.SelectedBuilding;

            BuildingsManagerBehaviour.UnselectBuilding();
            MonoBehaviour.Destroy(selectedObject);

            NavMeshSurfacesManager.BuildNavMesh();
        }
    }
    /**
     * <summary>
     * Select a given building
     * </summary>
     *
     * <param name="building"></param>
     *
     * <returns>
     * void
     * </returns>
     */
    public static void SelectBuilding(GameObject building)
    {
        // Unselect previous building
        BuildingsManagerBehaviour.UnselectBuilding();

        // Unselect units
        if (UnitsManagerBehaviour.SelectedUnits != null)
        {
            UnitsManagerBehaviour.UnselectGameObjects();
        }

        // Unselect previous resource
        if (ResourcesManagerBehaviour.SelectedResource != null)
        {
            ResourcesManagerBehaviour.UnselectResource();
        }

        BuildingBehaviour buildingBehaviour = building.GetComponent <BuildingBehaviour>();

        buildingBehaviour.SetSelect(true);

        // Show info component panel
        Self.infoComponentPanel.SetActive(true);

        Self.infoComponentPanel
        .transform
        .Find("Single")
        .gameObject
        .SetActive(true);

        BuildingUI buildingUI = buildingBehaviour.GetUI()
                                .GetComponent <BuildingUI>();

        InfoComponentPanelUI infoComponentPanelUI = Self.infoComponentPanel.GetComponent <InfoComponentPanelUI>();

        infoComponentPanelUI.SetName(building.name);
        infoComponentPanelUI.SetHealth(buildingBehaviour.GetHealth(), buildingBehaviour.GetMaxHealth());
        infoComponentPanelUI.SetIcon(buildingUI.GetIcon());

        // Show action component panel
        Self.actionComponentPanel.SetActive(true);

        // Set selected building
        BuildingsManagerBehaviour.SelectedBuilding = building;
    }
    /**
     * <summary>
     * On mouse over
     * </summary>
     *
     * <returns>
     * void
     * </returns>
     */
    private void OnMouseOver()
    {
        if (MouseBehaviour.Mode == MouseMode.Build)
        {
            return;
        }

        // Prevent selectino through the bottom UI
        if (ComponentPanelsUI.OnUI)
        {
            return;
        }

        MouseBehaviour.Mode = MouseMode.OverBuilding;

        // Right clicked
        if (Input.GetMouseButtonDown(1))
        {
            if (this.IsActivated() || UnitsManagerBehaviour.SelectedUnits.Count == 0)
            {
                return;
            }

            GameObject    unit          = UnitsManagerBehaviour.SelectedUnits[0];
            UnitBehaviour unitBehaviour = unit.GetComponent <UnitBehaviour>();
            if (unitBehaviour is BuilderBehaviour)
            {
                ((BuilderBehaviour)unitBehaviour).StartConstruction(this.gameObject);
            }
        }

        // Left clicked
        else if (Input.GetMouseButtonDown(0))
        {
            BuildingBehaviour buildingBehaviour = this.gameObject.GetComponent <BuildingBehaviour>();

            if (buildingBehaviour != null && buildingBehaviour.IsConstructed())
            {
                BuildingsManagerBehaviour.SelectBuilding(this.gameObject);
            }
        }
    }
    /**
     * <summary>
     * Select and set the slot active
     * </summary>
     *
     * <returns>
     * void
     * </returns>
     */
    public void Select()
    {
        this.outline.effectColor = new Color((255 / 255), (0f / 255f), (0f / 255f), 1);
        BuilderActionComponentUI.PreviewFollow = true;
        BuilderActionComponentUI.ActiveSlot    = this.gameObject;

        // For better alignment, may change in the future?
        this.preview.GetComponent <BuildingPreviewBehaviour>().TurnRenderer(false);

        MouseBehaviour.Mode = MouseMode.Build;

        // Hide all visible renderers and show placement (buildings, and resources)
        BuildingsManagerBehaviour.TurnRenderers(false);
        ResourcesManagerBehaviour.TurnRenderers(false);

        BuildingsManagerBehaviour.TurnPlacementIndicator(true);
        ResourcesManagerBehaviour.TurnPlacementIndicator(true);

        this.select = true;
    }
    /**
     * <summary>
     * On unit selected
     * </summary>
     */
    public virtual void OnSelected()
    {
        // Stop selection through the UI.
        if (ComponentPanelsUI.OnUI)
        {
            return;
        }

        // Unselect resources
        if (ResourcesManagerBehaviour.SelectedResource != null)
        {
            ResourcesManagerBehaviour.UnselectResource();
        }

        // Unselect building
        if (BuildingsManagerBehaviour.SelectedBuilding != null)
        {
            BuildingsManagerBehaviour.UnselectBuilding();
        }

        this.UI.SetActive(true);
    }
    /**
     * <summary>
     * On left mouse up
     * </summary>
     *
     * <returns>
     * void
     * </returns>
     */
    private void OnLeftMouseUp()
    {
        // Stop scrolling, if the mouse is over UI or in build mode.
        if (!this.drag)
        {
            return;
        }

        // Is pointer up on the component panels UI, stop the selection
        if (ComponentPanelsUI.OnUI)
        {
            this.drag = false;
            this.HideSelectionArea();

            return;
        }

        RectTransform areaRect = this.area.GetComponent <RectTransform>();

        // Set final mouse position
        this.mousePosition.SetFinalPosition(this.transform.position);

        Bounds cameraViewportBounds = MouseScreenBehaviour.GetViewportBounds(
            this.mousePosition.GetInitialPosition(),
            this.mousePosition.GetFinalPosition()
            );

        ResourcesManagerBehaviour.UnselectResource();
        BuildingsManagerBehaviour.UnselectBuilding();

        UnitsManagerBehaviour.UnselectGameObjects();

        this.mouseSelectionBehaviour.SelectGameObjects(UnitsManagerBehaviour.Visibles, cameraViewportBounds);

        this.drag = false;
        this.HideSelectionArea();
    }