【发布时间】:2019-05-23 17:55:56
【问题描述】:
我的一些代码有一个奇怪的问题,我真的可以使用一些帮助。
我有一个附加到特定场景独有的游戏对象的脚本,因此 Start() 中的任何内容都只会在加载该场景时运行。在此脚本中,我正在访问 Camera.main,因为我使用附加到相机游戏对象的设置(这听起来可能效率低下,但对于我们正在创建的游戏风格来说这是必要的)。无论如何,如果我直接在 Unity 中从那个场景开始,它工作得很好,但是如果我从我的介绍场景开始,然后加载到上述场景中,我会收到这个错误:
MissingReferenceException: The object of type 'Camera' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
奇怪的是,我可以 Debug.Log(Camera.main) 它给了我相机的名称。所以 Camera.main 不为空,并且不会像错误消息中所说的那样被破坏。这是我的完整脚本:
private void Start()
{
Debug.LogError(Camera.main);
gameManager = FindObjectOfType<GameManagerScript>();
if (Camera.main == null)
{
Debug.LogError("Camera.main is null");
}
else
{
gameManager.LoadMusic(Camera.main);
gameManager.LoadAmbient(Camera.main);
gameManager.FadeStereoPan(Camera.main.gameObject.GetComponent<SwipeActivator>().stereoPanInNode);
}
}
上面的三个函数是我写的自定义函数,但我不知道为什么它们会导致问题,因为如果我直接启动场景它们就可以工作。
几个月来我都没有遇到这个问题,然后突然之间,我收到了这个错误,即使我没有更改任何代码。任何帮助将不胜感激。
【问题讨论】:
-
Camera.main将获取标签为Main Camera的相机 -
对不起,我应该澄清一下。我们正在创建的这个游戏有很多相机,因为它是神秘风格的第一人称点击。我目前将所有相机设置为主相机,我只需根据需要启用/禁用它们以从一个点移动到另一个点。
-
你每次都得到错误吗?您是否 100% 确定您没有更改代码?确保 Start() 方法的运行顺序没有任何依赖关系,例如“脚本 X 的 Start() 必须在 Y 的 Start() 之前运行才能使 Z 工作”
-
哦等等,你说你禁用它了吗?如果没有标记为
Main Camera的活动摄像机,Camera.main将返回null。但是您的错误说已销毁。你曾经破坏过相机吗? -
这就是我最初感到困惑的地方,因为我从不破坏相机,但正如我在回答中所说,它失败的原因是因为我有一个 DontDestroyOnLoad() 对象指向前一个场景中的相机,当我切换场景时,它失败了,因为我还没有将该变量重新分配给新场景中的相机。