为什么下一个场景中无法使用统一相机?

问题描述

我有一个带有开始按钮的开始场景。开始场景有一个相机适配器游戏对象。相机适配器获取主相机并对每个场景执行一些操作。当我点击开始并加载下一个场景时,相机适配器对象在下一个场景中可用,但相机丢失。这是我的代码和配置:

Start scene hierarchy

Start scene inspector

Level1 hierarchy

level1 inspector

我在我的 CameraAdapter 脚本中添加了以下代码

public class CameraAdaptor2D : MonoBehavIoUr

{

float displayWidth;
float displayHeight;


[Serializefield] Camera cam;


   void OnEnable()
{
    SceneManager.sceneLoaded += OnSceneLoaded;
}

void OnSceneLoaded(Scene scene,LoadSceneMode mode)
{
    cam = Camera.main;
}

// called when the game is terminated
void Ondisable()
{
    Debug.Log("Ondisable");
    SceneManager.sceneLoaded -= OnSceneLoaded;
}

private void Awake()
{
    DontDestroyOnLoad(this.gameObject);
}
// Start is called before the first frame update
void Start()
{
    cam = Camera.main;
    displayWidth = Screen.width;
    displayHeight = Screen.height;
positionCamera();}
   void PositionCamera()
    {
        Vector3 vector = new Vector3(0.0f,0.0f,0.0f);
        cam.transform.position = vector;
    }

当我点击开始按钮时,Unity 会加载下一个关卡。但是使用上面的代码,我无法获取当前场景的相机。即使我添加了断点,下一个场景也不会在断点处暂停。是否有我遗漏的内容需要添加代码中,或者是否有另一种方法可以在每个场景中获取摄像头?

解决方法

使用 DontDestroyOnLoad 时,所有特定于场景的引用在加载到新场景时都会被擦除。您需要订阅 sceneLoaded 并在那里分配引用。

void OnEnable()
{
    SceneManager.sceneLoaded += OnSceneLoaded;
}

void OnSceneLoaded(Scene scene,LoadSceneMode mode)
{
      // assign the reference here 
}

void OnDisable()
{
    // make sure to unsubscribe or you will get multiple calls after multiple scene loads 
    SceneManager.sceneLoaded -= OnSceneLoaded;
}

另一种选择是将这个脚本所在的对象放在每个场景中并分配引用,然后在 Awake 中查找场景中脚本的另一个实例,然后将旧对象引用分配给当前和破坏当前。

void Awake()
{
    CameraAdaptor2D obj =  Object.FindObjectOfType<CameraAdaptor2D>();

    if (obj != null)
    {
        // assign the other object here 
        obj.AssignCamera(cam);
        Destroy(this.gameObject);
        return;
    }

    DontDestroyOnLoad(this.gameObject);
}

public void AssignCamera(Camera c)
{
    cam = c;
}

我还应该提到,两个答案都使用 DontDestroyOnLoad。第一个要求在您加载的第一个场景中存在一个实例,并且您将永远不会在同一会话中再次加载该场景。第二个要求在每个场景中都有相同的对象,以便可以通过该场景中对象的本地实例设置引用。如果您想了解有关任一实现如何工作的更多详细信息,请告诉我。

,

因为你只保留了 CameraAdaptor2D 而不是 Camera 本身

void Start()
{
    cam = Camera.main;
    displayWidth = Screen.width;
    displayHeight = Screen.height;

    DontDestroyOnLoad (cam);
}

但当然要确保您的其他场景中没有其他 Camera