コード例 #1
0
    // Update is called once per frame
    void Update()
    {
        //this is the only way I could fix the hover panel remaining persistent when it shouldn't
        HoverPanelOff();

        switch (state)
        {
        case CursorState.SelectingUnit:
            #region Selecting Unit
            MoveCursor();

            ///TILE VISIBILITY
            //Activate/Deactivate Tiles
            if (hoverUnit != null)
            //get the hover unit's range
            {
                gridManager.DeactivateAllTiles(gridManager.greenTiles);
                gridManager.DeactivateAllTiles(gridManager.redTiles);
                gridManager.ActivateAroundTile(gridManager.greenTiles, hoverUnit.Energy, hoverUnit.pos);
                gridManager.ActivateFrontierTiles(gridManager.greenTiles, gridManager.redTiles, hoverUnit.Energy);

                ///HOVER STAT PANEL ON
                HoverPanelOn();
            }
            else
            {
                gridManager.DeactivateAllTiles(gridManager.greenTiles);
                gridManager.DeactivateAllTiles(gridManager.redTiles);
            }

            ///UNIT SELECTION
            if (Input.GetMouseButtonUp(0) && canClick)
            {
                //selecting the hoverunit: the else if prevents from walking on occupied tiles
                if (hoverUnit != null)
                {
                    if (hoverUnit.turn)
                    {
                        selectedUnit = hoverUnit;
                        state        = CursorState.SelectingDestination;
                        savedPos     = selectedUnit.pos;

                        ///HOVER STAT PANEL OFF
                        HoverPanelOff();

                        ///CORNER PANEL ON
                        cornerStats.SetActive(true);
                        cornerStats.GetComponent <StatPanelManager>().SetUnit(selectedUnit);
                    }
                }
            }

            break;

            #endregion
        case CursorState.SelectingDestination:
            #region Selecting Destination
            MoveCursor();


            ///TILE VISIBILITY
            //Activate/Deactivate Tiles
            if (hoverUnit != null)
            //get the hover unit's range
            {
                gridManager.DeactivateAllTiles(gridManager.greenTiles);
                gridManager.DeactivateAllTiles(gridManager.redTiles);
                gridManager.ActivateAroundTile(gridManager.greenTiles, hoverUnit.Energy, hoverUnit.pos);
                gridManager.ActivateFrontierTiles(gridManager.greenTiles, gridManager.redTiles, hoverUnit.Energy);

                if (hoverUnit != selectedUnit)
                {
                    ///HOVER STAT PANEL ON
                    HoverPanelOn();
                }
            }
            else if (selectedUnit != null)
            //if a character is already selected, revert the range to them
            {
                gridManager.DeactivateAllTiles(gridManager.greenTiles);
                gridManager.DeactivateAllTiles(gridManager.redTiles);
                gridManager.ActivateAroundTile(gridManager.greenTiles, selectedUnit.Energy, selectedUnit.pos);
                gridManager.ActivateFrontierTiles(gridManager.greenTiles, gridManager.redTiles, selectedUnit.Energy);

                ///HOVER STAT PANEL OFF
                HoverPanelOff();
            }
            else
            {
                //this shouldn't happen
                Debug.Log("SelectingDestination: invalid condition");
            }


            ///UNIT MOVEMENT
            if (Input.GetMouseButtonUp(0) && canClick)
            {
                //Move Unit
                if (selectedUnit != null)
                {
                    //Limit movement to range
                    if (gridManager.greenTiles[pos.x, pos.y].activeSelf && tileManager.GetUnit(pos) == null)
                    {
                        //Move
                        Stack <Vector2Int> path = FindPath(selectedUnit.pos, pos);
                        selectedUnit.path  = path;
                        selectedUnit.state = UnitState.Moving;
                        selectedUnit.pos   = pos;
                    }
                    else if (tileManager.GetUnit(pos) == selectedUnit)
                    {
                        //select own tile
                        selectedUnit.state = UnitState.AwaitingChoice;

                        ///HOVER STAT PANEL OFF
                        HoverPanelOff();
                    }
                }
            }
            //Cancel selection
            else if (Input.GetMouseButtonUp(1))
            {
                if (selectedUnit != null)
                {
                    selectedUnit = null;
                    state        = CursorState.SelectingUnit;
                }
            }

            break;

            #endregion
        case CursorState.AwaitingChoice:
            #region Awaiting Choice

            //cancel
            if (Input.GetMouseButtonUp(1))
            {
                if (selectedUnit.state == UnitState.AwaitingChoice)
                {
                    selectedUnit.pos = savedPos;
                    selectedUnit.transform.localPosition = new Vector3(savedPos.x, selectedUnit.transform.localPosition.y, savedPos.y);
                    selectedUnit.state = UnitState.SelectingDestination;
                    state = CursorState.SelectingDestination;

                    var panel = GameObject.FindGameObjectWithTag("ActionPanel");

                    if (panel != null)
                    {
                        panel.GetComponent <ActionPanelManager>().ClosePanel();
                    }
                }
                else if (selectedUnit.state == UnitState.SelectingTarget)
                {
                    state = CursorState.SelectingTarget;     //probably unnecessary
                    var panel = GameObject.FindGameObjectWithTag("ActionPanel");

                    if (panel != null)
                    {
                        panel.GetComponent <ActionPanelManager>().ClosePanel();
                    }
                }
                return;
            }

            if (GameObject.FindGameObjectWithTag("ActionPanel") != null)
            {
                return;
            }

            ///ACTION PANEL ON
            var actionPanel = Instantiate(hoverActions) as GameObject;
            actionPanel.transform.SetParent(gameObject.transform.parent);
            var actionManager = actionPanel.GetComponent <ActionPanelManager>();
            //Debug.Log("creating panel");
            //panel 1
            if (selectedUnit.state == UnitState.AwaitingChoice)
            {
                //Debug.Log("created action panel");
                actionManager.UpdatePosition(selectedUnit);
                actionManager.AddActionButton(ActionButton.Attack);
                actionManager.AddActionButton(ActionButton.Wait);
            }
            else     //panel 2
            {
                //Debug.Log("created attack panel");
                actionManager.UpdatePosition(selectedUnit.combatTarget);     //change to taget unit

                //get possible attacks
                foreach (AttackType attack in selectedUnit.attackTypes)
                {
                    switch (attack)
                    {
                    case AttackType.Cripple:
                        actionManager.AddActionButton(ActionButton.Cripple);
                        break;

                    case AttackType.Impair:
                        actionManager.AddActionButton(ActionButton.Impair);
                        break;

                    case AttackType.Weaken:
                        actionManager.AddActionButton(ActionButton.Weaken);
                        break;
                    }
                }
            }

            break;

            #endregion
        case CursorState.SelectingTarget:
            #region Selecting Target
            MoveCursor();

            ///TILE VISIBILITY
            if (selectedUnit != null)
            //if a character is already selected, revert the range to them
            {
                gridManager.DeactivateAllTiles(gridManager.greenTiles);
                gridManager.DeactivateAllTiles(gridManager.redTiles);
                gridManager.ActivateAroundTile(gridManager.greenTiles, 0, selectedUnit.pos);     //can this be removed?
                gridManager.ActivateFrontierTiles(gridManager.greenTiles, gridManager.redTiles, selectedUnit.Energy);
            }

            if (hoverUnit != null && hoverUnit != selectedUnit)
            {
                ///HOVER STAT PANEL ON
                HoverPanelOn();
            }
            else
            {
                ///HOVER PANEL OFF
                HoverPanelOff();
            }

            ///UNIT SELECTION
            if (Input.GetMouseButtonUp(0) && canClick)
            {
                if (selectedUnit != null)
                {
                    if (gridManager.redTiles[pos.x, pos.y].activeSelf && tileManager.GetUnit(pos) != null)
                    {
                        //attacking
                        selectedUnit.combatTarget = hoverUnit;
                        //selectedUnit.state = UnitState.Attacking;
                        state = CursorState.AwaitingChoice;
                        //Debug.Log("cursor: awaiting choice");

                        ///HOVER STAT PANEL OFF
                        HoverPanelOff();
                    }
                }
            }
            //Cancel selection
            else if (Input.GetMouseButtonUp(1))
            {
                if (selectedUnit != null)
                {
                    //TODO: cancelling;
                    selectedUnit.state = UnitState.AwaitingChoice;
                    state = CursorState.AwaitingChoice;
                }
            }

            break;

            #endregion
        case CursorState.Inactive:
            #region Inactive
            gridManager.DeactivateAllTiles(gridManager.greenTiles);
            gridManager.DeactivateAllTiles(gridManager.redTiles);

            if (GetComponent <SpriteRenderer>().enabled)
            {
                GetComponent <SpriteRenderer>().enabled = false;
            }
            HoverPanelOff();
            break;
            #endregion
        }
    }