我知道可能存在重复项,我试图找出导致我的空值的原因,但也许你可以帮助我。所以我正在制作一个游戏,在这个游戏中,我在 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/