示例#1
0
        public void SetHarvestState(HarvestState newState)
        {
            harvestState = newState;

            switch (harvestState)
            {
            case HarvestState.MoveToField:
                var order = new MovePositionOrder();
                order.executor     = selfUnit;
                order.movePosition = resourcesField.transform.position + new Vector3(Random.Range(-randomFieldDistance, randomFieldDistance), 0, Random.Range(-randomFieldDistance, randomFieldDistance));                         // todo change to proportion of resource field size
                selfUnit.AddOrder(order, false, isReceivedEventNeeded: false);
                break;

            case HarvestState.Harvest:
                harvestTimeLeft = selfUnit.data.harvestTime;
                break;

            case HarvestState.MoveToRefinery:
                var orderBack = new MovePositionOrder();
                orderBack.movePosition = nearestRefinery.CarryOutResourcesPoint.position;
                selfUnit.AddOrder(orderBack, false, isReceivedEventNeeded: false);
                break;

            case HarvestState.CarryOutResources:
                carryOutTimeLeft         = selfUnit.data.harvestCarryOutTime;
                addedToRefineryResources = 0;
                break;
            }
        }
        public void ShuffleUnitsOnExit(Vector3 origin, Unit askedFromUnit, int depth = 0)
        {
            var colliders = Physics.OverlapCapsule(origin, origin + Vector3.up * 20f, 1f);

            for (int i = 0; i < colliders.Length; i++)
            {
                var unit = colliders[i].GetComponent <Unit>();

                if (unit && askedFromUnit != unit && unit.IsInMyTeam(selfUnit) && unit.data.moveType == askedFromUnit.data.moveType)                 //  && !unit.HasOrders() // has orders was needed to prevent stopping units who just moved near exit point, but works bad
                {
                    int randomizeDirection = Random.Range(0, 2);
                    var direction          = randomizeDirection == 0 ? 1 : -1;

                    var moveOrder = new MovePositionOrder();
                    moveOrder.movePosition = unit.transform.position + (3f * direction * unit.transform.right);

                    if (depth < 2)
                    {
                        ShuffleUnitsOnExit(moveOrder.movePosition, unit, depth + 1);
                    }

                    unit.AddOrder(moveOrder, false);
                }
            }
        }
示例#3
0
        public override Order Clone()
        {
            MovePositionOrder order = new MovePositionOrder
            {
                movePosition = movePosition
            };

            return(order);
        }
示例#4
0
        public void ExitUnit(Unit unit)
        {
            SetUnitCarryState(unit, false);

            var randomedX = Mathf.Sin(Random.Range(-1f, 1f) * Mathf.PI);
            var randomedZ = Mathf.Cos(Random.Range(-1f, 1f) * Mathf.PI);

            unit.transform.position = transform.position + new Vector3(randomedX, 0f, randomedZ);

            var order = new MovePositionOrder();

            order.movePosition = unit.transform.position + new Vector3(randomedX, 0f, randomedZ) * 2f;
            unit.AddOrder(order, false, false);

            carryingUnits.Remove(unit);
        }
        void SpawnCurrentUnit(UnitData unitData)
        {
            var spawnedUnit = SpawnController.SpawnUnit(unitData, selfUnit.OwnerPlayerId, spawnPoint);

            if (spawnedUnit.GetComponent <Harvester>())            // resource harvesters have their own code to move to the resource field.
            {
                return;
            }

            var order = new MovePositionOrder
            {
                movePosition = moveWaypoint.position
            };

            if (unitData.moveType == UnitData.MoveType.Flying)
            {
                order.movePosition += new Vector3(Random.Range(-3f, 3f), 0f, Random.Range(-3f, 3f));
            }

            spawnedUnit.AddOrder(order, false);

            ShuffleUnitsOnExit(order.movePosition, selfUnit);
        }