// Function : EnemyIldeStateFunction
 // Method : This Function is Use for Update When Enemy is At The Ilde Statement
 void EnemyIldeStateFunction()
 {
     if (!IsDead)
     {
         if (!HasFoundPlayer)
         {
             _nav.stoppingDistance = 0.0f;
             _anim.SetFloat(WalkingSpeedFloatAnimator, 0f);
             WaitingCrtTimer -= Time.deltaTime;
             if (WaitingCrtTimer <= 0)
             {
                 _nav.SetDestination(_WayPoints[WayPointCount].position);
                 _EnemySoilderStatus = EnemySoilderStatus.Enemy_WalkingState;
             }
         }
         else
         {
             _EnemySoilderStatus = EnemySoilderStatus.Enemy_FoundPlayerState;
         }
     }
     else
     {
         _EnemySoilderStatus = EnemySoilderStatus.Enemy_DeadState;
     }
 }
 // Function :EnemyGetHurtStatement
 // Method : This Function is Mainly used For Update The Statement
 // When The AI Is At The  Get Hurt  Statement
 void EnemyGetHurtStatement()
 {
     if (!IsDead)
     {
         HasFoundPlayer      = true;
         _EnemySoilderStatus = EnemySoilderStatus.Enemy_FoundPlayerState;
     }
     else
     {
         _EnemySoilderStatus = EnemySoilderStatus.Enemy_DeadState;
     }
 }
 // Function : SettingBasicInformation
 // Method : This Function is Mainly used For Setting The Basic Statement
 void SettingBasicInformation()
 {
     IsDead = false;
     _Enemy2SoilderState = EnemySoilderStatus.Enemy_IldeState;
     CanAttack           = false;
     DoAttack            = false;
     HasBeenCountedBf    = false;
     CanAttackMaxTimer   = Random.Range(3f, 4.5f);
     CanAttackCrtTimer   = CanAttackMaxTimer;
     GetHurtMaxTimer     = Random.Range(0.6f, 1.4f);
     GetHurtCrtTimer     = GetHurtMaxTimer;
 }
    // Function : EnemyWalkingStateFunction
    // Method : This Function is Mainly used For Update The Statement
    // When The AI Is At The Walking Statement
    void EnemyWalkingStateFunction()
    {
        if (!IsDead)
        {
            if (!HasFoundPlayer)
            {
                _nav.stoppingDistance = 0.0f;

                if (_nav.remainingDistance >= 0.05f)
                {
                    if (_nav.remainingDistance >= 2f)
                    {
                        _nav.speed = 5f;
                        _anim.SetFloat(WalkingSpeedFloatAnimator, Mathf.Lerp(_anim.GetFloat(WalkingSpeedFloatAnimator), 1f, 0.5f));
                    }
                    else if (_nav.remainingDistance < 2f)
                    {
                        _nav.speed = 3f;
                        _anim.SetFloat(WalkingSpeedFloatAnimator, Mathf.Lerp(_anim.GetFloat(WalkingSpeedFloatAnimator), 0.5f, 0.5f));
                    }
                }
                else if (_nav.remainingDistance <= 0.05f)
                {
                    MaxCrtWaitingTimer  = Random.Range(2.5f, 4f);
                    WaitingCrtTimer     = MaxCrtWaitingTimer;
                    _EnemySoilderStatus = EnemySoilderStatus.Enemy_IldeState;
                    if (WayPointCount < _WayPoints.Length)
                    {
                        WayPointCount++;
                        if (WayPointCount >= _WayPoints.Length)
                        {
                            WayPointCount = 0;
                        }
                    }
                }
            }
            else
            {
                _EnemySoilderStatus = EnemySoilderStatus.Enemy_FoundPlayerState;
            }
        }
        else
        {
            _EnemySoilderStatus = EnemySoilderStatus.Enemy_DeadState;
        }
    }
    // Function : EnemyFoundPlayerState
    // Method : This Function is Mainly used For Update The Statement
    // When The AI Is At The  Found Player Statement
    void EnemyFoundPlayerState()
    {
        if (!IsDead)
        {
            if (HasFoundPlayer)
            {
                _nav.stoppingDistance = 1.65f;
                if (PlayerCtrl._INSTANCE != null)
                {
                    float WithPlayerDistance = Vector3.Distance(this.transform.position, PlayerCtrl._INSTANCE.transform.position);

                    _nav.SetDestination(PlayerCtrl._INSTANCE.transform.position);
                    //  _EnemySoilderStatus = EnemySoilderStatus.Enemy_WalkingState;
                    if (_nav.remainingDistance >= 1.65f)
                    {
                        if (_nav.remainingDistance >= 2f)
                        {
                            _nav.speed = 5f;
                            _anim.SetFloat(WalkingSpeedFloatAnimator, Mathf.Lerp(_anim.GetFloat(WalkingSpeedFloatAnimator), 1f, 0.5f));
                        }
                        else if (_nav.remainingDistance < 2f)
                        {
                            _nav.speed = 3f;
                            _anim.SetFloat(WalkingSpeedFloatAnimator, Mathf.Lerp(_anim.GetFloat(WalkingSpeedFloatAnimator), 0.5f, 0.5f));
                        }
                    }
                    else
                    {
                        _anim.SetFloat(WalkingSpeedFloatAnimator, 0f);
                        _EnemySoilderStatus = EnemySoilderStatus.Enemy_AttackPlayerState;;
                    }
                }
            }
            else
            {
                _EnemySoilderStatus = EnemySoilderStatus.Enemy_IldeState;
            }
        }
        else
        {
            _EnemySoilderStatus = EnemySoilderStatus.Enemy_DeadState;
        }
    }
    // Function : EnemyIldeState
    // Method : This Function is Use for Update When Enemy is At The Ilde Statement
    private void EnemyIldeState()
    {
        if (!IsDead)
        {
            if (PlayerCtrl._INSTANCE != null)
            {
                float WithPlayerDistance = Vector3.Distance(transform.position, PlayerCtrl._INSTANCE.transform.position);


                if (WithPlayerDistance <= 15)
                {
                    _Enemy2SoilderState = EnemySoilderStatus.Enemy_AttackPlayerState;
                }
            }
        }
        else
        {
            _Enemy2SoilderState = EnemySoilderStatus.Enemy_DeadState;
        }
    }
    // Function :GetHurtFunction
    // Method : This Function is Mainly used For Update The Statement
    // When The AI Is At The  Get Hurt  Statement
    void GetHurtFunction()
    {
        if (!IsDead)
        {
            GetHurtCrtTimer -= Time.deltaTime;

            if (GetHurtCrtTimer <= 0)
            {
                if (PlayerCtrl._INSTANCE != null)
                {
                    if (!PlayerCtrl._INSTANCE.IsDead)
                    {
                        float WithPlayerDistance = Vector3.Distance(transform.position, PlayerCtrl._INSTANCE.transform.position);

                        if (WithPlayerDistance <= 25f)
                        {
                            _Enemy2SoilderState = EnemySoilderStatus.Enemy_AttackPlayerState;
                            GetHurtMaxTimer     = Random.Range(0.8f, 1.6f);
                            GetHurtCrtTimer     = GetHurtMaxTimer;
                        }
                        else if (WithPlayerDistance >= 25f)
                        {
                            _Enemy2SoilderState = EnemySoilderStatus.Enemy_IldeState;
                            GetHurtMaxTimer     = Random.Range(0.8f, 1.6f);
                            GetHurtCrtTimer     = GetHurtMaxTimer;
                        }
                    }
                    else
                    {
                        _Enemy2SoilderState = EnemySoilderStatus.Enemy_IldeState;
                    }
                }
            }
        }
        else
        {
            _Enemy2SoilderState = EnemySoilderStatus.Enemy_DeadState;
        }
    }
    // Function : EnemyAttackPlayerState
    // Method : This Function is Mainly used For Update The Statement
    // When The AI Is At The  Attack Player Statement
    void EnemyAttackPlayerState()
    {
        if (!IsDead)
        {
            if (!PlayerCtrl._INSTANCE.IsDead)
            {
                if (HasFoundPlayer)
                {
                    if (_nav.remainingDistance >= 1.65f)
                    {
                        _EnemySoilderStatus = EnemySoilderStatus.Enemy_FoundPlayerState;
                    }
                    else if (_nav.remainingDistance <= 1.65f)
                    {
                        AttackCrtTimer -= Time.deltaTime;
                        if (AttackCrtTimer <= 0)
                        {
                            DoAttack = true;
                        }

                        if (DoAttack)
                        {
                            int Rand = Random.Range(0, 9);

                            if (Rand >= 0 && Rand <= 2)
                            {
                                _anim.SetTrigger(Attack1TriggerAnimator);
                                transform.LookAt(PlayerCtrl._INSTANCE.transform.position, Vector3.up);
                                transform.eulerAngles = new Vector3(0f, transform.eulerAngles.y, 0f);


                                DoAttack       = false;
                                MaxAttackTimer = Random.Range(1.25f, 2f);
                                AttackCrtTimer = MaxAttackTimer;
                            }
                            else if (Rand >= 3 && Rand <= 5)
                            {
                                _anim.SetTrigger(Attack2TriggerAnimator);
                                transform.LookAt(PlayerCtrl._INSTANCE.transform.position, Vector3.up);
                                transform.eulerAngles = new Vector3(0f, transform.eulerAngles.y, 0f);


                                DoAttack       = false;
                                MaxAttackTimer = Random.Range(1.25f, 2f);
                                AttackCrtTimer = MaxAttackTimer;
                            }
                            else if (Rand >= 6)
                            {
                                _anim.SetTrigger(Attack3TriggerAnimator);

                                transform.LookAt(PlayerCtrl._INSTANCE.transform.position, Vector3.up);
                                transform.eulerAngles = new Vector3(0f, transform.eulerAngles.y, 0f);

                                DoAttack       = false;
                                MaxAttackTimer = Random.Range(1.25f, 2f);
                                AttackCrtTimer = MaxAttackTimer;
                            }
                        }
                    }
                }
                else
                {
                    _EnemySoilderStatus = EnemySoilderStatus.Enemy_IldeState;
                }
            }
            else
            {
                HasFoundPlayer = false;
            }
        }
        else
        {
            _EnemySoilderStatus = EnemySoilderStatus.Enemy_DeadState;
        }
    }
    // Function : EnemyAttackPlayerState
    // Method : This Function is Mainly used For Update The Statement
    // When The AI Is At The  Attack Player Statement
    void EnemyAttackPlayerState()
    {
        if (!IsDead)
        {
            CanAttackCrtTimer -= Time.deltaTime;

            if (PlayerCtrl._INSTANCE != null)
            {
                if (!PlayerCtrl._INSTANCE.IsDead)
                {
                    float WithPlayerDistance = Vector3.Distance(transform.position, PlayerCtrl._INSTANCE.transform.position);
                    if (WithPlayerDistance <= 25f)
                    {
                        if (CanAttackCrtTimer <= 0)
                        {
                            CanAttack = true;
                        }

                        if (CanAttack)
                        {
                            int rand = Random.Range(0, 10);

                            if (rand >= 0 && rand <= 2)
                            {
                                CanAttackMaxTimer = Random.Range(4.5f, 6f);
                                CanAttackCrtTimer = CanAttackMaxTimer;
                                CanAttack         = false;
                                _anim.SetTrigger(Attack1TriggerAnimator);
                                transform.LookAt(PlayerCtrl._INSTANCE.transform.position, Vector3.up);
                                transform.eulerAngles = new Vector3(0f, transform.eulerAngles.y, 0f);
                                Debug.Log("Attack1 ");
                            }
                            else if (rand >= 3 && rand <= 5)
                            {
                                CanAttackMaxTimer = Random.Range(4.5f, 6f);
                                CanAttackCrtTimer = CanAttackMaxTimer;
                                CanAttack         = false;
                                _anim.SetTrigger(Attack2TriggerAnimator);
                                transform.LookAt(PlayerCtrl._INSTANCE.transform.position, Vector3.up);
                                transform.eulerAngles = new Vector3(0f, transform.eulerAngles.y, 0f);
                            }
                            else if (rand >= 6)
                            {
                                CanAttackMaxTimer = Random.Range(4.5f, 6f);
                                CanAttackCrtTimer = CanAttackMaxTimer;
                                CanAttack         = false;
                                _anim.SetTrigger(Attack3TriggerAnimator);
                                transform.LookAt(PlayerCtrl._INSTANCE.transform.position, Vector3.up);
                                transform.eulerAngles = new Vector3(0f, transform.eulerAngles.y, 0f);
                            }
                        }
                    }
                    else if (WithPlayerDistance > 25f)
                    {
                        _Enemy2SoilderState = EnemySoilderStatus.Enemy_IldeState;
                    }
                }
                else
                {
                    _Enemy2SoilderState = EnemySoilderStatus.Enemy_IldeState;
                }
            }
        }
        else
        {
            _Enemy2SoilderState = EnemySoilderStatus.Enemy_DeadState;
        }
    }