You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/Scripts/AI/FSM_Template/States/Flee.cs

65 lines
1.9 KiB
C#

3 months ago
using UnityEngine;
using UnityEngine.AI;
public class Flee : AIState
{
private readonly Gatherer _gatherer;
private NavMeshAgent _navMeshAgent;
private readonly EnemyDetector _enemyDetector;
private Animator _animator;
private readonly ParticleSystem _particleSystem;
private static readonly int FleeHash = Animator.StringToHash("Flee");
private float _initialSpeed;
private const float FLEE_SPEED = 6F;
private const float FLEE_DISTANCE = 5F;
public Flee(Gatherer gatherer, NavMeshAgent navMeshAgent, EnemyDetector enemyDetector, Animator animator, ParticleSystem particleSystem)
{
_gatherer = gatherer;
_navMeshAgent = navMeshAgent;
_enemyDetector = enemyDetector;
_animator = animator;
_particleSystem = particleSystem;
}
public override void OnEnter()
{
_navMeshAgent.enabled = true;
_gatherer.DropAllResources();
_animator.SetBool(FleeHash, true);
_initialSpeed = _navMeshAgent.speed;
_navMeshAgent.speed = FLEE_SPEED;
_particleSystem.Play();
}
public override void Tick()
{
if (_navMeshAgent.remainingDistance < 1f)
{
var away = GetRandomPoint();
_navMeshAgent.SetDestination(away);
}
}
private Vector3 GetRandomPoint()
{
var directionFromBeast = _gatherer.transform.position - _enemyDetector.GetNearestBeastPosition();
directionFromBeast.Normalize();
var endPoint = _gatherer.transform.position + (directionFromBeast * FLEE_DISTANCE);
if (NavMesh.SamplePosition(endPoint, out var hit, 10f, NavMesh.AllAreas))
{
return hit.position;
}
return _gatherer.transform.position;
}
public override void OnExit()
{
_navMeshAgent.speed = _initialSpeed;
_navMeshAgent.enabled = false;
_animator.SetBool(FleeHash, false);
}
}