首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么下一个场景中没有统一的摄像机?

为什么下一个场景中没有统一的摄像机?
EN

Stack Overflow用户
提问于 2021-05-21 16:40:01
回答 2查看 923关注 0票数 0

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

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

代码语言:javascript
复制
public class CameraAdaptor2D : MonoBehaviour

{

代码语言:javascript
复制
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;
代码语言:javascript
复制
positionCamera();}
   void PositionCamera()
    {
        Vector3 vector = new Vector3(0.0f,0.0f,0.0f);
        cam.transform.position = vector;
    }

当我点击“开始”按钮时,团结就会加载到下一个级别。但是有了上面的代码,我无法获得当前场景的摄像机。即使我添加了一个断点,下一个场景也不会停在断点上。在代码中是否有我遗漏的东西,或者是否有其他方法可以在每个场景中获得摄像头?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-21 16:48:24

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

代码语言:javascript
复制
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中查找场景中脚本的另一个实例,然后将旧的对象引用分配给当前并销毁当前。

代码语言:javascript
复制
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。第一个要求在您加载的第一个场景中存在一个实例,您将永远不会在同一个会话中再次加载这个场景。第二个要求在每个场景中都有相同的对象,这样引用就可以由场景中对象的本地实例来设置。如果您需要更多关于这两种实现如何工作的详细信息,请告诉我。

票数 3
EN

Stack Overflow用户

发布于 2021-05-21 17:51:47

因为您只继承CameraAdaptor2D,而不是Camera本身。

代码语言:javascript
复制
void Start()
{
    cam = Camera.main;
    displayWidth = Screen.width;
    displayHeight = Screen.height;

    DontDestroyOnLoad (cam);
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67640819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档