检查点是否可见时出现NullreferenceException

时间:2016-12-18 20:43:33

标签: c# unity3d nullreferenceexception coroutine

我知道有可能重复,我试图找到导致我的null的原因,但也许你可以帮助我。所以我正在制作一个随机产生的游戏" PoliceMan"在检查员中定义为数组的六个点。这是由协程定期完成的。我试图添加一种方法来检查相机是否可以看到生成点。这是我的代码片段:

IEnumerator AddPoliceManCR()
{

    int counter = 0;
    yield return new WaitForSeconds(1.0f);
    while (counter < 10)
    {

        AddPoliceMan();
        counter++;
        yield return new WaitForSeconds(Random.Range(3.0f, 5.0f));
    }
    while (true)
    {
        AddPoliceMan();
        yield return new WaitForSeconds(Random.Range(0.5f, 3.0f));
    }

}


 void AddPoliceMan()
{
    GameObject policeManClone = (GameObject)policemanPool.getPooledPoliceman();
    policeManClone.transform.position = SetSpawnPosition();
    policeManClone.transform.LookAt(new Vector3(player.transform.position.x, 0, player.transform.position.z));

    policeManClone.tag = "PoliceMan";
    policeManClone.SetActive(true);
}



Vector3 SetSpawnPosition()
{
    Vector3 position;


    position = spawnPositions[Random.Range(0, 6)];
    Debug.Log(position.ToString());
    if (Camera.current.WorldToViewportPoint(position).x > 0f
        && Camera.current.WorldToViewportPoint(position).x < 1f
        && Camera.current.WorldToViewportPoint(position).y > 0f
        && Camera.current.WorldToViewportPoint(position).y < 1f
        && Camera.current.WorldToViewportPoint(position).z > 0f)
    {
        Debug.Log("Spawn point visible");
    }
    else
    {
        Debug.Log("Spawn point is NOT visible");
    }


    return position;

}

Coroutine在Start()中说明。此脚本和gameObject不会在任何时候被销毁。 NullReferenceException符合:if (Camera.current.WorldToViewportPoint(position).x > 0f 如果点可见或不可见,Debug.Logs会正确显示,至少在大多数情况下都是如此。

问题是每次调用SetSpawnPopsition()时都不会发生这种情况。它可能是游戏开始时或者在此方法的20次调用之后。似乎是随机的。此外,如果在错误显示的原因之前只初始化了两行? 如果我将行policeManClone.transform.position = SetSpawnPosition();设置为policeManClone.transform.position = spawnPositions[Random.Range(0, 6)];我没有任何错误。

确切的错误是:

  

NullReferenceException:未将对象引用设置为的实例   对象GameControl.SetSpawnPosition()(at   Assets / Scripts / GameControl.cs:140)GameControl.AddPoliceMan()(at   资产/脚本/ GameControl.cs:67)   GameControl + c__Iterator0.MoveNext()(at   资产/脚本/ GameControl.cs:92)   UnityEngine.SetupCoroutine.InvokeMoveNext(IEnumerator枚举器,   IntPtr returnValueAddress)(at   C:/buildslave/unity/build/Runtime/Export/Coroutines.cs:17)

修改

好吧,我知道它可能是另一回事。看起来Camera.current给我null。将其更改为公共变量并在检查器中分配了主摄像头后,此错误似乎已得到纠正。问题是为什么Camera.current导致null?

1 个答案:

答案 0 :(得分:1)

  

好吧,我知道它可能是另一回事。好像   Camera.current给了我null。将其更改为公众后   在检查员中分配主摄像机的变量似乎是这个错误   纠正。问题是为什么Camera.current导致null?

如果场景视图没有焦点,将返回

Camera.current。您应该使用Camera.main而不是Camera.current

此外,在使用Camera.main之前,请确保相机具有标签MainCamera。默认情况下,这是在创建新场景时完成的,但您必须验证这一点,否则您将再次获得 null异常