【问题标题】:NullreferenceException when checking if point is visible检查点是否可见时出现 NullreferenceException
【发布时间】:2017-05-03 22:03:35
【问题描述】:

我知道可能存在重复,我试图找出导致我的 null 的原因,但也许你可以帮助我。所以我正在制作一个游戏,其中我在检查器中定义为数组的六个点随机生成“警察”。这是由协程定期完成的。我尝试添加一种方法来检查相机是否可以看到生成点。这是我的代码 sn-ps:

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;

}

协程在Start() 中声明。这个脚本和游戏对象在任何时候都不会被破坏。 NullReferenceException 符合:if (Camera.current.WorldToViewportPoint(position).x &gt; 0f 至少在大多数情况下,如果点可见或不可见,Debug.Logs 会正确显示。

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

确切的错误是:

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

编辑

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

【问题讨论】:

    标签: c# unity3d nullreferenceexception coroutine


    【解决方案1】:

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

    如果场景视图没有焦点,将返回Camera.current。您应该使用Camera.main 而不是Camera.current

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 2015-02-21
      相关资源
      最近更新 更多