gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:37:44 27 4
gpt4 key购买 nike

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;
}
}
}

脚本在默认天空盒和我的天空盒之间切换,也在当前事件相机和天空盒相机之间切换。

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

Camera.current.enabled = false;

Camera当前为null

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

最佳答案

这是 Camera.current,来自 the manual .

The camera we are currently rendering with.

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

The Unity engine typically assigns an already-instantiated instance of Camera to Camera.current

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

编辑器问题:Camera.current 为空

在编辑器中工作时,Camera.current 将不仅仅是您自己的应用程序的相机,它可以是任何相机。它甚至可以引用 editor's scene view camera .
在最后一种情况下,如果您的场景 View 没有聚焦(即当您聚焦于 Game Window 时),Camera.current 将为 null。

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

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


解决方案

不要使用 Camera.current,而是将所有相机存储在脚本中(此解决方案对于性能也更好,因为 Camera.currentCamera.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;
}

关于c# - 为什么当我在 Unity 编辑器中时 Camera.current 返回 null?还有其他方法可以捕捉当前的相机吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57261688/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com