added enemy factory and pool
This commit is contained in:
@@ -39,27 +39,27 @@ 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>(),
|
||||||
|
enemyConfig), // <-- inject resolver properly
|
||||||
Lifetime.Scoped);
|
Lifetime.Scoped);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
{
|
{
|
||||||
_enemyFactory.GetEnemy(ZombieType.Fat);
|
for (int i = 0; i < enemiesPerWave; i++)
|
||||||
}
|
{
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user