首页 > 解决方案 > StartCoroutine 给出 NullReferenceException

问题描述

我有2节课。

public class GameManager : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        var a = new Routine();
        a.StartRoutine();
    }
}
public class Routine : MonoBehaviour
{
    public void StartRoutine()
    {
        StartCoroutine(test());
    }
    IEnumerator test(){
        Debug.Log("MSG");
        yield return null;
    }
}

我把 GameManager 放在相机上,运行游戏并得到 NullReferenceException

NullReferenceException
UnityEngine.MonoBehaviour.StartCoroutine (System.Collections.IEnumerator routine) (at <d815b7efac424eeb8e053965cccb1f98>:0)
Routine..ctor () (at Assets/Routine.cs:9)
GameManager.Start () (at Assets/GameManager.cs:10)

那么这段代码有什么问题呢?

标签: c#unity3dcoroutineienumerator

解决方案


您正在尝试使用以下行创建一个新的 Monobehaviour 对象:var a = new Routine();。相反,您可以:

创建一个游戏对象并将Routine.cs脚本添加为组件。

然后回到你的GameManager.cs

public class GameManager : MonoBehaviour {
    public GameObject go;

    void Start() {
        Routine routine = go.GetComponent<Routine>();
        routine.StartRoutine();
    }
}

然后回到 Unity 编辑器,将包含Routine.cs脚本的游戏对象添加到GameManager.cs空的 go 字段


推荐阅读