我知道有可能重复,我试图找到导致我的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?
答案 0 :(得分:1)
如果场景视图没有焦点,将返回好吧,我知道它可能是另一回事。好像 Camera.current给了我null。将其更改为公众后 在检查员中分配主摄像机的变量似乎是这个错误 纠正。问题是为什么Camera.current导致null?
Camera.current
。您应该使用Camera.main
而不是Camera.current
。
此外,在使用Camera.main
之前,请确保相机具有标签MainCamera。默认情况下,这是在创建新场景时完成的,但您必须验证这一点,否则您将再次获得 null异常。