Initial commit
This commit is contained in:
58
Assets/Darkmatter/Code/Domain/Enemy/AttackState.cs
Normal file
58
Assets/Darkmatter/Code/Domain/Enemy/AttackState.cs
Normal file
@@ -0,0 +1,58 @@
|
||||
using Darkmatter.Core;
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Darkmatter.Domain
|
||||
{
|
||||
public class AttackState : State<EnemyStateMachine>
|
||||
{
|
||||
public AttackState(EnemyStateMachine runner) : base(runner) { }
|
||||
private IEnemyAnimController enemyAnimController => runner.enemyAnimController;
|
||||
private IEnemyPawn enemyPawn => runner.enemyPawn;
|
||||
|
||||
public override void Enter()
|
||||
{
|
||||
base.Enter();
|
||||
enemyAnimController.PlayAttackAnim(true);
|
||||
enemyPawn.OnHealthDecreased += HandleHealth;
|
||||
}
|
||||
|
||||
private void HandleHealth(float health)
|
||||
{
|
||||
if (health <= 0)
|
||||
{
|
||||
runner.Die();
|
||||
}
|
||||
}
|
||||
public override void Update()
|
||||
{
|
||||
if (enemyPawn.isDead) return;
|
||||
base.Update();
|
||||
HandleAttack();
|
||||
CheckForStateBreak();
|
||||
|
||||
}
|
||||
|
||||
private void CheckForStateBreak()
|
||||
{
|
||||
if(!runner.PlayerInAttackRange())
|
||||
{
|
||||
runner.ChangeState(new ChaseState(runner));
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleAttack()
|
||||
{
|
||||
Vector3 dir = (enemyPawn.PlayerTarget.position - enemyPawn.ReturnMyPos()).normalized;
|
||||
enemyPawn.GameObject.transform.rotation = Quaternion.LookRotation(dir);
|
||||
//rotate towards player and handle Attack here
|
||||
}
|
||||
|
||||
public override void Exit()
|
||||
{
|
||||
base.Exit();
|
||||
enemyAnimController.PlayAttackAnim(false);
|
||||
enemyPawn.OnHealthDecreased -= HandleHealth;
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Darkmatter/Code/Domain/Enemy/AttackState.cs.meta
Normal file
2
Assets/Darkmatter/Code/Domain/Enemy/AttackState.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ee568c0b6df08d34d9c9fb008040066e
|
||||
64
Assets/Darkmatter/Code/Domain/Enemy/ChaseState.cs
Normal file
64
Assets/Darkmatter/Code/Domain/Enemy/ChaseState.cs
Normal file
@@ -0,0 +1,64 @@
|
||||
using Darkmatter.Core;
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Darkmatter.Domain
|
||||
{
|
||||
public class ChaseState : State<EnemyStateMachine>
|
||||
{
|
||||
public ChaseState(EnemyStateMachine runner) : base(runner) { }
|
||||
private EnemyConfigSO enemyConfig => runner.enemyConfig;
|
||||
private IEnemyAnimController enemyAnimController => runner.enemyAnimController;
|
||||
private IEnemyPawn enemyPawn => runner.enemyPawn;
|
||||
|
||||
|
||||
public override void Enter()
|
||||
{
|
||||
base.Enter();
|
||||
runner.SetSpeed(enemyConfig.chaseSpeed);
|
||||
enemyAnimController.PlayeChaseAnim(true);
|
||||
enemyPawn.OnHealthDecreased += HandleHealth;
|
||||
runner.audioService.PlaySFXAt(AudioId.Zombie_Growl, enemyPawn.ReturnMyPos());
|
||||
}
|
||||
|
||||
private void HandleHealth(float health)
|
||||
{
|
||||
if (health <= 0)
|
||||
{
|
||||
runner.Die();
|
||||
}
|
||||
}
|
||||
public override void Update()
|
||||
{
|
||||
if (enemyPawn.isDead) return;
|
||||
base.Update();
|
||||
HandleChase();
|
||||
CheckForStateBreak();
|
||||
}
|
||||
|
||||
private void CheckForStateBreak()
|
||||
{
|
||||
if (!runner.PlayerInChasingRange())
|
||||
{
|
||||
runner.ChangeState(new PatrolState(runner));
|
||||
}
|
||||
else if(runner.PlayerInAttackRange())
|
||||
{
|
||||
runner.ChangeState(new AttackState(runner));
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleChase()
|
||||
{
|
||||
enemyPawn.SetDestination(enemyPawn.PlayerTarget.position);
|
||||
}
|
||||
|
||||
public override void Exit()
|
||||
{
|
||||
base.Exit();
|
||||
enemyAnimController.PlayeChaseAnim(false);
|
||||
enemyPawn.OnHealthDecreased -= HandleHealth;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Darkmatter/Code/Domain/Enemy/ChaseState.cs.meta
Normal file
2
Assets/Darkmatter/Code/Domain/Enemy/ChaseState.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3a599db206b4b2a4b91b0af8749183e7
|
||||
32
Assets/Darkmatter/Code/Domain/Enemy/EnemyController.cs
Normal file
32
Assets/Darkmatter/Code/Domain/Enemy/EnemyController.cs
Normal file
@@ -0,0 +1,32 @@
|
||||
using Darkmatter.Core;
|
||||
using UnityEngine;
|
||||
using VContainer;
|
||||
using VContainer.Unity;
|
||||
|
||||
namespace Darkmatter.Domain
|
||||
{
|
||||
public class EnemyController : MonoBehaviour
|
||||
{
|
||||
EnemyStateMachine esm;
|
||||
IEnemyAnimController animController;
|
||||
IEnemyPawn enemy;
|
||||
[SerializeField] public EnemyConfigSO enemyConfig;
|
||||
[Inject] IAudioService audioService;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
animController = this.GetComponent<IEnemyAnimController>();
|
||||
enemy = this.GetComponent<IEnemyPawn>();
|
||||
}
|
||||
public void Start()
|
||||
{
|
||||
esm = new EnemyStateMachine(enemy,animController,audioService, enemyConfig);
|
||||
esm.ChangeState(new PatrolState(esm));
|
||||
}
|
||||
|
||||
public void Update()
|
||||
{
|
||||
esm.Update();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2fbe43d3f58deb3489ba1565abc2b050
|
||||
55
Assets/Darkmatter/Code/Domain/Enemy/EnemyStateMachine.cs
Normal file
55
Assets/Darkmatter/Code/Domain/Enemy/EnemyStateMachine.cs
Normal file
@@ -0,0 +1,55 @@
|
||||
using Darkmatter.Core;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using VContainer;
|
||||
|
||||
namespace Darkmatter.Domain
|
||||
{
|
||||
public class EnemyStateMachine:StateMachine
|
||||
{
|
||||
public readonly IEnemyPawn enemyPawn;
|
||||
public readonly IEnemyAnimController enemyAnimController;
|
||||
public readonly EnemyConfigSO enemyConfig;
|
||||
public readonly IAudioService audioService;
|
||||
|
||||
public EnemyStateMachine(IEnemyPawn pawn, IEnemyAnimController animController, IAudioService audioService, EnemyConfigSO enemyConfig)
|
||||
{
|
||||
enemyPawn = pawn;
|
||||
enemyAnimController = animController;
|
||||
this.audioService = audioService;
|
||||
this.enemyConfig = enemyConfig;
|
||||
}
|
||||
|
||||
public void SetSpeed(float speed)
|
||||
{
|
||||
enemyPawn.EnemyAI.speed = speed;
|
||||
}
|
||||
|
||||
public bool PlayerInChasingRange()
|
||||
{
|
||||
if(Vector3.Distance(enemyPawn.PlayerTarget.position,enemyPawn.ReturnMyPos()) < enemyConfig.visionRange)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool PlayerInAttackRange()
|
||||
{
|
||||
if(Vector3.Distance(enemyPawn.PlayerTarget.position,enemyPawn.ReturnMyPos())<enemyConfig.attackRange)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void Die()
|
||||
{
|
||||
if (enemyPawn.isDead) return;
|
||||
enemyAnimController.PlayDeadAnim();
|
||||
audioService.PlaySFXAt(AudioId.Zombie_Death,enemyPawn.ReturnMyPos());
|
||||
enemyPawn.Die();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c90488ca687a5724bbff14600be305d6
|
||||
72
Assets/Darkmatter/Code/Domain/Enemy/PatrolState.cs
Normal file
72
Assets/Darkmatter/Code/Domain/Enemy/PatrolState.cs
Normal file
@@ -0,0 +1,72 @@
|
||||
using Codice.Client.Common;
|
||||
using Darkmatter.Core;
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Darkmatter.Domain
|
||||
{
|
||||
public class PatrolState : State<EnemyStateMachine>
|
||||
{
|
||||
public PatrolState(EnemyStateMachine runner) : base(runner) { }
|
||||
private EnemyConfigSO enemyConfig => runner.enemyConfig;
|
||||
private IEnemyAnimController enemyAnimController => runner.enemyAnimController;
|
||||
private IEnemyPawn enemyPawn => runner.enemyPawn;
|
||||
private int currentPatrolPointIndex = 0;
|
||||
|
||||
|
||||
public override void Enter()
|
||||
{
|
||||
base.Enter();
|
||||
Debug.Log("Entered Patrol State");
|
||||
enemyPawn.OnHealthDecreased += HandleHealth;
|
||||
runner.SetSpeed(enemyConfig.walkSpeed);
|
||||
enemyAnimController.PlayWalkAnim(true);
|
||||
}
|
||||
|
||||
private void HandleHealth(float health)
|
||||
{
|
||||
if(health<=0)
|
||||
{
|
||||
runner.Die();
|
||||
}
|
||||
}
|
||||
|
||||
public override void Update()
|
||||
{
|
||||
if (enemyPawn.isDead) return;
|
||||
base.Update();
|
||||
HandlePatrol();
|
||||
CheckForStateBreak();
|
||||
}
|
||||
|
||||
private void CheckForStateBreak()
|
||||
{
|
||||
if(runner.PlayerInChasingRange())
|
||||
{
|
||||
runner.ChangeState(new ChaseState(runner));
|
||||
}
|
||||
}
|
||||
|
||||
private void HandlePatrol()
|
||||
{
|
||||
if (enemyPawn.PatrolPoints.Count == 0) return;
|
||||
Transform target = enemyPawn.PatrolPoints[currentPatrolPointIndex];
|
||||
enemyPawn.SetDestination(target.position);
|
||||
|
||||
if(Vector3.Distance(target.position,enemyPawn.ReturnMyPos()) < 0.5f) //close enought to targetPatrolPoint
|
||||
{
|
||||
currentPatrolPointIndex = (currentPatrolPointIndex+1)%enemyPawn.PatrolPoints.Count;
|
||||
}
|
||||
}
|
||||
|
||||
public override void Exit()
|
||||
{
|
||||
base.Exit();
|
||||
enemyAnimController.PlayWalkAnim(false);
|
||||
enemyPawn.OnHealthDecreased -= HandleHealth;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
2
Assets/Darkmatter/Code/Domain/Enemy/PatrolState.cs.meta
Normal file
2
Assets/Darkmatter/Code/Domain/Enemy/PatrolState.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7c5d8a8739037414ea98cca25c34a1c9
|
||||
Reference in New Issue
Block a user