Files
MobileShooter/Assets/Darkmatter/Code/Domain/Factory/EnemyFactory.cs
2025-12-31 22:09:12 +05:45

71 lines
2.5 KiB
C#

using Darkmatter.Core;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using VContainer;
namespace Darkmatter.Domain
{
public class EnemyFactory : IEnemyFactory
{
private readonly List<Transform> patrolPoints;
private readonly Transform playerTransform;
private readonly GameObject fatZombiePrefab;
private readonly GameObject slimZombiePrefab;
private readonly IObjectResolver objectResolver;
private readonly EnemyConfigSO enemyConfig;
public EnemyFactory(Transform playerTransform, List<Transform> 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)
{
GameObject enemyObj = null;
switch (type)
{
case ZombieType.Fat:
enemyObj = GameObject.Instantiate(fatZombiePrefab, GetSpawnPos(), Quaternion.identity);
break;
case ZombieType.slim:
enemyObj = GameObject.Instantiate(slimZombiePrefab, GetSpawnPos(), Quaternion.identity);
break;
default:
break;
}
objectResolver.Inject(enemyObj);
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)));
return enemyPawn;
}
private Vector3 GetSpawnPos()
{
return patrolPoints[Random.Range(0, patrolPoints.Count)].position;
}
private List<Transform> GetRandomPatrolPoints(int count)
{
return patrolPoints.OrderBy(x=>Random.value).Take(count).ToList();
}
}
}