我正在尝试制作一个包含相机列表的脚本。这样做的目的是让玩家可以随意切换多个摄像头(有点像周五晚上在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
:
对于您的目的,因为它本质上是一个初始化,这是一个逻辑错误。你只需要添加一次所需的相机;在Awake
或Start
中加入cameras
。
跳过这一步的后果是,更差的性能和bug。
不添加Camera.main
到cameras
:
只使用.AddRange
。
跳过这一步的后果是,一个逻辑错误,主摄像机在列表中出现两次。这是因为Camera.main
也是FindObjectsOfType<Camera>
集合的一部分。
Do make Listcameras
private:
cameras
没有公开的理由。
跳过这一步的后果是,除了面向对象的设计原则之外,这可能会导致漏洞,因为Unity编辑器中的更改反映在集合中。例如,从UnityEditor中添加主摄像机,然后从FindObjectsOfType