如何在Unity中创建相机列表?



我正在尝试制作一个包含相机列表的脚本。这样做的目的是让玩家可以随意切换多个摄像头(有点像周五晚上在Freddy’s),之后玩家可以添加更多摄像头,这就是为什么我决定使用列表而不是数组。

然而,当我试图用这个列表制作一个脚本时,我得到了这个错误

参数1:不能从"UnityEngine"转换。相机[]'到'UnityEngine。相机的[Assembly-CSharp]

这是我写的代码:
using System.Collections;

使用System.Collections.Generic;使用UnityEngine;

公共类CameraList: MonoBehaviour{

public List <Camera> _cameras = new List <Camera>();
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
_cameras.Add(Camera.main);
_cameras.Add(FindObjectsOfType<Camera>());

}

}

试试这个

using System.Collections.Generic;
using UnityEngine;
public class CameraList : MonoBehaviour
{
private List<Camera> cameras = new List<Camera>();
private void Start()
{
cameras.Add(Camera.main);
// or to add all cameras in scene
cameras.AddRange(FindObjectsOfType<Camera>());
}
}

参数1:不能从'UnityEngine '转换。相机[]"UnityEngine。相机的[Assembly-CSharp]

你得到这个错误的原因,那是因为你正在使用FindObjectsOfType,这将返回具有给定类型的每个找到的项目的数组,您应该使用cameras.AddRange(FindObjectsOfType<Camera>());

你的相机也应该有标签"MainCamera"使用Camera.main。不要像那样从Update中添加到list。

正如前面的回答所述,您需要使用:

cameras.AddRange(FindObjectsOfType<Camera>);

这是因为.Add不接受数组(' FindObjectsOfType '的返回值)作为参数。

一些可能对你有用的提示:

不要在Update中添加cameras:

对于您的目的,因为它本质上是一个初始化,这是一个逻辑错误。你只需要添加一次所需的相机;在AwakeStart中加入cameras

跳过这一步的后果是,更差的性能和bug。

不添加Camera.maincameras:

只使用.AddRange

跳过这一步的后果是,一个逻辑错误,主摄像机在列表中出现两次。这是因为Camera.main也是FindObjectsOfType<Camera>集合的一部分。

Do make Listcamerasprivate:

cameras没有公开的理由。

跳过这一步的后果是,除了面向对象的设计原则之外,这可能会导致漏洞,因为Unity编辑器中的更改反映在集合中。例如,从UnityEditor中添加主摄像机,然后从FindObjectsOfType

中复制一个。