//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 }
//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 } }
//a method that removes a movement task from the movement queue public void RemoveMovementTask(MovementTask movementTask) { movementQueue.Remove(movementTask); }