using System; using System.Collections.Generic; using UnityEngine; namespace RR.Game2D.Behaviour { [RequireComponent(typeof(Collider2D))] [DisallowMultipleComponent] public sealed class EntitySpawnerZone : MonoBehaviour { [Header("Override Prefabs")] [Tooltip("Список префабов, которые будут спавниться вместо оригинальных префабов спавнера внутри этой зоны.")] [SerializeField] private EntitySpawner.SpawnPrefabEntry[] prefabs; private Collider2D _collider; // Статический список всех активных зон на сцене для быстрого поиска public static readonly List ActiveZones = new(); public EntitySpawner.SpawnPrefabEntry[] Prefabs => prefabs; private void Awake() { _collider = GetComponent(); // Убеждаемся, что коллайдер является триггером, чтобы не вызывать физических коллизий с персонажами if (_collider != null) { _collider.isTrigger = true; } } private void OnEnable() { ActiveZones.Add(this); } private void OnDisable() { ActiveZones.Remove(this); } /// /// Проверяет, находится ли мировая точка внутри коллайдера зоны. /// public bool IsPointInside(Vector3 point) { if (_collider == null) { _collider = GetComponent(); } return _collider != null && _collider.OverlapPoint(point); } private void OnDrawGizmos() { if (_collider == null) { _collider = GetComponent(); } if (_collider == null) return; // Рисуем оранжевую рамку зоны замены в редакторе Gizmos.color = new Color(1f, 0.5f, 0f, 0.2f); if (_collider is BoxCollider2D box) { Vector3 position = transform.TransformPoint(box.offset); Vector3 size = Vector3.Scale(box.size, transform.lossyScale); Gizmos.DrawCube(position, size); Gizmos.color = new Color(1f, 0.5f, 0f, 0.8f); Gizmos.DrawWireCube(position, size); } else { // Для других типов коллайдеров рисуем сферу в центре объекта Gizmos.DrawSphere(transform.position, 0.5f); } } } }