Загрузка данных


using UnityEngine;
using UnityEngine.AI;

public class MonsterAI : MonoBehaviour
{
    [Header("Настройки зрения")]
    public float viewDistance = 20f;  
    [Range(0, 180)] public float viewAngle = 90f;     
    public float looseDistance = 25f; 

    [Header("Настройки патрулирования")]
    public float patrolSpeed = 1.5f;   
    public float chaseSpeed = 5f;      
    public float patrolRadius = 30f;  

    private Transform playerTransform;
    private NavMeshAgent agent;
    private Animator animator;
    private bool isChasing = false;
    private Vector3 patrolTarget;

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        animator = GetComponent<Animator>();

        GameObject playerObj = GameObject.FindGameObjectWithTag("Player");
        if (playerObj != null) playerTransform = playerObj.transform;

        SetNewRandomDestination();
    }

    void Update()
    {
        if (playerTransform == null) return;

        bool canSee = CanSeePlayer();

        if (canSee)
        {
            isChasing = true; 
        }
        else
        {
            float distanceToPlayer = Vector3.Distance(transform.position, playerTransform.position);
            if (distanceToPlayer > looseDistance)
            {
                isChasing = false; 
            }
        }

        if (agent.isActiveAndEnabled && agent.isOnNavMesh)
        {
            if (isChasing)
            {
                agent.isStopped = false;
                agent.speed = chaseSpeed; 
                agent.SetDestination(playerTransform.position);

                // АТАКА В 3D:
                float attackDistance = 1.8f; 
                if (Vector3.Distance(transform.position, playerTransform.position) <= attackDistance)
                {
                    if (animator != null) animator.SetTrigger("AttackTrigger");

                    agent.isStopped = true;
                    agent.velocity = Vector3.zero;

                    GameOverManager gameOver = FindObjectOfType<GameOverManager>();
                    if (gameOver != null)
                    {
                        gameOver.Trigger3DDeath(playerTransform.gameObject, gameObject);
                        enabled = false; 
                    }
                }
            }
            else
            {
                agent.isStopped = false;
                agent.speed = patrolSpeed; 

                if (!agent.pathPending && agent.remainingDistance < 1.5f)
                {
                    SetNewRandomDestination();
                }
            }
        }

        if (animator != null)
        {
            bool isMoving = agent.velocity.magnitude > 0.1f;
            animator.SetBool("IsMoving", isMoving);
            animator.SetBool("IsChasing", isChasing);
        }
    }

    void SetNewRandomDestination()
    {
        Vector3 randomDirection = Random.insideUnitSphere * patrolRadius;
        randomDirection += transform.position;
        
        NavMeshHit navHit;
        if (NavMesh.SamplePosition(randomDirection, out navHit, patrolRadius, -1))
        {
            patrolTarget = navHit.position;
            agent.SetDestination(patrolTarget);
        }
    }

    bool CanSeePlayer()
    {
        float distance = Vector3.Distance(transform.position, playerTransform.position);

        if (distance <= viewDistance)
        {
            Vector3 directionToPlayer = (playerTransform.position - transform.position).normalized;
            float angle = Vector3.Angle(transform.forward, directionToPlayer);

            if (angle < viewAngle / 2f)
            {
                RaycastHit hit;
                Vector3 startPos = transform.position + Vector3.up;
                Vector3 targetPos = playerTransform.position + Vector3.up;

                if (Physics.Raycast(startPos, (targetPos - startPos).normalized, out hit, viewDistance))
                {
                    if (hit.transform.CompareTag("Player")) return true;
                }
            }
        }
        return false;
    }

    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red; Gizmos.DrawWireSphere(transform.position, viewDistance);
        Vector3 leftBoundary = Quaternion.Euler(0, -viewAngle / 2f, 0) * transform.forward;
        Vector3 rightBoundary = Quaternion.Euler(0, viewAngle / 2f, 0) * transform.forward;
        Gizmos.color = Color.yellow;
        Gizmos.DrawLine(transform.position, transform.position + leftBoundary * viewDistance);
        Gizmos.DrawLine(transform.position, transform.position + rightBoundary * viewDistance);
    }
}