71 lines
2.5 KiB
C#
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();
|
|
|
|
}
|
|
}
|
|
}
|