@RGO_999

Почему не работает NavMeshAgent?

Скрипт работает правильно потому-что print с проверкой пишется но на всякий случай скрипт прикреплю:
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.UIElements;

enum Mummies
{
    Normal,
    Thrower,
    Kamikaze
}
public class Mummie : MonoBehaviour
{
    public float speed, health, damage, size, atkSpeed, xpCount;
    NavMeshAgent nma;
    PlayerController player;
    [SerializeField] Transform tntSpawnPoint;
    [SerializeField] GameObject tntPref;
    [SerializeField] Mummies type;
    [SerializeField] string id;
    // Start is called before the first frame update
    void Start()
    {
        nma = GetComponent<NavMeshAgent>();
        player = FindObjectOfType<PlayerController>();
        nma.speed = speed;
        gameObject.transform.localScale = new Vector3(size, size, size);
        gameObject.GetComponent<BoxCollider>().enabled = true;
        gameObject.GetComponent<Animator>().SetInteger("Type", type.GetHashCode());
        id = id + Random.Range(0, 1000000).ToString();
    }

    // Update is called once per frame
    void Update()
    {
        if (atkSpeed <= 0)
        {
            print($"Айди: {id}, Тип: {type}, atkSpeed: {atkSpeed} Иф на скорость атаки");
            if (type.GetHashCode() == 0 || type.GetHashCode() == 2)
            {
                print($"Айди: {id}, Тип: {type}, atkSpeed: {atkSpeed} Иф на тип");
                nma.SetDestination(player.transform.localPosition);
            }
            else if (type.GetHashCode() == 1)
            {
                print($"Айди: {id}, Тип: {type}, atkSpeed: {atkSpeed} Иф на тип");
                tntSpawnPoint.LookAt(player.transform.localPosition);
                if (Vector3.Distance(transform.position, player.transform.position) >= 20)
                {
                    nma.SetDestination(player.transform.localPosition);
                    gameObject.GetComponent<Animator>().SetBool("Staying", false);
                }
                else
                {
                    nma.ResetPath();
                    transform.LookAt(player.transform.localPosition);
                    gameObject.GetComponent<Animator>().SetBool("Staying", true);
                }
            }
        }
        if (health <= 0)
        {
            Destroy(gameObject);
            FindObjectOfType<GameManager>().enemyCount--;
            FindObjectOfType<PlayerController>().countForDamage--;
            FindObjectOfType<GameManager>().xp += xpCount;
            FindObjectOfType<GameManager>().chanceTop += xpCount;
            FindObjectOfType<GameManager>().chanceDown -= xpCount;
        }
        atkSpeed -= Time.deltaTime;
    }

    private void OnTriggerStay(Collider collision)
    {
        if (collision.gameObject.CompareTag("Player") && atkSpeed <= 0)
        {
            gameObject.GetComponent<BoxCollider>().enabled = false;
            gameObject.GetComponent<Animator>().SetTrigger("Damaging");
        }
    }

    void DamageToPlayer()
    {
        gameObject.GetComponent<BoxCollider>().enabled = true;
        player.health -= damage;
        atkSpeed = 2;
        FindObjectOfType<GameManager>().chanceTop -= damage;
        FindObjectOfType<GameManager>().chanceDown += damage;
    }

    void SpawnTNT()
    {
        GameObject newTnt = Instantiate(tntPref, tntSpawnPoint.position, tntSpawnPoint.rotation);
    }

    void DestroyMe()
    {
        Destroy(gameObject);
    }
}


Все анимации работают, объекты по которым должны ходить мумии статичны, навигация запечена, а скорость не равна нулю так как в начале скрипта она задается изначальным настройкам.
66768f6ec8694674417656.jpeg
Но единственный тип который работает это Kamikaze.
  • Вопрос задан
  • 39 просмотров
Пригласить эксперта
Ответы на вопрос 2
freeExec
@freeExec
Участник OpenStreetMap
То что бросается в глаза:
- использовать .GetHashCode() какой-то странной подход. Если уж хочешь получить из энума номер то касти его к инту. А вообще для того энум и заводят, чтобы избавиться от магических цифр 1,2,4
- избавься от GetComponent и вынеси всё что нужно в [SerializeField]
- использоваться FindObjectOfType() на каждое изменение свойств это вообще зашквар, лагать должно неименоверно. Если нет у тебя GameManager как синглтона, ну хотя бы ищи его в сцене один раз на старте.
Ответ написан
Комментировать
@DrRen7
nma.SetDestination(player.transform.localPosition);

А точно нужны локальные координаты? думаю тут просто нужен transform.position
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы