From 7b882af11338e0555271e395ac90cab51ffbd335 Mon Sep 17 00:00:00 2001 From: mridul-outscal Date: Sat, 1 Jul 2023 14:12:00 +0530 Subject: [PATCH 01/27] Did all the branch changes --- Assets/Prefabs/UI/Canvas - UI Service.prefab | 3 +- Assets/Scenes/GameScene.unity | 9 ++-- Assets/Scripts/Main/GameService.cs | 54 +++++++++++-------- Assets/Scripts/Map/MapService.cs | 10 +++- Assets/Scripts/Player/MonkeyController.cs | 8 +-- Assets/Scripts/Player/PlayerService.cs | 36 ++++++++----- .../Player/Projectile/ProjectileController.cs | 6 ++- .../Player/Projectile/ProjectilePool.cs | 6 ++- Assets/Scripts/Sound/SoundService.cs | 2 - Assets/Scripts/UI/MapButton.cs | 11 ++-- .../MonkeyCellController.cs | 6 ++- .../MonkeySelectionUIController.cs | 5 +- Assets/Scripts/UI/UIService.cs | 46 ++++++++++++---- Assets/Scripts/Wave/Bloons/BloonController.cs | 26 ++++++--- Assets/Scripts/Wave/Bloons/BloonPool.cs | 16 +++++- Assets/Scripts/Wave/WaveService.cs | 49 ++++++++++++----- .../MonkeyController_UnitTest.cs | 23 +++++++- 17 files changed, 224 insertions(+), 92 deletions(-) diff --git a/Assets/Prefabs/UI/Canvas - UI Service.prefab b/Assets/Prefabs/UI/Canvas - UI Service.prefab index df396a85..874d2d2b 100644 --- a/Assets/Prefabs/UI/Canvas - UI Service.prefab +++ b/Assets/Prefabs/UI/Canvas - UI Service.prefab @@ -2725,7 +2725,8 @@ MonoBehaviour: currentMapText: {fileID: 996504644} nextWaveButton: {fileID: 7182248003977404941} levelSelectionPanel: {fileID: 7182248005337839508} - Map1Button: {fileID: 7182248003563694484} + mapButtons: + - {fileID: 7182248003563694489} MonkeySelectionPanel: {fileID: 7182248003610753085} cellContainer: {fileID: 7182248004710957794} monkeyCellPrefab: {fileID: -1759216286440700527, guid: ab95bb937fb867845968459d4a3784b0, type: 3} diff --git a/Assets/Scenes/GameScene.unity b/Assets/Scenes/GameScene.unity index a503223f..72e4d2ad 100644 --- a/Assets/Scenes/GameScene.unity +++ b/Assets/Scenes/GameScene.unity @@ -331,15 +331,14 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: uiService: {fileID: 1107832201} - UIService: {fileID: 1107832201} mapScriptableObject: {fileID: 11400000, guid: 412d441209954ab47a08973a630f316a, type: 2} waveScriptableObject: {fileID: 11400000, guid: 1a1805a3a12f21d4c9847d85958ab9ce, type: 2} soundScriptableObject: {fileID: 11400000, guid: 1fe1d13385d932c4987f15e4b7d1cc49, type: 2} playerScriptableObject: {fileID: 11400000, guid: ba423c4fbfbefa248b49a627b9e607b6, type: 2} - SFXSource: {fileID: 1495988717} - BGSource: {fileID: 2019223321} - ProjectileContainer: {fileID: 1802384456} - BloonContainer: {fileID: 1687025329} + sfxSource: {fileID: 1495988717} + bgMusicSource: {fileID: 2019223321} + bloonContainer: {fileID: 1687025329} + projectileContainer: {fileID: 1802384456} --- !u!1 &1495988716 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/Main/GameService.cs b/Assets/Scripts/Main/GameService.cs index 8168ddd2..a3cd1e16 100644 --- a/Assets/Scripts/Main/GameService.cs +++ b/Assets/Scripts/Main/GameService.cs @@ -1,5 +1,4 @@ using UnityEngine; -using ServiceLocator.Utilities; using ServiceLocator.Events; using ServiceLocator.Map; using ServiceLocator.Wave; @@ -9,17 +8,15 @@ namespace ServiceLocator.Main { - public class GameService : GenericMonoSingleton + public class GameService : MonoBehaviour { // Services: - public EventService EventService { get; private set; } - public MapService MapService { get; private set; } - public WaveService WaveService { get; private set; } - public SoundService SoundService { get; private set; } - public PlayerService PlayerService { get; private set; } - + private EventService eventService; + private MapService mapService; + private WaveService waveService; + private SoundService soundService; + private PlayerService playerService; [SerializeField] private UIService uiService; - public UIService UIService; // Scriptable Objects: @@ -28,25 +25,38 @@ public class GameService : GenericMonoSingleton [SerializeField] private SoundScriptableObject soundScriptableObject; [SerializeField] private PlayerScriptableObject playerScriptableObject; - // Scene Referneces: - [SerializeField] private AudioSource SFXSource; - [SerializeField] private AudioSource BGSource; - [SerializeField] private Transform ProjectileContainer; - [SerializeField] private Transform BloonContainer; + // Scene References: + [SerializeField] private AudioSource sfxSource; + [SerializeField] private AudioSource bgMusicSource; + [SerializeField] private Transform bloonContainer; + [SerializeField] private Transform projectileContainer; private void Start() { - EventService = new EventService(); - UIService.SubscribeToEvents(); - MapService = new MapService(mapScriptableObject); - WaveService = new WaveService(waveScriptableObject, BloonContainer); - SoundService = new SoundService(soundScriptableObject, SFXSource, BGSource); - PlayerService = new PlayerService(playerScriptableObject, ProjectileContainer); + InitializeServices(); + InjectDependencies(); + } + + private void InitializeServices() + { + eventService = new EventService(); + soundService = new SoundService(soundScriptableObject, sfxSource, bgMusicSource); + mapService = new MapService(mapScriptableObject); + playerService = new PlayerService(playerScriptableObject, projectileContainer); + waveService = new WaveService(waveScriptableObject); + } + + private void InjectDependencies() + { + mapService.Init(eventService); + uiService.Init(waveService, playerService, eventService); + playerService.Init(mapService, uiService, soundService); + waveService.Init(uiService, mapService, playerService, soundService, eventService, bloonContainer); } private void Update() { - PlayerService.Update(); + playerService.Update(); } - } + } } \ No newline at end of file diff --git a/Assets/Scripts/Map/MapService.cs b/Assets/Scripts/Map/MapService.cs index 5ad887b7..7c5092d7 100644 --- a/Assets/Scripts/Map/MapService.cs +++ b/Assets/Scripts/Map/MapService.cs @@ -3,11 +3,14 @@ using UnityEngine.Tilemaps; using ServiceLocator.Main; using ServiceLocator.Player; +using ServiceLocator.Events; namespace ServiceLocator.Map { public class MapService { + // Dependencies: + private EventService eventService; private MapScriptableObject mapScriptableObject; private Grid currentGrid; @@ -17,10 +20,15 @@ public class MapService public MapService(MapScriptableObject mapScriptableObject) { this.mapScriptableObject = mapScriptableObject; + } + + public void Init(EventService eventService) + { + this.eventService = eventService; SubscribeToEvents(); } - private void SubscribeToEvents() => GameService.Instance.EventService.OnMapSelected.AddListener(LoadMap); + private void SubscribeToEvents() => eventService.OnMapSelected.AddListener(LoadMap); private void LoadMap(int mapId) { diff --git a/Assets/Scripts/Player/MonkeyController.cs b/Assets/Scripts/Player/MonkeyController.cs index e35553eb..537c69c5 100644 --- a/Assets/Scripts/Player/MonkeyController.cs +++ b/Assets/Scripts/Player/MonkeyController.cs @@ -2,12 +2,13 @@ using UnityEngine; using ServiceLocator.Wave.Bloon; using ServiceLocator.Player.Projectile; -using ServiceLocator.Main; +using ServiceLocator.Sound; namespace ServiceLocator.Player { public class MonkeyController { + private SoundService soundService; private MonkeyView monkeyView; private MonkeyScriptableObject monkeyScriptableObject; private ProjectilePool projectilePool; @@ -15,8 +16,9 @@ public class MonkeyController private List bloonsInRange; private float attackTimer; - public MonkeyController(MonkeyScriptableObject monkeyScriptableObject, ProjectilePool projectilePool) + public MonkeyController(MonkeyScriptableObject monkeyScriptableObject, ProjectilePool projectilePool, SoundService soundService) { + this.soundService = soundService; monkeyView = Object.Instantiate(monkeyScriptableObject.Prefab); monkeyView.SetController(this); monkeyView.SetTriggerRadius(monkeyScriptableObject.Range); @@ -67,7 +69,7 @@ private void ShootAtTarget(BloonController targetBloon) ProjectileController projectile = projectilePool.GetProjectile(monkeyScriptableObject.projectileType); projectile.SetPosition(monkeyView.transform.position); projectile.SetTarget(targetBloon); - GameService.Instance.SoundService.PlaySoundEffects(Sound.SoundType.MonkeyShoot); + soundService.PlaySoundEffects(SoundType.MonkeyShoot); ResetAttackTimer(); } } diff --git a/Assets/Scripts/Player/PlayerService.cs b/Assets/Scripts/Player/PlayerService.cs index 366c9341..adee779b 100644 --- a/Assets/Scripts/Player/PlayerService.cs +++ b/Assets/Scripts/Player/PlayerService.cs @@ -1,12 +1,18 @@ using System.Collections.Generic; using UnityEngine; using ServiceLocator.Player.Projectile; -using ServiceLocator.Main; +using ServiceLocator.Map; +using ServiceLocator.UI; +using ServiceLocator.Sound; namespace ServiceLocator.Player { public class PlayerService { + // Dependencies: + private MapService mapService; + private UIService uiService; + private SoundService soundService; private PlayerScriptableObject playerScriptableObject; private ProjectilePool projectilePool; @@ -16,11 +22,17 @@ public class PlayerService private int money; public int Money => money; - public PlayerService(PlayerScriptableObject playerScriptableObject, Transform projectileContainer) { this.playerScriptableObject = playerScriptableObject; - projectilePool = new ProjectilePool(playerScriptableObject.ProjectilePrefab, playerScriptableObject.ProjectileScriptableObjects, projectileContainer); + projectilePool = new ProjectilePool(this, playerScriptableObject.ProjectilePrefab, playerScriptableObject.ProjectileScriptableObjects, projectileContainer); + } + + public void Init(MapService mapService, UIService uiService, SoundService soundService) + { + this.mapService = mapService; + this.uiService = uiService; + this.soundService = soundService; InitializeVariables(); } @@ -28,8 +40,8 @@ private void InitializeVariables() { health = playerScriptableObject.Health; money = playerScriptableObject.Money; - GameService.Instance.UIService.UpdateHealthUI(health); - GameService.Instance.UIService.UpdateMoneyUI(money); + uiService.UpdateHealthUI(health); + uiService.UpdateMoneyUI(money); activeMonkeys = new List(); } @@ -72,22 +84,22 @@ public void TrySpawningMonkey(MonkeyType monkeyType, int monkeyCost, Vector3 dro if (monkeyCost > money) return; - if (GameService.Instance.MapService.TryGetMonkeySpawnPosition(dropPosition, out Vector3 spawnPosition)) + if (mapService.TryGetMonkeySpawnPosition(dropPosition, out Vector3 spawnPosition)) { SpawnMonkey(monkeyType, spawnPosition); - GameService.Instance.SoundService.PlaySoundEffects(Sound.SoundType.SpawnMonkey); + soundService.PlaySoundEffects(Sound.SoundType.SpawnMonkey); } } public void SpawnMonkey(MonkeyType monkeyType, Vector3 spawnPosition) { MonkeyScriptableObject monkeySO = playerScriptableObject.MonkeyScriptableObjects.Find(so => so.Type == monkeyType); - MonkeyController monkey = new MonkeyController(monkeySO, projectilePool); + MonkeyController monkey = new MonkeyController(monkeySO, projectilePool, soundService); monkey.SetPosition(spawnPosition); activeMonkeys.Add(monkey); money -= monkeySO.Cost; - GameService.Instance.UIService.UpdateMoneyUI(money); + uiService.UpdateMoneyUI(money); } public void ReturnProjectileToPool(ProjectileController projectileToReturn) => projectilePool.ReturnItem(projectileToReturn); @@ -95,7 +107,7 @@ public void SpawnMonkey(MonkeyType monkeyType, Vector3 spawnPosition) public void TakeDamage(int damageToTake) { health = health - damageToTake <= 0 ? 0 : health - damageToTake; - GameService.Instance.UIService.UpdateHealthUI(health); + uiService.UpdateHealthUI(health); if(health <= 0) { PlayerDeath(); @@ -105,9 +117,9 @@ public void TakeDamage(int damageToTake) public void GetReward(int reward) { money += reward; - GameService.Instance.UIService.UpdateMoneyUI(money); + uiService?.UpdateMoneyUI(money); } - private void PlayerDeath() => GameService.Instance.UIService.UpdateGameEndUI(false); + private void PlayerDeath() => uiService.UpdateGameEndUI(false); } } \ No newline at end of file diff --git a/Assets/Scripts/Player/Projectile/ProjectileController.cs b/Assets/Scripts/Player/Projectile/ProjectileController.cs index c1f57a93..f8407cb8 100644 --- a/Assets/Scripts/Player/Projectile/ProjectileController.cs +++ b/Assets/Scripts/Player/Projectile/ProjectileController.cs @@ -6,13 +6,15 @@ namespace ServiceLocator.Player.Projectile { public class ProjectileController { + private PlayerService playerService; private ProjectileView projectileView; private ProjectileScriptableObject projectileScriptableObject; private BloonController target; - public ProjectileController(ProjectileView projectilePrefab, Transform projectileContainer) + public ProjectileController(PlayerService playerService, ProjectileView projectilePrefab, Transform projectileContainer) { + this.playerService = playerService; projectileView = Object.Instantiate(projectilePrefab, projectileContainer); projectileView.SetController(this); } @@ -55,7 +57,7 @@ public void OnHitBloon(BloonController bloonHit) public void ResetProjectile() { projectileView.gameObject.SetActive(false); - GameService.Instance.PlayerService.ReturnProjectileToPool(this); + playerService.ReturnProjectileToPool(this); } } } \ No newline at end of file diff --git a/Assets/Scripts/Player/Projectile/ProjectilePool.cs b/Assets/Scripts/Player/Projectile/ProjectilePool.cs index 0bc313d0..e154e4d2 100644 --- a/Assets/Scripts/Player/Projectile/ProjectilePool.cs +++ b/Assets/Scripts/Player/Projectile/ProjectilePool.cs @@ -12,12 +12,14 @@ namespace ServiceLocator.Player.Projectile { public class ProjectilePool : GenericObjectPool { + private PlayerService playerService; private ProjectileView projectilePrefab; private List projectileScriptableObjects; private Transform projectileContainer; - public ProjectilePool(ProjectileView projectilePrefab, List projectileScriptableObjects, Transform projectileContainer) + public ProjectilePool(PlayerService playerService, ProjectileView projectilePrefab, List projectileScriptableObjects, Transform projectileContainer) { + this.playerService = playerService; this.projectilePrefab = projectilePrefab; this.projectileScriptableObjects = projectileScriptableObjects; this.projectileContainer = projectileContainer; @@ -31,6 +33,6 @@ public ProjectileController GetProjectile(ProjectileType projectileType) return projectile; } - protected override ProjectileController CreateItem() => new ProjectileController(projectilePrefab, projectileContainer); + protected override ProjectileController CreateItem() => new ProjectileController(playerService, projectilePrefab, projectileContainer); } } \ No newline at end of file diff --git a/Assets/Scripts/Sound/SoundService.cs b/Assets/Scripts/Sound/SoundService.cs index a0c48107..b4af8bc8 100644 --- a/Assets/Scripts/Sound/SoundService.cs +++ b/Assets/Scripts/Sound/SoundService.cs @@ -39,8 +39,6 @@ private void PlaybackgroundMusic(SoundType soundType, bool loopSound = false) backgroundMusic.clip = clip; backgroundMusic.Play(); } - else - Debug.LogError("No Audio Clip selected."); } private AudioClip GetSoundClip(SoundType soundType) diff --git a/Assets/Scripts/UI/MapButton.cs b/Assets/Scripts/UI/MapButton.cs index e544a3f9..94c65a70 100644 --- a/Assets/Scripts/UI/MapButton.cs +++ b/Assets/Scripts/UI/MapButton.cs @@ -1,15 +1,20 @@ using UnityEngine; using UnityEngine.UI; -using ServiceLocator.Main; +using ServiceLocator.Events; namespace ServiceLocator.UI { public class MapButton : MonoBehaviour { [SerializeField] private int MapId; + private EventService eventService; - private void Start() => GetComponent