Пятница, 29 Марта 2024, 18:16

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Ошибка с NavMesh agent в unity
Ошибка с NavMesh agent в unity
CoreДата: Суббота, 07 Марта 2020, 01:58 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
По зарубежному туториалу, пытался добавить себе в игру ходячего зомбя. Взял нужные префабы из его исходника, и залил себе на сцену. Подключил скрипты - выдает ошибку:
Код

"SetDestination" can only be called on an active agent that has been placed on a NavMesh.
UnityEngine.AI.NavMeshAgent:SetDestination(Vector3)
AIExample:Wander() (at Assets/Scripts/AIExample.cs:108)
AIExample:Update() (at Assets/Scripts/AIExample.cs:47)


Код скрипта:
Код

  using System.Collections;
  using System.Collections.Generic;
  using UnityEngine;
  using UnityStandardAssets.Characters.FirstPerson;
  using UnityEngine.AI;

  public class AIExample : MonoBehaviour {

  public enum WanderType { Random, Waypoint};

  public FirstPersonController fpsc;
  public WanderType wanderType = WanderType.Random;
  public float wanderSpeed = 4f;
  public float chaseSpeed = 7f;
  public float fov = 120f;
  public float viewDistance = 10f;
  public float wanderRadius = 7f;
  public Transform[] waypoints; //Array of waypoints is only used when waypoint wandering is selected

  private bool isAware = false;
  private Vector3 wanderPoint;
  private NavMeshAgent agent;
  private Renderer renderer;
  private int waypointIndex = 0;
  private Animator animator;

  public void Start()
  {
      agent = GetComponent<NavMeshAgent>();
      renderer = GetComponent<Renderer>();
      animator = GetComponentInChildren<Animator>();
      wanderPoint = RandomWanderPoint();
  }
  public void Update()
  {
      if (isAware)
      {
          agent.SetDestination(fpsc.transform.position);
          animator.SetBool("Aware", true);
          agent.speed = chaseSpeed;
          //renderer.material.color = Color.red;
      } else
      {
          SearchForPlayer();
          Wander();
          animator.SetBool("Aware", false);
          agent.speed = wanderSpeed;
          //renderer.material.color = Color.blue;
      }
  }

  public void SearchForPlayer()
  {
      if (Vector3.Angle(Vector3.forward, transform.InverseTransformPoint(fpsc.transform.position)) <
      fov / 2f)
      {
          if (Vector3.Distance(fpsc.transform.position, transform.position) < viewDistance)
          {
              RaycastHit hit;
              if (Physics.Linecast(transform.position, fpsc.transform.position, out hit, -1))
              {
                  if (hit.transform.CompareTag("Player"))
                  {
                      OnAware();
                  }
              }
          }
      }
  }

  public void OnAware()
  {
      isAware = true;
  }

  public void Wander()
  {
      if (wanderType == WanderType.Random)
      {
          if (Vector3.Distance(transform.position, wanderPoint) < 2f)
          {
              wanderPoint = RandomWanderPoint();
          }
          else
          {
              agent.SetDestination(wanderPoint);
          }
      }
      else
      {
          //Waypoint wandering
          if (waypoints.Length >= 2)
          {
              if (Vector3.Distance(waypoints[waypointIndex].position, transform.position) < 2f)
              {
                  if (waypointIndex == waypoints.Length - 1)
                  {
                      waypointIndex = 0;
                  }
                  else
                  {
                      waypointIndex++;
                  }
              }
              else
              {
                  agent.SetDestination(waypoints[waypointIndex].position);
              }
          } else
          {
              Debug.LogWarning("Please assign more than 1 waypoint to the AI: " + gameObject.name);
          }
      }
  }

  public Vector3 RandomWanderPoint()
  {
      Vector3 randomPoint = (Random.insideUnitSphere * wanderRadius) + transform.position;
      NavMeshHit navHit;
      NavMesh.SamplePosition(randomPoint, out navHit, wanderRadius, -1);
      return new Vector3(navHit.position.x, transform.position.y, navHit.position.z);
  }
  }


BizzyДата: Суббота, 07 Марта 2020, 09:43 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
Так написано же "SetDestination" can only be called on an active agent that has been placed on a NavMesh. NavMeshAgent отключен на объекте.



Сообщение отредактировал Bizzy - Суббота, 07 Марта 2020, 09:48
drcrackДата: Суббота, 07 Марта 2020, 12:29 | Сообщение # 3
старожил
Сейчас нет на сайте
Более вероятно что он не стоит на навмеше, возможно навмеша вообще нет (тс в первом посте не упомянул что навмеш запечен)
BizzyДата: Суббота, 07 Марта 2020, 14:38 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
drcrack,Может и такое быть.



Сообщение отредактировал Bizzy - Суббота, 07 Марта 2020, 14:39
CoreДата: Суббота, 07 Марта 2020, 15:20 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
Цитата drcrack ()
возможно навмеша вообще нет (тс в первом посте не упомянул что навмеш запечен)

Запечен


Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Ошибка с NavMesh agent в unity
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг