0

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

开始场景层次

启动场景检查器

一级层次结构

一级检查员

我在我的 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 会加载下一个级别。但是使用上面的代码,我无法获取当前场景的相机。即使我添加了断点,下一个场景也不会在断点处暂停。我在代码中是否缺少要添加的内容,或者是否有另一种方法可以在每个场景中使用摄像头?

4

2 回答 2

3

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. 第一个要求在您加载的第一个场景中存在一个实例,并且您将永远不会在同一会话中再次加载此场景。第二个要求每个场景中都有相同的对象,以便可以通过该场景中对象的本地实例设置引用。如果您想了解更多关于这两种实现如何工作的详细信息,请告诉我。

于 2021-05-21T16:48:24.857 回答
0

因为你只继承了CameraAdaptor2D而不是继承了Camera它本身

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

    DontDestroyOnLoad (cam);
}

但是,当然要确保Camera在您的其他场景中没有其他 s。

于 2021-05-21T17:51:47.707 回答