Unity 5.4 "Set Destination" может вызываться только на активном агенте, неправильное назначение при создании экземпляра
Я пытаюсь порождать солдат и перемещать их как полк с помощью щелчков мыши по сетке навигации. Но я получаю сообщение об ошибке "Установить назначение" можно только на активном агенте. Я читал на форумах, что это может быть вызвано созданием высоких или низких значений в сетке навигации. Но где бы я ни поставил точку появления на оси y, ничего не меняется. Я обычно вызываю их на Y = 0. Кажется, Unity автоматически устанавливает мои готовые клоны на y = 0.303 при создании экземпляра... Я не знаю почему. Я не могу переставить солдат по оси Y во время выполнения в виде сцены. Еще одна "забавная" вещь, которая случается, заключается в том, что я получаю исключенное ссылочное исключение для агента Nav Mesh, хотя я вызываю getComponent в Awake. Я должен вызвать его в отдельной функции, чтобы заставить его работать соответственно, чтобы добраться до ошибки "Set Destination".
public class Move : MonoBehaviour
{
private Ray _ray;
private RaycastHit hit;
private float raycastLength = 1000.0f;
private UnitMove nav;
public static List<GameObject> selectedUnits = new List<GameObject>();
void Update ()
{
_ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Input.GetMouseButtonDown(0))
{
if (Physics.Raycast(_ray, out hit, raycastLength))
{
MoveRegiment(hit.point);
}
}
}
void MoveRegiment(Vector3 moveToPos)
{
foreach (GameObject go in selectedUnits)
{
nav = go.GetComponent<UnitMove>();
nav.setNav();
nav.MovetoNav(moveToPos.x, moveToPos.y, moveToPos.z);
}
}
}
public class UnitMove : MonoBehaviour
{
private NavMeshAgent nav;
public int xPos { get; set; }
public int yPos { get; set; }
void Awake()
{
nav = GetComponent<NavMeshAgent>(); //does not work...
}
public void setNav()
{
nav = GetComponent<NavMeshAgent>();
}
public void MovetoNav(float x, float y, float z)
{
nav.SetDestination(new Vector3(x , y, z));
}
}
public class RegimentSpwan : MonoBehaviour
{
public Text row;
public Text unitAmmount;
public GameObject Unit;
private GameObject _newGO;
private Vector3 pos;
public void OnclickNewRegiment()
{
DestroyImmediate(GameObject.Find("Regiment"));
_newGO = new GameObject("Regiment");
Instantiate(_newGO, this.transform.position, Quaternion.identity);
for (int i = 0; i < Convert.ToInt16(row.text); i++)
{
for (int j = 0; j < Convert.ToInt16(unitAmmount.text); j++)
{
Debug.Log(this.transform.position.y); //is zero
Unit.name = "Unit_" + i + "_" + j;
pos = new Vector3(this.transform.position.x + j * 2,this.transform.position.y, this.transform.position.z + i * 2);
Instantiate(Unit, pos, Quaternion.identity, _newGO.transform);
Move.selectedUnits.Add(Unit); //list of gameobjects
}
}
}
}
2 ответа
У меня была эта проблема при попытке создать скрытые элементы графического интерфейса для клонирования.
Проблема в том, что GetComponent не находит компоненты неактивных игровых объектов. Если вы хотите найти неактивный игровой объект (ы), вы должны позвонить GetComponentsInChildren<NavMeshAgent>(true);
Подобно,
nav = GetComponentsInChildren<NavMeshAgent>(true);
Обратите внимание, что истинный параметр предназначен для поиска неактивных объектов. Другие методы GetComponent для поиска неактивных объектов теперь устарели.
Вам может понадобиться родительский объект для неактивных игровых объектов, затем GetComponentsInChildren<NavMeshAgent>(true);
Подобно,
nav = GameObject.Find("Parent").GetComponentsInChildren<NavMeshAgent>(true);
Смотрите ссылку. https://docs.unity3d.com/ScriptReference/Component.GetComponentsInChildren.html
Вы должны открыть Navigation in Window, затем выбрать самолет и Bake. Вы увидите, что он становится синим, это означает, что ваш солдат с navmeshagent может ходить по нему. Надеюсь, это было полезно.