如何通过SetActive()方法正确控制多个Unity相机的启用与禁用?
问题
我有一个可正常运行的Unity脚本(代码如下),原本通过Camera组件的enabled属性控制相机的启用与禁用。现在需要改用SetActive()方法来完全启用/禁用相机,但将代码中的GetComponent<Camera>().enabled = true;修改为SetActive(true)后出现了CS1061错误,请问该如何正确实现?
原代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Interactive_map : MonoBehaviour { public Camera[] cameras; void Start() { cameras[0].GetComponent<Camera>().enabled = true; } public void TriggerClicked(int cam) { for (int i = 0; i < cameras.Length; i++) { cameras[i].GetComponent<Camera>().enabled = false; } cameras[cam].GetComponent<Camera>().enabled = true; } }
错误信息
Assets\Scripts\Interactive_map.cs(13,20): 错误 CS1061: “Camera”不包含“SetActive”的定义,并且找不到可接受类型为“Camera”的第一个参数的可访问扩展方法“SetActive”(是否缺少 using 指令或程序集引用?)
解决方法
错误原因
SetActive()是GameObject类的方法,作用是启用/禁用整个游戏对象,而非Camera组件的方法。直接调用Camera实例的SetActive(),自然会触发“Camera无该方法”的错误。
修改步骤
- 你的
cameras数组已经存储了Camera组件的引用,原代码里的GetComponent<Camera>()属于冗余代码,完全可以省略。 - 通过Camera组件的
gameObject属性获取它所在的游戏对象,再调用SetActive()方法。
修改后的代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Interactive_map : MonoBehaviour { public Camera[] cameras; void Start() { // 启用第一个相机所在的游戏对象 cameras[0].gameObject.SetActive(true); } public void TriggerClicked(int cam) { for (int i = 0; i < cameras.Length; i++) { // 禁用所有相机所在的游戏对象 cameras[i].gameObject.SetActive(false); } // 启用指定索引的相机所在的游戏对象 cameras[cam].gameObject.SetActive(true); } }
补充说明
SetActive(false)会完全禁用整个游戏对象,包括它身上的所有组件;而Camera.enabled = false仅禁用Camera组件本身,游戏对象仍处于活跃状态,按需选择即可。- 原代码中
cameras[i].GetComponent<Camera>()完全多余,因为cameras[i]本身就是Camera类型,直接用cameras[i].enabled即可控制组件开关。
内容的提问来源于stack exchange,提问作者Roborock
相关产品推荐
相关产品推荐

