c# - 检查点是否可见时出现 NullreferenceException

标签 c# unity3d nullreferenceexception coroutine

我知道可能存在重复项,我试图找出导致我的空值的原因,但也许你可以帮助我。所以我正在制作一个游戏,在这个游戏中,我在 inspector 中定义为数组的六个点随机生成“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;

}

协程在 Start() 中说明。这个脚本和游戏对象在任何时候都不会被破坏。 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: Object reference not set to an instance of an object GameControl.SetSpawnPosition () (at Assets/Scripts/GameControl.cs:140) GameControl.AddPoliceMan () (at Assets/Scripts/GameControl.cs:67) GameControl+c__Iterator0.MoveNext () (at Assets/Scripts/GameControl.cs:92) UnityEngine.SetupCoroutine.InvokeMoveNext (IEnumerator enumerator, IntPtr returnValueAddress) (at C:/buildslave/unity/build/Runtime/Export/Coroutines.cs:17)

编辑

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

最佳答案

Ok, I had idea that it might be the other thing. Looks like Camera.current is giving me null. After changing it to a public variable with main camera assigned in inspector this error seems to be corrected. Question is why is Camera.current causing null?

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

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

关于c# - 检查点是否可见时出现 NullreferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41212668/

相关文章:

c# - 如何将空引用分析的结果写入日志文件

c# - 如何同时遍历两个 IEnumerables?

C# 自定义事件处理程序

node.js - 在游戏中同步 NPC 行为。使用 socket.io/node.js。 Unity2D

c# - 将 UI RectTransform 移动到世界位置

c# - 为什么 Textarea.Innertext 给我空点异常?

asp.net - 两个用户控件之间的交互

c# - 无法将运算符 '<' 应用于类型 T 和 T 的操作数

c# - Microsoft 认知服务视觉 API 确实检测代码中的任何字符

unity3d - 在Unity3D中拖拽ScrollRect(ScrollView)