// Assets/_Project/Scripts/Gameplay/EnemyDefinition.cs using UnityEngine; namespace TD.Gameplay { /// /// Data definition for a single enemy type. One asset per type; shared across all /// instances spawned in a match. Consumed by at spawn time. /// /// /// Follows the same ScriptableObject pattern as TowerDefinition: data lives /// in project assets, only the asset reference (or its fields) crosses runtime code. /// Replace with a real mesh/animator when art is ready — /// no code changes required. /// [CreateAssetMenu(fileName = "EnemyDefinition", menuName = "TD/Enemy Definition", order = 3)] public class EnemyDefinition : ScriptableObject { [Header("Identity")] [Tooltip("Human-readable name shown in debug logs and future enemy-info UI.")] public string DisplayName; [Header("Stats")] [Tooltip("Maximum hit points for this enemy type.")] public float MaxHp = 100f; [Tooltip("Movement speed in world units per second along the A* path.")] public float MoveSpeed = 3f; [Tooltip("When true this enemy flies over tower footprints. " + "Towers with GroundedOnly=true will not target it. " + "Flying enemies follow the same A* path but are not physically " + "blocked by tower colliders (handled in EnemyMovement).")] public bool IsFlying; [Header("Rewards / Costs")] [Tooltip("Gold awarded to the player whose tower lands the killing blow.")] public int GoldReward = 10; [Tooltip("Number of lives deducted from the shared pool when this enemy " + "reaches the Goal. Boss enemies might cost 2 or more lives.")] public int LivesCost = 1; [Header("Visuals")] [Tooltip("Prefab spawned in the world for this enemy. Must have NetworkObject, " + "NetworkTransform, EnemyHealth, EnemyStatus, and EnemyMovement at its root. " + "Place it on the Enemy physics layer.")] public GameObject EnemyPrefab; } }