在我的测试中,我发现将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函数中,它将起作用。
答案 0 :(得分:1)
在发布的代码中,您没有调用函数,而只是定义了函数。在说明中,您说您正在调用该函数。您在哪里尝试调用该函数? 如果要定义一个函数,则应在Update(),Start()或Awake()中调用它。 请记住,在调用函数时,必须在Vector3的参数中调用new。
DispatchTroops(new Vector3 (x,y,z));
答案 1 :(得分:1)
我发现函数调用顺序为:
Awake()>用户定义的成员函数> Start()> Update()
因此,当我调用DispatchTroops函数时,未调用士兵的Start()函数,因此navMeshAgent未初始化,然后出现NullReferenceException错误。