diff --git a/Assets/Darkmatter/Code/App/Installers/GameLifetimeScope.cs b/Assets/Darkmatter/Code/App/Installers/GameLifetimeScope.cs index faa249f..4cb3594 100644 --- a/Assets/Darkmatter/Code/App/Installers/GameLifetimeScope.cs +++ b/Assets/Darkmatter/Code/App/Installers/GameLifetimeScope.cs @@ -39,28 +39,28 @@ namespace Darkmatter.App builder.RegisterComponent(inputReader); builder.RegisterComponent(playerMotor); builder.RegisterComponent(TargetProvider); + builder.RegisterComponent(playerConfig); builder.RegisterComponent(cameraConfig); builder.RegisterComponent(enemyConfig); + builder.RegisterComponent(camService); builder.RegisterComponent(gunWeapon); builder.RegisterComponent(spawnner); - //builder.RegisterComponentInHierarchy(); - //builder.RegisterComponentInHierarchy(); - builder.Register(Lifetime.Scoped); builder.Register(Lifetime.Scoped); - builder.Register(container => - new EnemyFactory( - playerTransform, - patrolPoints, - fatZombie, - SlimZombie, - resolver), - Lifetime.Scoped); + builder.Register(c => + new EnemyFactory( + playerTransform, + patrolPoints, + fatZombie, + SlimZombie, + c.Resolve(), + enemyConfig), // <-- inject resolver properly + Lifetime.Scoped); diff --git a/Assets/Darkmatter/Code/Core/Contracts/Enemy/IEnemyPawn.cs b/Assets/Darkmatter/Code/Core/Contracts/Enemy/IEnemyPawn.cs index c6209de..026fcf6 100644 --- a/Assets/Darkmatter/Code/Core/Contracts/Enemy/IEnemyPawn.cs +++ b/Assets/Darkmatter/Code/Core/Contracts/Enemy/IEnemyPawn.cs @@ -7,6 +7,8 @@ namespace Darkmatter.Core { public interface IEnemyPawn : IDamageable { + + GameObject GameObject { get; } void InitializeFromFactory(Transform player,List patrolPoints); bool isDead { get; } NavMeshAgent EnemyAI { get; } diff --git a/Assets/Darkmatter/Code/Core/Contracts/Others/IDamageable.cs b/Assets/Darkmatter/Code/Core/Contracts/Others/IDamageable.cs index ead9c6d..b70d707 100644 --- a/Assets/Darkmatter/Code/Core/Contracts/Others/IDamageable.cs +++ b/Assets/Darkmatter/Code/Core/Contracts/Others/IDamageable.cs @@ -5,6 +5,7 @@ namespace Darkmatter.Core { public interface IDamageable { + event Action OnHealthDecreased; float Health { get; set; } void TakeDamage(float damage); diff --git a/Assets/Darkmatter/Code/Domain/Enemy/EnemyController.cs b/Assets/Darkmatter/Code/Domain/Enemy/EnemyController.cs index c8c5fa9..5bb0741 100644 --- a/Assets/Darkmatter/Code/Domain/Enemy/EnemyController.cs +++ b/Assets/Darkmatter/Code/Domain/Enemy/EnemyController.cs @@ -6,7 +6,12 @@ namespace Darkmatter.Domain { public class EnemyController : MonoBehaviour { - [Inject] EnemyStateMachine esm; + EnemyStateMachine esm; + + public void Initialize(EnemyStateMachine esm) + { + this.esm = esm; + } public void Start() { diff --git a/Assets/Darkmatter/Code/Domain/Enemy/EnemyStateMachine.cs b/Assets/Darkmatter/Code/Domain/Enemy/EnemyStateMachine.cs index ffaf218..e58c856 100644 --- a/Assets/Darkmatter/Code/Domain/Enemy/EnemyStateMachine.cs +++ b/Assets/Darkmatter/Code/Domain/Enemy/EnemyStateMachine.cs @@ -7,9 +7,16 @@ namespace Darkmatter.Domain { public class EnemyStateMachine:StateMachine { - [Inject] public readonly IEnemyPawn enemyPawn; - [Inject] public readonly IEnemyAnimController enemyAnimController; - [Inject] public readonly EnemyConfigSO enemyConfig; + public readonly IEnemyPawn enemyPawn; + public readonly IEnemyAnimController enemyAnimController; + public readonly EnemyConfigSO enemyConfig; + + public EnemyStateMachine(IEnemyPawn pawn, IEnemyAnimController animController,EnemyConfigSO enemyConfig) + { + enemyPawn = pawn; + enemyAnimController = animController; + this.enemyConfig = enemyConfig; + } public void SetSpeed(float speed) { diff --git a/Assets/Darkmatter/Code/Domain/Factory/EnemyFactory.cs b/Assets/Darkmatter/Code/Domain/Factory/EnemyFactory.cs index aea1c89..1cd80e8 100644 --- a/Assets/Darkmatter/Code/Domain/Factory/EnemyFactory.cs +++ b/Assets/Darkmatter/Code/Domain/Factory/EnemyFactory.cs @@ -13,13 +13,15 @@ namespace Darkmatter.Domain private readonly GameObject fatZombiePrefab; private readonly GameObject slimZombiePrefab; private readonly IObjectResolver objectResolver; - public EnemyFactory(Transform playerTransform, List patrolPoints, GameObject fatZombiePrefab, GameObject slimZombiePrefab, IObjectResolver resolver) + private readonly EnemyConfigSO enemyConfig; + public EnemyFactory(Transform playerTransform, List patrolPoints, GameObject fatZombiePrefab, GameObject slimZombiePrefab, IObjectResolver resolver , EnemyConfigSO enemyConfig) { this.playerTransform = playerTransform; this.patrolPoints = patrolPoints; this.fatZombiePrefab = fatZombiePrefab; this.slimZombiePrefab = slimZombiePrefab; this.objectResolver = resolver; + this.enemyConfig = enemyConfig; } public IEnemyPawn GetEnemy(ZombieType type) { @@ -39,8 +41,18 @@ namespace Darkmatter.Domain break; } objectResolver.Inject(enemyObj); + IEnemyPawn enemyPawn = enemyObj.GetComponent(); + IEnemyAnimController animController = enemyObj.GetComponent(); + + EnemyStateMachine esm = new EnemyStateMachine(enemyPawn, animController,enemyConfig); + + EnemyController controller = enemyObj.GetComponent(); + controller.Initialize(esm); + enemyPawn.InitializeFromFactory(playerTransform, GetRandomPatrolPoints(Random.Range(4, patrolPoints.Count))); + + return enemyPawn; } diff --git a/Assets/Darkmatter/Code/Presentation/Enemies/EnemiesSpawnner.cs b/Assets/Darkmatter/Code/Presentation/Enemies/EnemiesSpawnner.cs index 58a3dca..0527b4c 100644 --- a/Assets/Darkmatter/Code/Presentation/Enemies/EnemiesSpawnner.cs +++ b/Assets/Darkmatter/Code/Presentation/Enemies/EnemiesSpawnner.cs @@ -1,5 +1,6 @@ using Darkmatter.Core; using UnityEngine; +using UnityEngine.Pool; using VContainer; namespace Darkmatter.Presentation @@ -7,14 +8,54 @@ namespace Darkmatter.Presentation public class EnemiesSpawnner : MonoBehaviour { [Inject] IEnemyFactory _enemyFactory; - public int enemiesCount = 2; + public int enemiesPerWave = 5; + private ObjectPool _enemyPool; + + + private void OnEnable() + { + EnemyMotor.OnEnemyDead += ReturnEnemy; + } + + private void OnDisable() + { + EnemyMotor.OnEnemyDead -= ReturnEnemy; + } + private void Awake() + { + _enemyPool = new ObjectPool( + createFunc: () => _enemyFactory.GetEnemy(GetRandomType()), + actionOnGet: enemy => enemy.GameObject.SetActive(true), + actionOnRelease: enemy => enemy.GameObject.SetActive(false), + actionOnDestroy: enemy => Destroy(enemy.GameObject), + collectionCheck: true, + defaultCapacity: 10, + maxSize: 50 + ); + } + + private ZombieType GetRandomType() + { + return Random.value > 0.5f ? ZombieType.Fat : ZombieType.slim; + } private void Start() { - for (int i = 0;i< enemiesCount;i++) + SpawnWave(); + } + + private void SpawnWave() + { + for (int i = 0; i < enemiesPerWave; i++) { - _enemyFactory.GetEnemy(ZombieType.Fat); + IEnemyPawn enemy = _enemyPool.Get(); + enemy.GameObject.transform.position = enemy.PatrolPoints[Random.Range(0, enemy.PatrolPoints.Count)].position; } } + + public void ReturnEnemy(IEnemyPawn enemy) + { + _enemyPool.Release(enemy); + } } } diff --git a/Assets/Darkmatter/Code/Presentation/Enemies/EnemyMotor.cs b/Assets/Darkmatter/Code/Presentation/Enemies/EnemyMotor.cs index a0b8157..2ab5978 100644 --- a/Assets/Darkmatter/Code/Presentation/Enemies/EnemyMotor.cs +++ b/Assets/Darkmatter/Code/Presentation/Enemies/EnemyMotor.cs @@ -9,8 +9,9 @@ namespace Darkmatter.Presentation { public class EnemyMotor : MonoBehaviour, IEnemyPawn { + public static event Action OnEnemyDead; + public GameObject GameObject => this.gameObject; [SerializeField] private NavMeshAgent enemyAI; - [Inject] private EnemyConfigSO enemyConfig; public Transform PlayerTarget { get; private set; } public NavMeshAgent EnemyAI => enemyAI; @@ -24,6 +25,7 @@ namespace Darkmatter.Presentation public void Die() { + if(isDead) return; isDead = true; enemyAI.enabled = false; Invoke(nameof(Hide), 8f); @@ -31,7 +33,7 @@ namespace Darkmatter.Presentation private void Hide() { - this.gameObject.SetActive(false); + OnEnemyDead?.Invoke(this); } public Vector3 ReturnMyPos() @@ -51,14 +53,6 @@ namespace Darkmatter.Presentation OnHealthDecreased?.Invoke(Health); } - private void OnDrawGizmos() - { - Gizmos.color = Color.yellow; - Gizmos.DrawWireSphere(transform.position, enemyConfig.visionRange); - Gizmos.color = Color.red; - Gizmos.DrawWireSphere(transform.position, enemyConfig.attackRange); - } - public void InitializeFromFactory(Transform player, List patrolPoints) { this.PlayerTarget = player; diff --git a/Assets/Darkmatter/Code/Presentation/Player/PlayerMotor.cs b/Assets/Darkmatter/Code/Presentation/Player/PlayerMotor.cs index 7252a44..91f0334 100644 --- a/Assets/Darkmatter/Code/Presentation/Player/PlayerMotor.cs +++ b/Assets/Darkmatter/Code/Presentation/Player/PlayerMotor.cs @@ -10,6 +10,7 @@ namespace Darkmatter.Presentation { public class PlayerMotor : MonoBehaviour, IPlayerPawn { + [Header("LookSetting")] public Transform cinemachineFollowTarget; diff --git a/Assets/Scenes/GameScene.unity b/Assets/Scenes/GameScene.unity index d25ca83..43afa78 100644 --- a/Assets/Scenes/GameScene.unity +++ b/Assets/Scenes/GameScene.unity @@ -340,7 +340,7 @@ Transform: m_GameObject: {fileID: 330585543} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -25.7, y: 2.211, z: 15.139999} + m_LocalPosition: {x: -25.7, y: 2.211, z: 16.14} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -16007,7 +16007,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: a025e89a66ec0f147a00c91dcb63c22f, type: 3} m_Name: m_EditorClassIdentifier: PresentationAssembly::Darkmatter.Presentation.EnemiesSpawnner - enemiesCount: 2 + enemiesPerWave: 6 --- !u!1 &1188606426 GameObject: m_ObjectHideFlags: 0