diff --git a/Assets/Scenes/Island.unity b/Assets/Scenes/Island.unity index 6d42439..8a0607d 100644 --- a/Assets/Scenes/Island.unity +++ b/Assets/Scenes/Island.unity @@ -2336,7 +2336,7 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 473347667} + - m_Target: {fileID: 359661414} m_TargetAssemblyTypeName: GameOverMenu, Assembly-CSharp m_MethodName: RestartGame m_Mode: 1 @@ -2733,6 +2733,57 @@ Transform: m_CorrespondingSourceObject: {fileID: 5368672011475721328, guid: 8dd20c91f0d7a7b419f6bedcd1870cba, type: 3} m_PrefabInstance: {fileID: 352804702} m_PrefabAsset: {fileID: 0} +--- !u!1 &359661412 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 359661413} + - component: {fileID: 359661414} + m_Layer: 0 + m_Name: GameOverMenu + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &359661413 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 359661412} + 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: 473347664} + m_Father: {fileID: 1678567591} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &359661414 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 359661412} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 79c22679605c9274ab2a50d6c80e2b19, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::GameOverMenu + _tower: {fileID: 1739395621} + _menuPanel: {fileID: 473347664} --- !u!1001 &360688809 PrefabInstance: m_ObjectHideFlags: 0 @@ -3258,7 +3309,6 @@ GameObject: - component: {fileID: 473347664} - component: {fileID: 473347666} - component: {fileID: 473347665} - - component: {fileID: 473347667} m_Layer: 0 m_Name: GameOverPanel m_TagString: Untagged @@ -3273,19 +3323,19 @@ RectTransform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 473347663} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + 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: 1168350718} - {fileID: 2107886998} - m_Father: {fileID: 1678567591} + m_Father: {fileID: 359661413} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_SizeDelta: {x: 846.34344, y: 567.14557} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &473347665 MonoBehaviour: @@ -3325,18 +3375,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 473347663} m_CullTransparentMesh: 1 ---- !u!114 &473347667 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 473347663} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 79c22679605c9274ab2a50d6c80e2b19, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::GameOverMenu --- !u!1001 &477181437 PrefabInstance: m_ObjectHideFlags: 0 @@ -4188,6 +4226,7 @@ MonoBehaviour: _sandPathBuildService: {fileID: 305503} _turretShop: {fileID: 1311268619} _spawnDeathControl: {fileID: 694046010} + _tower: {fileID: 1739395621} --- !u!1 &645921916 GameObject: m_ObjectHideFlags: 0 @@ -6626,7 +6665,7 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 473347667} + - m_Target: {fileID: 359661414} m_TargetAssemblyTypeName: GameOverMenu, Assembly-CSharp m_MethodName: MainMenu m_Mode: 1 @@ -11302,7 +11341,7 @@ RectTransform: m_Children: - {fileID: 1789632538} - {fileID: 844851690} - - {fileID: 473347664} + - {fileID: 359661413} m_Father: {fileID: 424609984} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -11684,6 +11723,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 49451834470586d42a0a0039b348f818, type: 3} m_Name: m_EditorClassIdentifier: Assembly-CSharp::Tower + _onGameOver: + m_PersistentCalls: + m_Calls: [] --- !u!4 &1739395622 Transform: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/Debugger.cs b/Assets/Scripts/Debugger.cs index d7afc5f..324b565 100644 --- a/Assets/Scripts/Debugger.cs +++ b/Assets/Scripts/Debugger.cs @@ -6,6 +6,7 @@ public class Debugger : MonoBehaviour [SerializeField] private SandPathBuildService _sandPathBuildService; [SerializeField] private TurretsShop _turretShop; [SerializeField] private SpawnDeathEnemyController _spawnDeathControl; + [SerializeField] private Tower _tower; private void OnEnable() { @@ -14,6 +15,7 @@ public class Debugger : MonoBehaviour _turretShop.OnTurretSelected += OnTurretSelected; _turretShop.OnTurretDeselected += OnTurretDeselected; _spawnDeathControl.OnLastEnemyDestroyed += OnLastEnemyDestroyed; + _tower.OnGameOver += OnGameOver; } private void OnDisable() @@ -23,6 +25,7 @@ public class Debugger : MonoBehaviour _turretShop.OnTurretSelected -= OnTurretSelected; _turretShop.OnTurretDeselected -= OnTurretDeselected; _spawnDeathControl.OnLastEnemyDestroyed -= OnLastEnemyDestroyed; + _tower.OnGameOver -= OnGameOver; } private static void OnGameStateChanged(GameManager.GameState newState) @@ -49,4 +52,9 @@ public class Debugger : MonoBehaviour { print("Last enemy destroyed"); } + + private void OnGameOver() + { + print("Game over"); + } } \ No newline at end of file diff --git a/Assets/Scripts/Tower.cs b/Assets/Scripts/Tower.cs index 90ae6ac..74c0e13 100644 --- a/Assets/Scripts/Tower.cs +++ b/Assets/Scripts/Tower.cs @@ -1,14 +1,29 @@ using System; using UnityEngine; +using UnityEngine.Events; [RequireComponent(typeof(TowerHealth))] public class Tower : MonoBehaviour { + [SerializeField] private UnityEvent _onGameOver; + + public event UnityAction OnGameOver + { + add => _onGameOver.AddListener(value); + remove => _onGameOver.RemoveListener(value); + } + private TowerHealth _towerHealth; - private void Start() + private void OnEnable() { _towerHealth = GetComponent(); + _towerHealth.OnHealthChanged += OnHealthChanged; + } + + private void OnDisable() + { + _towerHealth.OnHealthChanged -= OnHealthChanged; } private void OnTriggerEnter(Collider other) @@ -16,4 +31,10 @@ public class Tower : MonoBehaviour if (other.TryGetComponent(out Enemy enemy)) _towerHealth.TakeDamage(enemy.Damage); } + + private void OnHealthChanged(TowerHealth.OnHealthChangedEventArgs args) + { + if (args.CurrentHealth <= 0) + _onGameOver?.Invoke(); + } } diff --git a/Assets/Scripts/TowerHealth.cs b/Assets/Scripts/TowerHealth.cs index 80be37a..98099c9 100644 --- a/Assets/Scripts/TowerHealth.cs +++ b/Assets/Scripts/TowerHealth.cs @@ -14,7 +14,7 @@ public class TowerHealth : MonoBehaviour add => _onHealthChanged.AddListener(value); remove => _onHealthChanged.RemoveListener(value); } - + public float MaxHealth { get => _maxHealth; @@ -47,10 +47,6 @@ public class TowerHealth : MonoBehaviour public void TakeDamage(float damage) { CurrentHealth -= damage; - - // TODO: доделать проигрыш - if (CurrentHealth <= 0) - Debug.Log("Game over"); } public class OnHealthChangedEventArgs : EventArgs diff --git a/Assets/Scripts/UI/GameOverMenu.cs b/Assets/Scripts/UI/GameOverMenu.cs index 796e3ff..e9c0367 100644 --- a/Assets/Scripts/UI/GameOverMenu.cs +++ b/Assets/Scripts/UI/GameOverMenu.cs @@ -3,13 +3,34 @@ using UnityEngine.SceneManagement; public class GameOverMenu : MonoBehaviour { + [SerializeField] private Tower _tower; + [SerializeField] private Transform _menuPanel; + + private void OnEnable() + { + _tower.OnGameOver += OnGameOver; + } + + private void OnDisable() + { + _tower.OnGameOver -= OnGameOver; + } + public void RestartGame() { + Time.timeScale = 1f; SceneManager.LoadScene("Island"); } public void MainMenu() { + Time.timeScale = 1f; SceneManager.LoadScene("MainMenu"); } + + private void OnGameOver() + { + Time.timeScale = 0f; + _menuPanel.gameObject.SetActive(true); + } }