2016-10-01 13 views
0

Я пытаюсь вызвать солдат и переместить их в качестве полка с помощью мыши на навигационной сетке. Но я получаю сообщение «Set Destination» может быть вызвано только «активным агентом». Я читал в форумах, что это может быть вызвано созданием экземпляра на высоком или низком уровне из навигационной сетки. Но везде, где я устанавливаю точку появления на оси y, ничего не меняется. Я обычно создаю их на Y = 0 Кажется, Unity автоматически устанавливает мои prefab-клоны y = 0.303 при создании экземпляров ... я не знаю почему. Я не могу трансформировать солдат по оси Y во время работы на сцене. Другая «забавная» вещь, которая случается, заключается в том, что я получаю неназначенное ссылочное исключение для агента навигации Mesh, хотя я называю getComponent на Awake. Я должен вызвать его в отдельной функции, чтобы заставить его работать соответственно, чтобы добраться до ошибки «Установить цель».Unity 5.4 «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 

      } 
     } 

    } 
} 

ответ

0

У меня была эта проблема при попытке создать скрытые элементы gui для клонирования.

Проблема в том, что GetComponent не находит компоненты неактивных игровых объектов. Если вы хотите найти неактивный GameObject (ы) вы должны вызывать GetComponentsInChildren<NavMeshAgent>(true); Мол,

nav = GetComponentsInChildren<NavMeshAgent>(true); 

Обратите внимание, что истинный параметр для обнаружения неактивных объектов. Другие методы GetComponent для поиска неактивных объектов теперь устарели.

Вам может понадобиться родителю неактивные GameObjects затем вызвать GetComponentsInChildren<NavMeshAgent>(true); Мол,

nav = GameObject.Find("Parent").GetComponentsInChildren<NavMeshAgent>(true); 

См ссылку. https://docs.unity3d.com/ScriptReference/Component.GetComponentsInChildren.html

0

Вы должны открыть навигацию в окне, затем выбрать самолет и Bake.you увидите, что он станет синим, это означает, что ваш солдат с navmeshagent может ходить по нему. Надеюсь, это было полезно.

+0

У моего самолета есть navmesh. Если я перетащил сборник в хирачи, я смогу переместить моего солдата с помощью nav.SetDestination (mousePointClick), как и предполагалось. Ошибка возникает только при нерестах Солдаты во время выполнения с помощью экземпляра и пытаются их переместить. –