为什么下一个场景unity中Camera不可用?

Why does Camera in unity not available in the next scene?

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

我在我的 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