diff --git a/Assets/Scenes/Levels/1-1.unity b/Assets/Scenes/Levels/1-1.unity index f95692f..bc4ddd1 100644 --- a/Assets/Scenes/Levels/1-1.unity +++ b/Assets/Scenes/Levels/1-1.unity @@ -470,6 +470,38 @@ SpriteRenderer: m_SpriteTileMode: 0 m_WasSpriteAssigned: 1 m_SpriteSortPoint: 0 +--- !u!1 &8883395 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8883396} + m_Layer: 0 + m_Name: SpawnZones + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8883396 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8883395} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1818583591} + m_Father: {fileID: 144963232} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &9184405 GameObject: m_ObjectHideFlags: 0 @@ -123497,6 +123529,7 @@ Transform: m_Children: - {fileID: 625438257} - {fileID: 845624047} + - {fileID: 8883396} m_Father: {fileID: 1053302775} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &144963233 @@ -503951,6 +503984,102 @@ SpriteRenderer: m_SpriteTileMode: 0 m_WasSpriteAssigned: 1 m_SpriteSortPoint: 0 +--- !u!1 &1818583590 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1818583591} + - component: {fileID: 1818583593} + - component: {fileID: 1818583592} + m_Layer: 0 + m_Name: NoProjectiles + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1818583591 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1818583590} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 48, y: 6, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8883396} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1818583592 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1818583590} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b5c91a3a7ea71314e9c60d5e48b397d4, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::RR.Game2D.Behaviour.EntitySpawnerZone + prefabs: + - prefab: {fileID: 3321014767926845978, guid: acfc0078c078bda4bb708ac4d22f60df, type: 3} + weight: 0 + - prefab: {fileID: 5620532696342616547, guid: 64b2e8b5daaf53048a7ae0709db68282, type: 3} + weight: 0 +--- !u!61 &1818583593 +BoxCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1818583590} + m_Enabled: 1 + serializedVersion: 3 + m_Density: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ForceSendLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ForceReceiveLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ContactCaptureLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_CallbackLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_IsTrigger: 0 + m_UsedByEffector: 0 + m_CompositeOperation: 0 + m_CompositeOrder: 0 + m_Offset: {x: 36.5, y: 1.5} + m_SpriteTilingProperty: + border: {x: 0, y: 0, z: 0, w: 0} + pivot: {x: 0, y: 0} + oldSize: {x: 0, y: 0} + newSize: {x: 0, y: 0} + adaptiveTilingThreshold: 0 + drawMode: 0 + adaptiveTiling: 0 + m_AutoTiling: 0 + m_Size: {x: 74, y: 22} + m_EdgeRadius: 0 --- !u!4 &1818698340 stripped Transform: m_CorrespondingSourceObject: {fileID: 2923341736873825775, guid: e5783e81b8b0fd648974f0ec7ebde930, type: 3} diff --git a/Assets/Scripts/Behaviour/EntitySpawner.cs b/Assets/Scripts/Behaviour/EntitySpawner.cs index 3694c7a..1178b02 100644 --- a/Assets/Scripts/Behaviour/EntitySpawner.cs +++ b/Assets/Scripts/Behaviour/EntitySpawner.cs @@ -268,7 +268,7 @@ namespace RR.Game2D.Behaviour for (int i = 0; i < EntitySpawnerZone.ActiveZones.Count; i++) { EntitySpawnerZone zone = EntitySpawnerZone.ActiveZones[i]; - if (zone != null && zone.IsPointInside(spawnPosition)) + if (zone != null && zone.MatchesSpawner(this) && zone.IsPointInside(spawnPosition)) { activePrefabs = zone.Prefabs; break; diff --git a/Assets/Scripts/Behaviour/EntitySpawnerZone.cs b/Assets/Scripts/Behaviour/EntitySpawnerZone.cs index 5898167..21c0b49 100644 --- a/Assets/Scripts/Behaviour/EntitySpawnerZone.cs +++ b/Assets/Scripts/Behaviour/EntitySpawnerZone.cs @@ -12,6 +12,10 @@ namespace RR.Game2D.Behaviour [Tooltip("Список префабов, которые будут спавниться вместо оригинальных префабов спавнера внутри этой зоны.")] [SerializeField] private EntitySpawner.SpawnPrefabEntry[] prefabs; + [Header("Targeting")] + [Tooltip("Фильтр по имени GameObject спавнера. Если не пусто, зона будет переопределять только те спавнеры, чье имя содержит этот текст (без учета регистра).")] + [SerializeField] private string spawnerNameFilter = "Enemy"; + private Collider2D _collider; // Статический список всех активных зон на сцене для быстрого поиска @@ -39,6 +43,20 @@ namespace RR.Game2D.Behaviour ActiveZones.Remove(this); } + /// + /// Проверяет, подходит ли данный спавнер под критерии фильтрации зоны. + /// + public bool MatchesSpawner(EntitySpawner spawner) + { + if (spawner == null) + return false; + + if (string.IsNullOrEmpty(spawnerNameFilter)) + return true; + + return spawner.gameObject.name.IndexOf(spawnerNameFilter, StringComparison.OrdinalIgnoreCase) >= 0; + } + /// /// Проверяет, находится ли мировая точка внутри коллайдера зоны. /// @@ -49,7 +67,19 @@ namespace RR.Game2D.Behaviour _collider = GetComponent(); } - return _collider != null && _collider.OverlapPoint(point); + if (_collider == null) + return false; + + // Если это BoxCollider2D, выполняем точную математическую проверку в локальных координатах. + // Это работает надежно в любой момент (даже до первого физического обновления) и не зависит от Z-координаты. + if (_collider is BoxCollider2D box) + { + Vector3 localPoint = transform.InverseTransformPoint(point); + return Mathf.Abs(localPoint.x - box.offset.x) <= box.size.x * 0.5f && + Mathf.Abs(localPoint.y - box.offset.y) <= box.size.y * 0.5f; + } + + return _collider.OverlapPoint(point); } private void OnDrawGizmos()