using System.Collections;
using UnityEngine;
using UnityEngine.Animations.Rigging;
public class PistolRaccoon : Enemy
{
[Header("Personal Scripts")]
[SerializeField] EnemyGun enemyGun;
[SerializeField] Rig shootingRig;
[SerializeField] GameObject playerFlankChosen;
[SerializeField] float shootingRigWeight;
[SerializeField] float aimSpeed;
[SerializeField] bool isShooting;
[SerializeField] bool isSitting;
[SerializeField] float shootEntryDistanceMin;
[SerializeField] float shootEntryDistanceMax;
[SerializeField] float shootEntryDistance;
[SerializeField] float shootExitDistance;
[SerializeField] LayerMask wallMask;
// Start is called once before the first execution of Update after the MonoBehaviour is created
protected override void Start()
{
base.Start();
rb.isKinematic = true;
enemyGun = GetComponent<EnemyGun>();
shootingRig.weight = 0f;
shootEntryDistance = Random.Range(shootEntryDistanceMin, shootEntryDistanceMax);
RandomizeSettings();
if (isSitting)
{
animator.SetBool("isSitting", true);
}
else
{
animator.SetBool("isSitting", false);
}
}
// Update is called once per frame
protected override void Update()
{
base.Update();
shootingRig.weight = Mathf.Lerp(shootingRig.weight, shootingRigWeight, Time.deltaTime * aimSpeed);
switch (enemyState)
{
case EnemyStates.Idle:
break;
case EnemyStates.Moving:
Move();
break;
case EnemyStates.Shooting:
if (HasLineOfSight())
{
Shoot();
}
else
{
SwitchState(EnemyStates.Moving);
}
break;
case EnemyStates.Dodging:
Dodge();
break;
case EnemyStates.Running:
isShooting = false;
RunAway();
break;
}
}
void Move()
{
if (!agent.enabled) agent.enabled = true;
isShooting = false;
StopAllCoroutines();
agent.isStopped = false;
Rotate();
float distance = Vector3.Distance(playerController.transform.position, transform.position);
animator.SetBool("isMoving", true);
if (distance > shootEntryDistance)
{
agent.SetDestination(playerFlankChosen.transform.position);
}
else
{
if (HasLineOfSight())
{
SwitchState(EnemyStates.Shooting);
}
else
{
RandomizeSettings(); // Pick another flank
agent.SetDestination(playerFlankChosen.transform.position);
}
}
}
public override void AlertEnemy()
{
base.AlertEnemy();
animator.SetBool("isSitting", false);
float distance = Vector3.Distance(playerController.transform.position, transform.position);
if (distance <= shootEntryDistance)
{
SwitchState(EnemyStates.Shooting);
}
else
{
SwitchState(EnemyStates.Moving);
}
}
void Shoot()
{
isRunningAway = false;
agent.isStopped = true;
float distance = Vector3.Distance(playerController.transform.position, transform.position);
animator.SetBool("isMoving", false);
Rotate();
if (distance > shootExitDistance)
{
shootingRigWeight = 0f;
SwitchState(EnemyStates.Moving);
return;
}
else if (distance < 10f)
{
shootingRigWeight = 0f;
SwitchState(EnemyStates.Running);
return;
}
if (shootingRigWeight < 1f) shootingRigWeight = 1f;
if (!isShooting)
{
StartCoroutine(ShootTimer());
}
}
bool HasLineOfSight()
{
RandomizeSettings();
Vector3 origin = transform.position + Vector3.up * 1.5f;
Vector3 direction = transform.forward;
if (Physics.Raycast(origin, direction, out RaycastHit hit, 100f, wallMask))
{
return false;
}
return true;
}
IEnumerator ShootTimer()
{
isShooting = true;
RandomizeSettings();
yield return new WaitForSeconds(enemyGun.fireRate);
enemyGun.Shoot();
isShooting = false;
}
void RandomizeSettings()
{
int randomFlank = Random.Range(0, playerFlanks.Count);
playerFlankChosen = playerFlanks[randomFlank];
shootEntryDistance = Random.Range(shootEntryDistanceMin, shootEntryDistanceMax);
}
}