AStarHeightmapGrid / Assets / PlatypusIdeas / AirPath / Runtime / Configuration / SwarmConfiguration.cs
SwarmConfiguration.cs
Raw
using UnityEngine;
using UnityEngine.Serialization;

namespace PlatypusIdeas.AirPath.Runtime.Configuration {
    /// <summary>
    /// Configuration for bird swarm behavior and spawning
    /// </summary>
    [CreateAssetMenu(fileName = "SwarmConfig", menuName = "Pathfinding/Configurations/Swarm Configuration")]
    public class SwarmConfiguration : ConfigurationBase {
        [FormerlySerializedAs("numberOfBirds")]
        [Header("Swarm Settings")]
        [SerializeField, Range(1, 50)] private int numberOfAgents = 5;
        [SerializeField, Range(0f, 20f)] private float spawnRadius = 5f;
        [SerializeField, Range(0f, 50f)] private float agentHeightOffset = 10f;
        
        [Header("Swarm Behavior")]
        [SerializeField, Range(0f, 10f)] private float pathFollowRadius = 3f;
        [SerializeField, Range(0f, 10f)] private float heightVariation = 2f;
        [SerializeField, Range(0f, 2f)] private float staggerDelay = 0.5f;
        [SerializeField] private bool maintainFormation = true;
        
        [Header("Movement Settings")]
        [SerializeField, Range(1f, 50f)] private float defaultMoveSpeed = 10f;
        [SerializeField, Range(1f, 20f)] private float defaultRotationSpeed = 5f;
        [SerializeField, Range(0.5f, 5f)] private float reachThreshold = 2f;
        
        // Properties
        public int NumberOfAgents => numberOfAgents;
        public float SpawnRadius => spawnRadius;
        public float AgentHeightOffset => agentHeightOffset;
        public float PathFollowRadius => pathFollowRadius;
        public float HeightVariation => heightVariation;
        public float StaggerDelay => staggerDelay;
        public bool MaintainFormation => maintainFormation;
        public float DefaultMoveSpeed => defaultMoveSpeed;
        public float DefaultRotationSpeed => defaultRotationSpeed;
        public float ReachThreshold => reachThreshold;
        
        public override bool Validate() {
            bool valid = true;

            if (spawnRadius < 0) {
                Debug.LogWarning($"[{ConfigurationName}] Spawn radius cannot be negative");
                spawnRadius = 0;
                valid = false;
            }
            
            return valid;
        }
        
        public override void ResetToDefaults() {
            numberOfAgents = 5;
            spawnRadius = 5f;
            agentHeightOffset = 10f;
            pathFollowRadius = 3f;
            heightVariation = 2f;
            staggerDelay = 0.5f;
            maintainFormation = true;
            defaultMoveSpeed = 10f;
            defaultRotationSpeed = 5f;
            reachThreshold = 2f;
        }
    }
}