NavigationModule.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using Shooter.Core.Components;
  2. using Shooter.Core.Entities;
  3. namespace Shooter.Gameplay.Components;
  4. /// <summary>
  5. /// Navigation module that stores movement parameters for AI-controlled entities.
  6. /// Based on Unity's NavigationModule pattern from the FPS sample.
  7. ///
  8. /// UNITY COMPARISON:
  9. /// Unity: NavigationModule as configuration component for NavMeshAgent
  10. /// MonoGame: NavigationModule as configuration for manual movement system
  11. /// </summary>
  12. public class NavigationModule : EntityComponent
  13. {
  14. /// <summary>
  15. /// Maximum movement speed in units per second.
  16. /// Unity default: varies by enemy type (HoverBot: 5.0)
  17. /// </summary>
  18. public float MoveSpeed { get; set; } = 5.0f;
  19. /// <summary>
  20. /// Maximum rotation speed in degrees per second.
  21. /// Unity default: 120 degrees/sec
  22. /// </summary>
  23. public float AngularSpeed { get; set; } = 120f;
  24. /// <summary>
  25. /// How quickly the entity accelerates to max speed (units per second squared).
  26. /// Unity default: 50.0
  27. /// </summary>
  28. public float Acceleration { get; set; } = 50.0f;
  29. /// <summary>
  30. /// Current velocity (managed by movement system).
  31. /// Unity equivalent: NavMeshAgent.velocity
  32. /// </summary>
  33. public float CurrentSpeed { get; set; } = 0f;
  34. /// <summary>
  35. /// Distance at which entity considers it has reached its destination.
  36. /// Unity default: 2.0 units
  37. /// </summary>
  38. public float PathReachingRadius { get; set; } = 2.0f;
  39. /// <summary>
  40. /// Apply acceleration to current speed, clamped to MoveSpeed.
  41. /// </summary>
  42. public void UpdateSpeed(float deltaTime, bool isMoving)
  43. {
  44. if (isMoving)
  45. {
  46. // Accelerate toward max speed
  47. CurrentSpeed += Acceleration * deltaTime;
  48. CurrentSpeed = Math.Min(CurrentSpeed, MoveSpeed);
  49. }
  50. else
  51. {
  52. // Decelerate to stop
  53. CurrentSpeed -= Acceleration * deltaTime * 2f; // Decelerate faster than accelerate
  54. CurrentSpeed = Math.Max(CurrentSpeed, 0f);
  55. }
  56. }
  57. public override void Initialize()
  58. {
  59. base.Initialize();
  60. CurrentSpeed = 0f;
  61. }
  62. }