Unity创建Camera列表报错:无法将Camera[]转换为Camera
问题描述
要制作一个相机列表脚本,实现类似《玩具熊的五夜后宫》的多相机自由切换功能,后续支持添加更多相机,因此选择用List<Camera>而非数组。编写脚本时出现编译错误:
Argument 1: cannot convert from 'UnityEngine.Camera[]' to 'UnityEngine.Camera' [Assembly-CSharp]
原代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class 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>()); } }
错误原因
FindObjectsOfType<Camera>()方法返回的是Camera数组(Camera[]),而List<T>.Add()方法只能添加单个T类型元素,直接把数组传给Add就会出现类型不匹配的错误。另外原代码在Update里执行添加操作,会每帧重复往列表里加相机,导致列表快速膨胀,逻辑上也不合理。
修复方案
- 用
List<T>.AddRange()方法一次性添加数组里的所有相机元素,该方法支持传入IEnumerable类型参数(数组实现了IEnumerable)。 - 将相机初始化逻辑移到
Start()方法中,只执行一次,避免重复添加。 - 可添加去重逻辑,防止同一相机被多次加入列表。
修正后的代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraList : MonoBehaviour { public List<Camera> _cameras = new List<Camera>(); void Start() { // 获取场景中所有相机 Camera[] allCameras = FindObjectsOfType<Camera>(); // 一次性添加所有相机到列表 _cameras.AddRange(allCameras); // 可选:确保Camera.main在列表中且不重复 if (!_cameras.Contains(Camera.main)) { _cameras.Add(Camera.main); } } // 示例:相机切换方法,传入索引切换到对应相机 public void SwitchCamera(int cameraIndex) { if (cameraIndex >= 0 && cameraIndex < _cameras.Count) { // 先禁用所有相机 foreach (Camera cam in _cameras) { cam.enabled = false; } // 启用目标相机 _cameras[cameraIndex].enabled = true; } } }
补充说明
- 后续要添加新相机时,直接调用
_cameras.Add(newCamera)即可,确保传入的是单个Camera对象。 - 切换相机时,记得先禁用当前激活的相机,再启用目标相机,避免多个相机同时渲染。
内容的提问来源于stack exchange,提问作者Abraham Jaleel
相关产品推荐
相关产品推荐

