Exemple #1
0
    void Update()
    {
        if (null == CurrentPlayer)
        {
            return;
        }

        Ray ray = cam.ScreenPointToRay(Input.mousePosition);

        if (Input.GetMouseButtonDown(0) && FindObjectOfType <EventSystem>().currentSelectedGameObject == null)
        {
            switch (state)
            {
            case State.Idle:
            {
                selectedTower = null;

                RaycastHit hitInfo;
                if (Physics.Raycast(ray, out hitInfo, float.MaxValue, towerMask))
                {
                    var t = hitInfo.collider.GetComponent <TowerInfo>();
                    if (null != t && t.playerSlotId == CurrentPlayer.SlotId && VisionController.Instance.InVision(t.coord))
                    {
                        selectedTower = t;
                        towerCoord    = t.coord;
                        towerRange    = RangeUtils.GetRangeOfTowerForLocalPlayerClient(t);
                        if (t.type == TowerType.AttackTower && t.attacked == false && ManualAttackEnabled && t.state == TowerInfo.BuildingState.Working)
                        {
                            UIController.Instance.ShowActionPanel(hitInfo.point, new Sprite[] { actionButtonImage[1], actionButtonImage[0] }, new UnityAction[] { SelectAttackee, DestroyTower });
                        }
                        else
                        {
                            UIController.Instance.ShowActionPanel(hitInfo.point, new Sprite[] { actionButtonImage[0] }, new UnityAction[] { DestroyTower });
                        }
                    }
                }

                if (null == selectedTower)
                {
                    UIController.Instance.HideActionPanel();
                }
            }
            break;

            case State.SelectBuildingCoord:
            {
                RaycastHit hitInfo;
                if (Physics.Raycast(ray, out hitInfo, float.MaxValue, terrainMask))
                {
                    var h = hitInfo.collider.GetComponent <Hexagon>();
                    if (null != h)
                    {
                        CmdTryBuildTower(CurrentPlayer.SlotId, buildingTowerIndex, h.coord);
                    }
                }
            }
            break;

            case State.SelectAttactTarget:
            {
                if (ManualAttackEnabled)
                {
                    RaycastHit hitInfo;
                    if (Physics.Raycast(ray, out hitInfo, float.MaxValue, towerMask))
                    {
                        var t = hitInfo.collider.GetComponent <TowerInfo>();
                        if (null != t && t.playerSlotId != CurrentPlayer.SlotId)
                        {
                            if (towerCoord != HexCoord.Invalid && towerRange.Contains(t.coord))
                            {
                                CmdTryAttackTower(CurrentPlayer.SlotId, towerCoord, t.coord);
                            }
                        }
                    }
                }
            }
            break;

            default:
                break;
            }
        }
        else if (Input.GetMouseButtonDown(1))
        {
            SwitchTo(State.Idle);
        }
        else
        {
            if (state == State.SelectBuildingCoord)
            {
                HexCoord coord = HexCoord.Invalid;

                RaycastHit hitInfo;
                if (Physics.Raycast(ray, out hitInfo, float.MaxValue, terrainMask))
                {
                    var h = hitInfo.collider.GetComponent <Hexagon>();

                    if (null != h)
                    {
                        coord = h.coord;
                    }
                }

                if (coord != lastHoveringCoord)
                {
                    if (coord != HexCoord.Invalid)
                    {
                        ghostTower.SetActive(true);
                        ghostTowerMat.color           = buildingAllowed;
                        ghostTower.transform.position = MapManager.Instance.GetMountPosition(coord);

                        if (!VisionController.Instance.InVision(coord))
                        {
                            ghostTowerMat.color = buildingForbiden;
                        }
                        else
                        {
                            var allTowers = FindObjectsOfType <TowerInfo>();
                            for (int i = 0; i < allTowers.Length; ++i)
                            {
                                if (allTowers[i].coord == coord)
                                {
                                    ghostTowerMat.color = buildingForbiden;
                                    break;
                                }
                            }
                        }
                    }
                    else
                    {
                        ghostTower.SetActive(false);
                    }

                    lastHoveringCoord = coord;
                }
            }
        }
    }