EscapeShooter/My project/Assets/Project Files/Game/Scripts/Enemy/Melee/MeleeStates.cs

85 lines
2.3 KiB
C#

using UnityEngine;
using Watermelon.SquadShooter;
namespace Watermelon.Enemy.Melee
{
public class MeleeFollowAttackState: StateBehavior<MeleeEnemyBehaviour>
{
public MeleeFollowAttackState(MeleeEnemyBehaviour melee): base(melee)
{
}
protected readonly int ANIMATOR_SPEED_HASH = Animator.StringToHash("Movement Speed");
private Vector3 cachedTargetPos;
private bool isSlowed = false;
private bool isAttacking = false;
public override void OnStart()
{
cachedTargetPos = Target.Target.position;
isSlowed = Target.IsWalking;
if (isSlowed)
{
Target.NavMeshAgent.speed = Target.Stats.PatrollingSpeed;
}
else
{
Target.NavMeshAgent.speed = Target.Stats.MoveSpeed;
}
Target.MoveToPoint(cachedTargetPos);
isAttacking = false;
}
public override void OnUpdate()
{
if (Vector3.Distance(Target.Target.position, cachedTargetPos) > 0.1f)
{
cachedTargetPos = Target.Target.position;
Target.MoveToPoint(cachedTargetPos);
}
if (isSlowed && !Target.IsWalking)
{
Target.NavMeshAgent.speed = Target.Stats.MoveSpeed;
}
else if (!isSlowed && Target.IsWalking)
{
Target.NavMeshAgent.speed = Target.Stats.PatrollingSpeed;
}
Target.Animator.SetFloat(ANIMATOR_SPEED_HASH, Target.NavMeshAgent.velocity.magnitude / Target.NavMeshAgent.speed * (isSlowed ? Target.Stats.PatrollingMutliplier : 1f));
if (Target.IsTargetInAttackRange && !isAttacking && !CharacterBehaviour.IsDead)
{
isAttacking = true;
Target.Attack();
Target.OnAttackFinished += OnAttackFinished;
}
}
private void OnAttackFinished()
{
Target.OnAttackFinished -= OnAttackFinished;
isAttacking = false;
}
public override void OnEnd()
{
Target.OnAttackFinished -= OnAttackFinished;
Target.StopMoving();
}
}
public enum State
{
Patrolling,
Attacking,
}
}