Unity3D SetDestination更新

时间:2018-07-24 03:06:30

标签: unity3d

在我的测试中,我发现将navMeshAgent.SetDestination放置在Update函数中时可以使用,但是在其他函数中则不起作用。我不知道它是如何发生的,并乞求您的答案。

Soldier.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Soldier : MonoBehaviour {
    private UnityEngine.AI.NavMeshAgent navMeshAgent;

    void Awake() {
    }

    void Start() {
        navMeshAgent = GetComponent<UnityEngine.AI.NavMeshAgent>();
    }

    void Update() {
    }

    public void DispatchTroops(Vector3 destination) {
        navMeshAgent.SetDestination(destination);
    }
}

AddSoldiers.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class AddSoldiers : MonoBehaviour {

    public GameObject soldier;
    static readonly int soldiersNumber = 10;

    private Vector3 src;
    bool order = false;

    // Use this for initialization
    void Start() {
        Button btw = this.GetComponent<Button>();
        btw.onClick.AddListener(TaskOnClick);
        src = Vector3.zero;
    }

    // Update is called once per frame
    void Update() {
        if (order) {
            StartCoroutine(GenerateSoliders(new Vector3(5f, 5f, 5f)));
            order = false;
        }
    }

    // Click button
    public void TaskOnClick() {
        order = true;
    }

    // Add a few soldiers
    IEnumerator GenerateSoliders(Vector3 destination) {
        for (int i = 0; i < soldiersNumber; i++) {
            GameObject s = Instantiate(soldier, src, Quaternion.identity);
            s.GetComponent<Soldier>().DispatchTroops(destination);
            yield return new WaitForSeconds(1);
        }
    }
}

代码如上。在统帅gameObjcet中,首先创建一个士兵gameObject,然后调用士兵的成员函数DispatchTroops。但是发生了错误:

NullReferenceException: Object reference not set to an instance of an object Soldier.DispatchTroops(Vector3 destination) (at Assets/Scenes/Soldier.cs:19). 

如果我将navMeshAgent.SetDestination放在Update函数中,它将起作用。

2 个答案:

答案 0 :(得分:1)

在发布的代码中,您没有调用函数,而只是定义了函数。在说明中,您说您正在调用该函数。您在哪里尝试调用该函数? 如果要定义一个函数,则应在Update(),Start()或Awake()中调用它。 请记住,在调用函数时,必须在Vector3的参数中调用new。

DispatchTroops(new Vector3 (x,y,z));

答案 1 :(得分:1)

我发现函数调用顺序为:

Awake()>用户定义的成员函数> Start()> Update()

因此,当我调用DispatchTroops函数时,未调用士兵的Start()函数,因此navMeshAgent未初始化,然后出现NullReferenceException错误。