@KakoitoChel
Просто рандомный чел из инета.

Как заставить НПС идти к игроку?

Хотел сделать зрение и преследование игрока для НПС по видео, то есть добавил 2 скрипта и настроил Navigation. У меня работает так, как нужно, кроме той части, где после обнаружения игрока НПС должен приближаться к нему.
Вот 2 скрипта:
Первый (EnemyVision):
using UnityEngine;
using System.Collections;
using UnityEngine.AI;

public class EnemyVision : MonoBehaviour
{

    public string targetTag = "Player";
    public int rays = 8;
    public int distance = 33;
    public float angle = 40;
    public Vector3 offset;
    public Transform target;
    private NavMeshAgent Nana;

    void Start()
    {

        target = GameObject.FindGameObjectWithTag(targetTag).transform;
        Nana = GetComponent<NavMeshAgent>();
    }

    bool GetRaycast(Vector3 dir)
    {
        bool result = false;
        RaycastHit hit = new RaycastHit();
        Vector3 pos = transform.position + offset;
        if (Physics.Raycast(pos, dir, out hit, distance))
        {
            if (hit.transform == target)
            {
                result = true;
                Debug.DrawLine(pos, hit.point, Color.green);
            }
            else
            {
                Debug.DrawLine(pos, hit.point, Color.blue);
            }
        }
        else
        {
            Debug.DrawRay(pos, dir * distance, Color.red);
        }
        return result;
    }

    bool RayToScan()
    {
        bool result = false;
        bool a = false;
        bool b = false;
        float j = 0;
        for (int i = 0; i < rays; i++)
        {
            var x = Mathf.Sin(j);
            var y = Mathf.Cos(j);

            j += angle * Mathf.Deg2Rad / rays;

            Vector3 dir = transform.TransformDirection(new Vector3(x, 0, y));
            if (GetRaycast(dir)) a = true;

            if (x != 0)
            {
                dir = transform.TransformDirection(new Vector3(-x, 0, y));
                if (GetRaycast(dir)) b = true;
            }
        }

        if (a || b) result = true;
        return result;
    }

    void Update()


    {
        if (Vector3.Distance(transform.position, target.position) < distance)
        {
            if (RayToScan())
            {
                Nana.enabled = true;   // Контакт с целью
            }
            else
            {
                Nana.enabled = false;
            }
        }
    }
}

Второй (NaMesh):
using UnityEngine;
using System.Collections;
using UnityEngine.AI;

public class NaMesh : MonoBehaviour
{

	public Transform target;
	NavMeshAgent agent;

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

	}


	void Update()
	{
		agent.SetDestination(target.position);
	}
}

63d80b82a05fa748955627.png63d80bc3c6782462300053.png63d80bf0add05496988548.png
Вот, на всякий случай, видео по-которому я пытался сделать отслеживание и приближение к игроку: https://youtu.be/oH4TNsyUJV8

Буду очень счастлив и благодарен если вы захотите помочь мне!
  • Вопрос задан
  • 197 просмотров
Решения вопроса 1
@KakoitoChel Автор вопроса
Просто рандомный чел из инета.
Всем привет! Я смог найти решение проблемы, оказывается, в Navigation в параметрах object нужно было у объектов, влияющих на навигация установить значение static
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы