diff --git a/Assets/Scenes/Island.unity b/Assets/Scenes/Island.unity index e1ac69b..fcd3ed3 100644 --- a/Assets/Scenes/Island.unity +++ b/Assets/Scenes/Island.unity @@ -3964,6 +3964,7 @@ MonoBehaviour: _gameManager: {fileID: 1875710079} _sandPathBuildService: {fileID: 305503} _turretShop: {fileID: 1311268619} + _spawnDeathControl: {fileID: 694046010} --- !u!1 &645921916 GameObject: m_ObjectHideFlags: 0 @@ -4217,6 +4218,7 @@ GameObject: m_Component: - component: {fileID: 694046009} - component: {fileID: 694046008} + - component: {fileID: 694046010} m_Layer: 0 m_Name: EnemySpawner m_TagString: Untagged @@ -4240,7 +4242,9 @@ MonoBehaviour: _pathBuildService: {fileID: 305503} _enemyHolder: {fileID: 180146475} _spawnPoint: {fileID: 0} - _wallet: {fileID: 1030979928} + _onEnemySpawned: + m_PersistentCalls: + m_Calls: [] --- !u!4 &694046009 Transform: m_ObjectHideFlags: 0 @@ -4257,6 +4261,24 @@ Transform: - {fileID: 180146475} m_Father: {fileID: 481586150} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &694046010 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 694046007} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 584d2a34a7bab574594a37606a39be8e, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::SpawnDeathEnemyController + _gameManager: {fileID: 1875710079} + _enemySpawner: {fileID: 694046008} + _wallet: {fileID: 1030979928} + _onLastEnemyDestroyed: + m_PersistentCalls: + m_Calls: [] --- !u!1001 &697685528 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/Debugger.cs b/Assets/Scripts/Debugger.cs index b3b7eef..d7afc5f 100644 --- a/Assets/Scripts/Debugger.cs +++ b/Assets/Scripts/Debugger.cs @@ -5,6 +5,7 @@ public class Debugger : MonoBehaviour [SerializeField] private GameManager _gameManager; [SerializeField] private SandPathBuildService _sandPathBuildService; [SerializeField] private TurretsShop _turretShop; + [SerializeField] private SpawnDeathEnemyController _spawnDeathControl; private void OnEnable() { @@ -12,6 +13,7 @@ public class Debugger : MonoBehaviour _sandPathBuildService.OnBuildComplete += OnBuildComplete; _turretShop.OnTurretSelected += OnTurretSelected; _turretShop.OnTurretDeselected += OnTurretDeselected; + _spawnDeathControl.OnLastEnemyDestroyed += OnLastEnemyDestroyed; } private void OnDisable() @@ -20,6 +22,7 @@ public class Debugger : MonoBehaviour _sandPathBuildService.OnBuildComplete -= OnBuildComplete; _turretShop.OnTurretSelected -= OnTurretSelected; _turretShop.OnTurretDeselected -= OnTurretDeselected; + _spawnDeathControl.OnLastEnemyDestroyed -= OnLastEnemyDestroyed; } private static void OnGameStateChanged(GameManager.GameState newState) @@ -41,4 +44,9 @@ public class Debugger : MonoBehaviour { print("Turret deselected"); } + + private void OnLastEnemyDestroyed() + { + print("Last enemy destroyed"); + } } \ No newline at end of file diff --git a/Assets/Scripts/Enemy.cs b/Assets/Scripts/Enemy.cs index efff243..92b1b15 100644 --- a/Assets/Scripts/Enemy.cs +++ b/Assets/Scripts/Enemy.cs @@ -11,6 +11,7 @@ public class Enemy : MonoBehaviour [SerializeField] private int _killReward = 10; [SerializeField] private UnityEvent _onHealthChanged; [SerializeField] private UnityEvent _onDeath; + [SerializeField] private UnityEvent _onDestroyed; private Queue _path; private Vector3 _target; @@ -26,7 +27,13 @@ public class Enemy : MonoBehaviour add => _onDeath.AddListener(value); remove => _onDeath.RemoveListener(value); } - + + public event UnityAction OnDestroyed + { + add => _onDestroyed.AddListener(value); + remove => _onDestroyed.RemoveListener(value); + } + public SandPathBuildService PathBuildService { get => _pathService; @@ -82,6 +89,8 @@ public class Enemy : MonoBehaviour } } + private void OnDestroy() => _onDestroyed?.Invoke(); + public class OnEnemyDeathEventArgs { public int KillReward { get; set; } diff --git a/Assets/Scripts/EnemySpawner.cs b/Assets/Scripts/EnemySpawner.cs index d7d32f6..4898883 100644 --- a/Assets/Scripts/EnemySpawner.cs +++ b/Assets/Scripts/EnemySpawner.cs @@ -1,7 +1,6 @@ -using System; using System.Collections; using UnityEngine; -using System.Collections.Generic; +using UnityEngine.Events; public class EnemySpawner : MonoBehaviour { @@ -9,9 +8,13 @@ public class EnemySpawner : MonoBehaviour [SerializeField] private SandPathBuildService _pathBuildService; [SerializeField] private Transform _enemyHolder; [SerializeField] private Transform _spawnPoint; - [SerializeField] private Wallet _wallet; + [SerializeField] private UnityEvent _onEnemySpawned; - //private readonly List _enemies = new(); + public event UnityAction OnEnemySpawned + { + add => _onEnemySpawned.AddListener(value); + remove => _onEnemySpawned.RemoveListener(value); + } private void Awake() { @@ -42,8 +45,7 @@ public class EnemySpawner : MonoBehaviour { var enemy = Instantiate(prefab, _spawnPoint.position, _spawnPoint.rotation, _enemyHolder); enemy.PathBuildService = _pathBuildService; - enemy.OnDeath += e => _wallet.AddMoney(e.KillReward); - //_enemies.Add(enemy); + _onEnemySpawned?.Invoke(enemy); yield return wait; } diff --git a/Assets/Scripts/SpawnDeathEnemyController.cs b/Assets/Scripts/SpawnDeathEnemyController.cs new file mode 100644 index 0000000..e276a83 --- /dev/null +++ b/Assets/Scripts/SpawnDeathEnemyController.cs @@ -0,0 +1,41 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Events; + +public class SpawnDeathEnemyController : MonoBehaviour +{ + [SerializeField] private GameManager _gameManager; + [SerializeField] private EnemySpawner _enemySpawner; + [SerializeField] private Wallet _wallet; + [SerializeField] private UnityEvent _onLastEnemyDestroyed; + + public event UnityAction OnLastEnemyDestroyed + { + add => _onLastEnemyDestroyed.AddListener(value); + remove => _onLastEnemyDestroyed.RemoveListener(value); + } + + private readonly List _enemies = new(); + + private void OnEnable() + { + _enemySpawner.OnEnemySpawned += OnEnemySpawned; + } + + private void OnDisable() + { + _enemySpawner.OnEnemySpawned -= OnEnemySpawned; + } + + private void OnEnemySpawned(Enemy enemy) + { + enemy.OnDeath += e => _wallet.AddMoney(e.KillReward); + enemy.OnDestroyed += () => + { + _enemies.Remove(enemy); + if (_enemies.Count == 0) + _onLastEnemyDestroyed?.Invoke(); + }; + _enemies.Add(enemy); + } +} \ No newline at end of file diff --git a/Assets/Scripts/SpawnDeathEnemyController.cs.meta b/Assets/Scripts/SpawnDeathEnemyController.cs.meta new file mode 100644 index 0000000..f1bb46c --- /dev/null +++ b/Assets/Scripts/SpawnDeathEnemyController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 584d2a34a7bab574594a37606a39be8e \ No newline at end of file