为什么当我在 Unity 编辑器中时 Camera.current 返回 null?还有其他方法可以捕获当前相机吗?

Dan*_*Lip 3 c# unity-game-engine

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[ExecuteAlways]
public class SkyBox : MonoBehaviour
{
    public Material[] skyboxes;
    public Camera skyboxCamera;
    public float skyboxMoveSpeed = 2f;

    private int index = 0;

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            SwitchSkybox();
        }

        if (RenderSettings.skybox == skyboxes[1])
        {
            RenderSettings.skybox.SetFloat("_Rotation", Time.time * skyboxMoveSpeed);
        }
    }

    public void SwitchSkybox()
    {
        index++;
        if (index == skyboxes.Length)
        {
            index = 0;
        }
        RenderSettings.skybox = skyboxes[index];

        if (RenderSettings.skybox == skyboxes[1])
        {
            skyboxCamera.enabled = true;
            Camera.current.enabled = false;
            Time.timeScale = 1.0f;
        }
        else
        {
            skyboxCamera.enabled = false;
            Camera.current.enabled = true;
            Time.timeScale = 0.0f;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该脚本在默认天空盒和我的天空盒之间切换,还在当前活动相机和天空盒相机之间切换。

但是当我按下转义键时,它会在编辑器中的第 46 行抛出 null 异常:

Camera.current.enabled = false;
Run Code Online (Sandbox Code Playgroud)

Camera的电流为null

我想做到这一点,当我按下退出键时,它将切换到我的天空盒和天空盒相机,并且还会暂停游戏(稍后我将在游戏暂停时制作一个主菜单)。

Jac*_*ani 5

这是Camera.current来自手册的。

我们当前用来渲染的相机。

另外值得注意的是 Ruzihm 的评论。

Unity 引擎通常会分配一个已经实例化的实例 CameraCamera.current

所以,从你的脚本中,我看到两个问题。与此问题直接相关的问题仅在编辑器模式下发生,我将从该问题开始。

编辑器问题:Camera.current 为空

在编辑器中工作时,Camera.current不仅仅是您自己的应用程序的相机,还可以是任何相机。它甚至可以指编辑器的场景视图相机
在最后一种情况下,如果您的场景视图未聚焦(即当您聚焦于 时Game WindowCamera.current将为空。

逻辑问题:你无法切换回来

当您尝试从 切换回来时skyboxCamera,您的Camera.current相机将是相同的skyboxCamera,而不是您的默认相机。因此您将无法检索以前的相机。


解决方案

不要使用Camera.current,而是将所有相机存储在脚本中(此解决方案的性能也更好,因为 和Camera.current都不Camera.Main是高性能脚本)。

在您的情况下,您需要将这段代码添加到脚本中并使用该EnableSkyBoxCamera方法。

public Camera defaultCamera;
public Camera skyBoxCamera;

private Camera _currentCamera;

public void EnableSkyBoxCamera(bool enableSkyBox)
{
    defaultCamera.enabled = !enableSkyBox;
    skyBoxCamera.enabled  = !enableSkyBox;

    if (enableSkyBox) _currentCamera = skyBoxCamera;
    else _currentCamera              = defaultCamera;
}
Run Code Online (Sandbox Code Playgroud)