Unity 5.4"设置目的地"只能在活动代理上调用,实例化时错误的目标

时间:2016-10-01 12:24:06

标签: c# instantiation unity5 navmesh

我正在尝试通过鼠标点击导航网格来生成士兵并将其作为团队移动。但我得到了#34;"设置目的地"只能在活跃的代理商上调用"错误。我在论坛中读到,这可以通过从导航网格实例化为高或低来引起。但无论我把生成点放在y轴上,都没有变化。我通常在Y = 0时产生它们。当实例化时,Unity似乎将我的预制克隆自动设置为y = 0.303 ...我不知道为什么。在场景视图中,我无法在运行时在y轴上转换士兵。另一个有趣的"发生的事情是,即使我在唤醒时调用getComponent,我也会获得nav Mesh代理的未分配引用异常。我必须在一个单独的函数中调用它,使它分别工作到达"设置目的地"错误。

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 个答案:

答案 0 :(得分:0)

我在尝试实例化用于克隆的隐藏gui元素时遇到了这个问题。

问题是GetComponent没有找到非活动游戏对象的组件。如果你想找到一个不活跃的游戏对象,你必须拨打GetComponentsInChildren<NavMeshAgent>(true);赞,

nav = GetComponentsInChildren<NavMeshAgent>(true);

请注意,true参数用于查找非活动对象。用于查找非活动对象的其他GetComponent方法现在已过时。

您可能需要为不活动的游戏对象添加父级,然后调用GetComponentsInChildren<NavMeshAgent>(true);赞,

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

参见参考资料。 https://docs.unity3d.com/ScriptReference/Component.GetComponentsInChildren.html

答案 1 :(得分:0)

你应该在Window中打开导航,然后选择飞机和Bake.you会看到它变成蓝色,这意味着你的带有navmeshagent的士兵可以在它上面行走。 希望它有用。