0

I am trying to spawn soldiers and move them as a regiment via mouse clicks on a nav mesh. But i get the ""Set Destination" can only be called on an active agent" error. I read in the forums that this can be caused by instantiating to high or low from the nav mesh. But wherever i put the spawnpoint on the y axis, nothing changes. I usually spawn them on Y = 0 It seems Unity sets my prefab clones autmatically to y = 0.303 when instantiating... i dont't know why. I can't translante the soldiers on the y-axis on runtime in the scene view. Another "fun" thing that happens is that I get an unassigned reference exception for the nav Mesh agent even though I call getComponent on Awake. I have to call it in a separate function to make it work respectively to get to the "Set Destination" Error.

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

            }
        }

    }
}
Little-God
  • 183
  • 1
  • 3
  • 16

2 Answers2

0

I had this problem while trying to instantiate hidden gui elements for cloning.

The problem is that GetComponent doesn't find components of inactive gameobjects. If you want to find an inactive gameobject(s) you must call GetComponentsInChildren<NavMeshAgent>(true); Like,

nav = GetComponentsInChildren<NavMeshAgent>(true);

Note that the true parameter is for finding inactive objects. The other GetComponent methods for finding inactive objects are now obsolete.

You might need to parent the inactive gameobjects then call GetComponentsInChildren<NavMeshAgent>(true); Like,

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

See the reference. https://docs.unity3d.com/ScriptReference/Component.GetComponentsInChildren.html

0

You should open Navigation in Window,then chose the plane and Bake.you will see it turn blue,that means your soldier with navmeshagent can walk on it. Hope it was useful.

Saber
  • 23
  • 1
  • 1
  • 4
  • My Plane has a navmesh. If I drag and drop a prefab in the hirachy i can move my soldier/s around with nav.SetDestination(mousePointClick) as intended. The Error occours only when spawning Soldiers on runtime with instantiate and try to move them. – Little-God Oct 02 '16 at 12:29