/**
     * <summary>
     * @implementation ISelectable
     *
     * On selected
     * </summary>
     *
     * <returns>
     * void
     * </returns>
     */
    public virtual void OnSelected()
    {
        // Stop selection through the UI.
        if (ComponentPanelsUI.OnUI)
        {
            return;
        }

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

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

        this.UI.SetActive(true);

        GameObject health = this.UI.transform.Find("Health").gameObject;

        health.SetActive(true);

        // Show building action component
        this.buildingActionComponent.SetActive(true);
    }
    /**
     * <summary>
     * Select a given resource
     * </summary>
     *
     * <param name="resource">resource</param>
     *
     * <returns>
     * void
     * </returns>
     */
    public static void SelectResource(GameObject resource)
    {
        ResourcesManagerBehaviour.UnselectResource();

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

        ResourceBehaviour resourceBehaviour = resource.GetComponent <ResourceBehaviour>();

        //resourceBehaviour.SetSelect(true);

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

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

        ResourceUI resourceUI = resourceBehaviour.GetUI()
                                .GetComponent <ResourceUI>();

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

        infoComponentPanelUI.SetName(resource.name);
        infoComponentPanelUI.SetHealth(resourceBehaviour.GetHealth(), resourceBehaviour.GetMaxHealth());
        infoComponentPanelUI.SetIcon(resourceUI.GetIcon());

        // Set selected resource
        ResourcesManagerBehaviour.SelectedResource = resource;
    }
    /**
     * <summary>
     * Select a unit
     * </summary>
     *
     * <returns>
     * void
     * </returns>
     */
    public static void Select(GameObject unit)
    {
        if (unit.GetComponent <UnitBehaviour>() == null)
        {
            throw new Exception(unit.name + " " + "is not a unit type");
        }

        // Clear previous units
        UnitsManagerBehaviour.UnselectGameObjects();

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

        UnitBehaviour unitBehaviour = unit.GetComponent <UnitBehaviour>();

        if (unitBehaviour is ISelectableUnit)
        {
            UnitsManagerBehaviour.SelectedUnits.Add(unit);
            unitBehaviour.SetSelect(true);

            Self.infoComponentPanel.SetActive(true);

            // Show info component panel
            Self.infoComponentPanel
            .transform
            .Find("Single")
            .gameObject
            .SetActive(true);

            // Hide multiple
            Self.infoComponentPanel
            .transform
            .Find("Multiple")
            .gameObject
            .SetActive(false);

            UnitUI unitUI = unitBehaviour.GetUI().GetComponent <UnitUI>();

            InfoComponentPanelUI infoComponentPanelUI = Self.infoComponentPanel.GetComponent <InfoComponentPanelUI>();
            infoComponentPanelUI.SetName(unit.name);
            infoComponentPanelUI.SetHealth(unitBehaviour.GetHealth(), unitBehaviour.GetMaxHealth());
            infoComponentPanelUI.SetIcon(unitUI.GetIcon());

            // Show action component panel
            Self.actionComponentPanel.SetActive(true);
        }
    }
    /**
     * <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 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();
    }
 /**
  * <summary>
  * Unselect all selected game objects
  * </summary>
  *
  * <returns>
  * void
  * </returns>
  */
 public void UnselectGameObjects()
 {
     UnitsManagerBehaviour.UnselectGameObjects();
 }
    /**
     * <summary>
     * @overload
     *
     * Select a group of units
     * </summary>
     *
     * <returns>
     * void
     * </returns>
     */
    public static void Select(List <GameObject> units)
    {
        // Select a single unit, if the list has only one unit
        if (units.Count == 1)
        {
            UnitsManagerBehaviour.Select(units[0]);
            return;
        }

        // Validate unit game objects
        foreach (GameObject unit in units)
        {
            if (unit.GetComponent <UnitBehaviour>() == null)
            {
                throw new Exception(unit.name + " " + "is not a unit type");
            }
        }

        // Clear previous units
        UnitsManagerBehaviour.UnselectGameObjects();

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

        // Add unit to the global list
        foreach (GameObject unit in units)
        {
            UnitBehaviour unitBehaviour = unit.GetComponent <UnitBehaviour>();

            if (unitBehaviour is ISelectableUnit)
            {
                UnitsManagerBehaviour.SelectedUnits.Add(unit);
            }
        }

        // Set selection
        foreach (GameObject unit in UnitsManagerBehaviour.SelectedUnits)
        {
            UnitBehaviour unitBehaviour = unit.GetComponent <UnitBehaviour>();
            unitBehaviour.SetSelect(true);
        }

        // Show multiple unit icons
        if (UnitsManagerBehaviour.SelectedUnits.Count > 1)
        {
            Self.infoComponentPanel.SetActive(true);

            // Show info component panel
            Self.infoComponentPanel
            .transform
            .Find("Single")
            .gameObject
            .SetActive(false);

            // Hide multiple
            Self.infoComponentPanel
            .transform
            .Find("Multiple")
            .gameObject
            .SetActive(true);

            // Remove previous multiple selection slots
            Self.RemoveMultipleSelectionSlots();

            // Generate new multiple selection slots
            Self.GenerateMultipleSelectionUnitSlots();

            // Hide action component panel
            Self.actionComponentPanel.SetActive(false);
        }
    }