проблема с единством навимеш и мой встроенный код ai - PullRequest
0 голосов
/ 19 мая 2019

во-первых, извините, если иногда мой английский будет немного непонятным, я постараюсь сделать все возможное.

На самом деле я пытаюсь построить простую систему ИИ с компонентом единства Навимеша, моя цель:

  • NPC проверит, что игрок находится ближе всего к его позиции, и пойдет туда, чтобы убить его.
  • если целевой игрок стоит передо мной, убегайте

мой настоящий код работает, но с некоторыми проблемами

 private Transform player;
 private UnityEngine.AI.NavMeshAgent myNMagent;
 private Transform startTransform;

 public float multiplyBy;
 public Vector3 resultedVector;


 // Use this for initialization
 void Start () {

     player = GameObject.FindGameObjectWithTag ("Player").transform;
     myNMagent = this.GetComponent<UnityEngine.AI.NavMeshAgent> ();

     RunFrom ();
 }

 // Update is called once per frame
 void Update () {


     //if is not facing got to eat him
    if(!ISFacing())
    {
        GotToEat();      
    }
    else
    {
        RunFrom ();
    }
 }

 public void RunFrom()
 {


     startTransform = transform;

     transform.rotation = Quaternion.LookRotation(transform.position - player.position);

     Vector3 runTo = transform.position + transform.forward * multiplyBy;

     NavMeshHit hit;    



    if(NavMesh.SamplePosition(runTo, out hit, 50, 1 << NavMesh.GetAreaFromName("Walkable")))
    {
        transform.position = startTransform.position;
        transform.rotation = startTransform.rotation;

        myNMagent.SetDestination(hit.position);
    }
    else
    {
        Debug.Log("not hitting");
    }


 }

 private void GotToEat()
 {
     transform.rotation = Quaternion.LookRotation(player.position - transform.position);
     myNMagent.SetDestination(player.transform.position);
 }
 private bool ISFacing()
 {
    float angle = 45;
    float angleToPlayer = Vector3.Angle(player.transform.forward.normalized,( transform.position - player.transform.position).normalized);

     if( angleToPlayer < angle)
     {
         return true;
     }
     else
     return false;
 }
bool IsHit(out Vector3 result)
{
    for (int i = 0; i < 30; i++)
    {
        Vector3 fixedPoint = transform.position + transform.forward * multiplyBy;
        NavMeshHit hit;
        if (NavMesh.SamplePosition(fixedPoint, out hit, 10.0f,1 << NavMesh.GetAreaFromName("Walkable")))
        {
            result = hit.position;
            return true;
        }
    }
    result = Vector3.zero;
    return false;
}

когда NPC достигнет угла моей карты, он больше не будет двигаться, там остановится.

Полагаю, мне следует проверить, является ли любое попадание в "navmesh" "Проходимым" или нет, но моя функция всегда возвращает true, поэтому я не могу сказать навимешу идти в любом другом направлении.

что я пропускаю?

Видео об этом

видео

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...