Пример #1
0
 //a method that adds a movement task to the movement queue
 public void EnqueueMovementTask(MovementTask newMovementTask, bool recalculatingPath = false)
 {
     if (recalculatingPath == false)                                               //make sure this is not to recalculate the path
     {
         newMovementTask.unit.MovementComp.EnablePendingMovement(newMovementTask); //enable the pending movement on the unit movement component
     }
     movementQueue.AddLast(newMovementTask);                                       //add the movement task to the movement queue
 }
Пример #2
0
        //a method that moves a single unit to its target position
        private void OnMovementRequest(MovementTask movementTask)
        {
            if (movementTask.unit == null || movementTask.unit.HealthComp.IsDead() == true) //invalid/dead unit? (do not continue)
            {
                return;
            }

            //attempt to calculate a valid path for the movement:
            //if the calculate path is invalid/incomplete
            if (movementTask.unit.MovementComp.CalculatePath(movementTask.targetPosition) == false)
            {
                if (movementTask.retries < pathCalculationMaxRetries) //we still have more retries to calculate the path again
                {
                    movementTask.retries++;
                    EnqueueMovementTask(movementTask, true); //add movement task back at the end of the queue to compute the path again
                }
                else
                {
                    movementTask.unit.MovementComp.OnInvalidPath(false, true);
                }
            }
            else //if a valid path is found
            {
                movementTask.unit.MovementComp.DisablePendingMovement(false); //movement is no longer pending

                if (movementTask.attack == true) //attack movement
                {
                    movementTask.unit.AttackComp.SetTargetLocal(movementTask.attackTarget, movementTask.attackTargetPosition);
                }

                movementTask.unit.MovementComp.OnPathComplete(
                    movementTask.targetPosition,
                    movementTask.target,
                    movementTask.lookAtPosition,
                    stoppingDistance,
                    movementTask.targetMode); //move the unit
            }
        }
Пример #3
0
 //a method that removes a movement task from the movement queue
 public void RemoveMovementTask(MovementTask movementTask)
 {
     movementQueue.Remove(movementTask);
 }