using UnityEngine; [DisallowMultipleComponent] public class MapTarget : MonoBehaviour { [Header("Target State (Runtime)")] [SerializeField] private TargetConfig config; [SerializeField] private int targetId = -1; [SerializeField] private float timeUntilAttack; [SerializeField] private Vector2 mapCoordinates; [SerializeField] private int currentHealth; [SerializeField] private MissileType requiredMissileType; private MapCoordinateSystem coordinateSystem; private MapPlayer player; private Renderer[] targetRenderers; private Collider[] targetColliders; public int TargetId => targetId; public Vector2 MapCoordinates => mapCoordinates; public MapCoordinateSystem CoordinateSystem => coordinateSystem; public TargetConfig Config => config; public MapPlayer Player => player; public float TimeUntilAttack => timeUntilAttack; public int CurrentHealth => currentHealth; public MissileType RequiredMissileType => requiredMissileType; public void Configure( TargetConfig newConfig, MapCoordinateSystem newCoordinateSystem, MapPlayer newPlayer) { config = newConfig; coordinateSystem = newCoordinateSystem; player = newPlayer; } public void ApplyNetworkState(MapTargetNetworkState state) { targetId = state.TargetId; timeUntilAttack = state.AttackTimeRemaining; currentHealth = state.Health; requiredMissileType = config != null ? config.RequiredMissileType : MissileType.None; SetMapCoordinates(state.Coordinates); } public void SetMapCoordinates(Vector2 coordinates) { mapCoordinates = coordinateSystem != null ? coordinateSystem.ClampCoordinates(coordinates) : new Vector2( Mathf.Clamp(coordinates.x, 0f, MapCoordinateSystem.CoordinateMaximum), Mathf.Clamp(coordinates.y, 0f, MapCoordinateSystem.CoordinateMaximum)); if (coordinateSystem != null && coordinateSystem.HasValidCorners()) transform.position = coordinateSystem.CoordinatesToWorldPosition(mapCoordinates); } public Vector2 GetMapCoordinates() => mapCoordinates; public void SetVisualsVisible(bool isVisible) { if (targetRenderers == null) targetRenderers = GetComponentsInChildren(true); if (targetColliders == null) targetColliders = GetComponentsInChildren(true); foreach (Renderer targetRenderer in targetRenderers) { if (targetRenderer != null) targetRenderer.enabled = isVisible; } // Map targets are presentation objects, never physical world objects. foreach (Collider targetCollider in targetColliders) { if (targetCollider != null) targetCollider.enabled = false; } } protected virtual void TickMovement(float deltaTime) { } }