为什么下一个场景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
。
我有一个有开始按钮的开始场景。起始场景有一个相机适配器游戏对象。 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
。