Exemplo n.º 1
0
    // Use this for initialization
    override protected void Start()
    {
        base.Start();

        OnMouseClicked += () =>
        {
            // To disable raycast when clicking on button
            if (EventSystem.current.IsPointerOverGameObject())
            {
                return;
            }

            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            int uiLayer      = 1 << LayerMask.NameToLayer("UI");
            int factoryLayer = 1 << LayerMask.NameToLayer("Factory");
            int unitLayer    = 1 << LayerMask.NameToLayer("Unit");
            int floorLayer   = 1 << LayerMask.NameToLayer("Floor");

            RaycastHit raycastInfo;
            // factory selection
            if (Physics.Raycast(ray, out raycastInfo, Mathf.Infinity, uiLayer))
            {
                return;
            }
            else if (Physics.Raycast(ray, out raycastInfo, Mathf.Infinity, factoryLayer))
            {
                UnitFactory factory = raycastInfo.transform.GetComponent <UnitFactory>();
                if (factory != null && factory.GetTeam == team)
                {
                    if (currentFactory == factory)
                    {
                        RequestFactoryBuild();
                    }
                    else
                    {
                        UnselectCurrentFactory();
                        SelectFactory(factory);
                    }
                }
            }
            // unit selection / unselection
            else if (Physics.Raycast(ray, out raycastInfo, Mathf.Infinity, unitLayer))
            {
                bool isShiftBtPressed = Input.GetKey(KeyCode.LeftShift);
                bool isCtrlBtPressed  = Input.GetKey(KeyCode.LeftControl);

                UnselectCurrentFactory();

                Unit selectedUnit = raycastInfo.transform.GetComponent <Unit>();
                if (selectedUnit != null && selectedUnit.GetTeam == team)
                {
                    if (isShiftBtPressed)
                    {
                        UnseletecUnit(selectedUnit);
                    }
                    else if (isCtrlBtPressed)
                    {
                        SelectUnit(selectedUnit);
                    }
                    else
                    {
                        UnselectAllUnits();
                        SelectUnit(selectedUnit);
                    }
                }
            }
            // unit move target
            else if (Physics.Raycast(ray, out raycastInfo, Mathf.Infinity, floorLayer))
            {
                UnselectCurrentFactory();

                if (selectedUnitList.Count == 0)
                {
                    return;
                }

                Vector3 newPos    = raycastInfo.point;
                Vector3 targetPos = newPos;
                targetPos.y += 0.1f;
                GetTargetCursor().transform.position = targetPos;
                if (TileNavGraph.Instance.IsPosValid(newPos))
                {
                    if (selectedUnitList.Count > 1)
                    {
                        formationManager.CreateFormation(selectedUnitList);
                        List <Vector3> positions = formationManager.GetUnitsPosition(selectedUnitList.Count, targetPos);
                        for (int idx = 0; idx < selectedUnitList.Count; ++idx)
                        {
                            selectedUnitList[idx].SetTargetPos(positions[idx]);
                        }
                    }
                    else
                    {
                        foreach (Unit unit in selectedUnitList)
                        {
                            if (unit.Formation != null)
                            {
                                formationManager.RemoveFromFormation(unit);
                            }
                            unit.SetTargetPos(newPos);
                        }
                    }
                }
            }
        };

        OnDeletePressed += () =>
        {
            foreach (Unit unit in unitList)
            {
                unit.AddDamages(100);
            }
            unitList.Clear();
        };

        OnSelectAllPressed += () =>
        {
            SelectAllUnits();
        };

        OnLightCatPressed += () =>
        {
            SelectAllUnitsByCategory(Unit.ECategory.Light);
        };

        OnMediumCatPressed += () =>
        {
            SelectAllUnitsByCategory(Unit.ECategory.Medium);
        };

        OnHeavyCatPressed += () =>
        {
            SelectAllUnitsByCategory(Unit.ECategory.Heavy);
        };

        formationManager.OnFormationChange += () =>
        {
            if (selectedUnitList.Count > 1)
            {
                List <Vector3> positions = formationManager.GetUnitsPosition(selectedUnitList.Count, selectedUnitList[0].transform.position);
                for (int idx = 0; idx < selectedUnitList.Count; ++idx)
                {
                    selectedUnitList[idx].SetTargetPos(positions[idx]);
                }
            }
        };
    }