added enemy factory and pool

This commit is contained in:
Mausham
2025-12-31 22:09:12 +05:45
parent 3470ca4dc6
commit d258428496
10 changed files with 94 additions and 31 deletions

View File

@@ -39,28 +39,28 @@ namespace Darkmatter.App
builder.RegisterComponent<IInputReader>(inputReader); builder.RegisterComponent<IInputReader>(inputReader);
builder.RegisterComponent<IPlayerPawn>(playerMotor); builder.RegisterComponent<IPlayerPawn>(playerMotor);
builder.RegisterComponent<ITargetProvider>(TargetProvider); builder.RegisterComponent<ITargetProvider>(TargetProvider);
builder.RegisterComponent(playerConfig); builder.RegisterComponent(playerConfig);
builder.RegisterComponent(cameraConfig); builder.RegisterComponent(cameraConfig);
builder.RegisterComponent(enemyConfig); builder.RegisterComponent(enemyConfig);
builder.RegisterComponent<ICameraService>(camService); builder.RegisterComponent<ICameraService>(camService);
builder.RegisterComponent<IReloadableWeapon>(gunWeapon); builder.RegisterComponent<IReloadableWeapon>(gunWeapon);
builder.RegisterComponent(spawnner); builder.RegisterComponent(spawnner);
//builder.RegisterComponentInHierarchy<IEnemyAnimController>();
//builder.RegisterComponentInHierarchy<IEnemyPawn>();
builder.Register<PlayerStateMachine>(Lifetime.Scoped); builder.Register<PlayerStateMachine>(Lifetime.Scoped);
builder.Register<EnemyStateMachine>(Lifetime.Scoped); builder.Register<EnemyStateMachine>(Lifetime.Scoped);
builder.Register<IEnemyFactory>(container => builder.Register<IEnemyFactory>(c =>
new EnemyFactory( new EnemyFactory(
playerTransform, playerTransform,
patrolPoints, patrolPoints,
fatZombie, fatZombie,
SlimZombie, SlimZombie,
resolver), c.Resolve<IObjectResolver>(),
Lifetime.Scoped); enemyConfig), // <-- inject resolver properly
Lifetime.Scoped);

View File

@@ -7,6 +7,8 @@ namespace Darkmatter.Core
{ {
public interface IEnemyPawn : IDamageable public interface IEnemyPawn : IDamageable
{ {
GameObject GameObject { get; }
void InitializeFromFactory(Transform player,List<Transform> patrolPoints); void InitializeFromFactory(Transform player,List<Transform> patrolPoints);
bool isDead { get; } bool isDead { get; }
NavMeshAgent EnemyAI { get; } NavMeshAgent EnemyAI { get; }

View File

@@ -5,6 +5,7 @@ namespace Darkmatter.Core
{ {
public interface IDamageable public interface IDamageable
{ {
event Action<float> OnHealthDecreased; event Action<float> OnHealthDecreased;
float Health { get; set; } float Health { get; set; }
void TakeDamage(float damage); void TakeDamage(float damage);

View File

@@ -6,7 +6,12 @@ namespace Darkmatter.Domain
{ {
public class EnemyController : MonoBehaviour public class EnemyController : MonoBehaviour
{ {
[Inject] EnemyStateMachine esm; EnemyStateMachine esm;
public void Initialize(EnemyStateMachine esm)
{
this.esm = esm;
}
public void Start() public void Start()
{ {

View File

@@ -7,9 +7,16 @@ namespace Darkmatter.Domain
{ {
public class EnemyStateMachine:StateMachine public class EnemyStateMachine:StateMachine
{ {
[Inject] public readonly IEnemyPawn enemyPawn; public readonly IEnemyPawn enemyPawn;
[Inject] public readonly IEnemyAnimController enemyAnimController; public readonly IEnemyAnimController enemyAnimController;
[Inject] public readonly EnemyConfigSO enemyConfig; public readonly EnemyConfigSO enemyConfig;
public EnemyStateMachine(IEnemyPawn pawn, IEnemyAnimController animController,EnemyConfigSO enemyConfig)
{
enemyPawn = pawn;
enemyAnimController = animController;
this.enemyConfig = enemyConfig;
}
public void SetSpeed(float speed) public void SetSpeed(float speed)
{ {

View File

@@ -13,13 +13,15 @@ namespace Darkmatter.Domain
private readonly GameObject fatZombiePrefab; private readonly GameObject fatZombiePrefab;
private readonly GameObject slimZombiePrefab; private readonly GameObject slimZombiePrefab;
private readonly IObjectResolver objectResolver; private readonly IObjectResolver objectResolver;
public EnemyFactory(Transform playerTransform, List<Transform> patrolPoints, GameObject fatZombiePrefab, GameObject slimZombiePrefab, IObjectResolver resolver) private readonly EnemyConfigSO enemyConfig;
public EnemyFactory(Transform playerTransform, List<Transform> patrolPoints, GameObject fatZombiePrefab, GameObject slimZombiePrefab, IObjectResolver resolver , EnemyConfigSO enemyConfig)
{ {
this.playerTransform = playerTransform; this.playerTransform = playerTransform;
this.patrolPoints = patrolPoints; this.patrolPoints = patrolPoints;
this.fatZombiePrefab = fatZombiePrefab; this.fatZombiePrefab = fatZombiePrefab;
this.slimZombiePrefab = slimZombiePrefab; this.slimZombiePrefab = slimZombiePrefab;
this.objectResolver = resolver; this.objectResolver = resolver;
this.enemyConfig = enemyConfig;
} }
public IEnemyPawn GetEnemy(ZombieType type) public IEnemyPawn GetEnemy(ZombieType type)
{ {
@@ -39,8 +41,18 @@ namespace Darkmatter.Domain
break; break;
} }
objectResolver.Inject(enemyObj); objectResolver.Inject(enemyObj);
IEnemyPawn enemyPawn = enemyObj.GetComponent<IEnemyPawn>(); IEnemyPawn enemyPawn = enemyObj.GetComponent<IEnemyPawn>();
IEnemyAnimController animController = enemyObj.GetComponent<IEnemyAnimController>();
EnemyStateMachine esm = new EnemyStateMachine(enemyPawn, animController,enemyConfig);
EnemyController controller = enemyObj.GetComponent<EnemyController>();
controller.Initialize(esm);
enemyPawn.InitializeFromFactory(playerTransform, GetRandomPatrolPoints(Random.Range(4, patrolPoints.Count))); enemyPawn.InitializeFromFactory(playerTransform, GetRandomPatrolPoints(Random.Range(4, patrolPoints.Count)));
return enemyPawn; return enemyPawn;
} }

View File

@@ -1,5 +1,6 @@
using Darkmatter.Core; using Darkmatter.Core;
using UnityEngine; using UnityEngine;
using UnityEngine.Pool;
using VContainer; using VContainer;
namespace Darkmatter.Presentation namespace Darkmatter.Presentation
@@ -7,14 +8,54 @@ namespace Darkmatter.Presentation
public class EnemiesSpawnner : MonoBehaviour public class EnemiesSpawnner : MonoBehaviour
{ {
[Inject] IEnemyFactory _enemyFactory; [Inject] IEnemyFactory _enemyFactory;
public int enemiesCount = 2; public int enemiesPerWave = 5;
private ObjectPool<IEnemyPawn> _enemyPool;
private void OnEnable()
{
EnemyMotor.OnEnemyDead += ReturnEnemy;
}
private void OnDisable()
{
EnemyMotor.OnEnemyDead -= ReturnEnemy;
}
private void Awake()
{
_enemyPool = new ObjectPool<IEnemyPawn>(
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() 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);
}
} }
} }

View File

@@ -9,8 +9,9 @@ namespace Darkmatter.Presentation
{ {
public class EnemyMotor : MonoBehaviour, IEnemyPawn public class EnemyMotor : MonoBehaviour, IEnemyPawn
{ {
public static event Action<IEnemyPawn> OnEnemyDead;
public GameObject GameObject => this.gameObject;
[SerializeField] private NavMeshAgent enemyAI; [SerializeField] private NavMeshAgent enemyAI;
[Inject] private EnemyConfigSO enemyConfig;
public Transform PlayerTarget { get; private set; } public Transform PlayerTarget { get; private set; }
public NavMeshAgent EnemyAI => enemyAI; public NavMeshAgent EnemyAI => enemyAI;
@@ -24,6 +25,7 @@ namespace Darkmatter.Presentation
public void Die() public void Die()
{ {
if(isDead) return;
isDead = true; isDead = true;
enemyAI.enabled = false; enemyAI.enabled = false;
Invoke(nameof(Hide), 8f); Invoke(nameof(Hide), 8f);
@@ -31,7 +33,7 @@ namespace Darkmatter.Presentation
private void Hide() private void Hide()
{ {
this.gameObject.SetActive(false); OnEnemyDead?.Invoke(this);
} }
public Vector3 ReturnMyPos() public Vector3 ReturnMyPos()
@@ -51,14 +53,6 @@ namespace Darkmatter.Presentation
OnHealthDecreased?.Invoke(Health); 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<Transform> patrolPoints) public void InitializeFromFactory(Transform player, List<Transform> patrolPoints)
{ {
this.PlayerTarget = player; this.PlayerTarget = player;

View File

@@ -10,6 +10,7 @@ namespace Darkmatter.Presentation
{ {
public class PlayerMotor : MonoBehaviour, IPlayerPawn public class PlayerMotor : MonoBehaviour, IPlayerPawn
{ {
[Header("LookSetting")] [Header("LookSetting")]
public Transform cinemachineFollowTarget; public Transform cinemachineFollowTarget;

View File

@@ -340,7 +340,7 @@ Transform:
m_GameObject: {fileID: 330585543} m_GameObject: {fileID: 330585543}
serializedVersion: 2 serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 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_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
@@ -16007,7 +16007,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: a025e89a66ec0f147a00c91dcb63c22f, type: 3} m_Script: {fileID: 11500000, guid: a025e89a66ec0f147a00c91dcb63c22f, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: PresentationAssembly::Darkmatter.Presentation.EnemiesSpawnner m_EditorClassIdentifier: PresentationAssembly::Darkmatter.Presentation.EnemiesSpawnner
enemiesCount: 2 enemiesPerWave: 6
--- !u!1 &1188606426 --- !u!1 &1188606426
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0