我对灯光管理有点困惑。
我有4盏灯;每个都带有标签"" lights_hall"。在我的代码中,我将所有这些灯光分配到游戏对象列表roomlights = Gameobject.FindGameObjectsWithTag("lights_hall");
我得到了游戏对象的列表,我认为它们是灯光。
然后我浏览列表中的每个元素,打开和关闭它们,但是当脚本尝试检索组件时出现错误" Light"。
foreach (GameObject single_light in roomlights)
{
if (single_light.GetComponent<Light>().intensity == 1)
single_light.SetActive(false);
else
single_light.SetActive(true);
}
Unity告诉我游戏对象没有附加光组件。如果灯光组件是轻型游戏对象的一部分,这怎么可能呢?
我确实检查了一些例子,他们都做了同样的事情:创建一个gameobjects列表,使用find获取所有指定标签的灯光,然后访问列表中每个元素的灯光组件。
我在这里遗漏了什么吗?我也尝试访问每个单元素轻组件,所以我可以使用.enable,但它不会出现在自动完成中。
EDIT ==================================
这是我使用的脚本;它连接到一个简单的立方体,它有一个对撞机,所以当第一个人控制器进入触发区时,你按下&#34; l&#34;在键盘上,光线应该关闭。
我确实验证了名称,并且名称与场景中的点光游戏对象相匹配;虽然Unity打印错误"MissingComponentException: There is no "Light" attached to the "switch" game object, but a script is trying to access it. You probably need to add a Light to the game object "switch". Or your script needs to check if the component is attached before using it"
韧带是点光源;没什么特别的。
using UnityEngine;
using System.Collections.Generic;
public class LightsSwitch : MonoBehaviour {
private bool istriggered = false;
public GameObject[] roomlights;
// Use this for initialization
void Start () {
roomlights = GameObject.FindGameObjectsWithTag("lights_hall");
foreach (GameObject light in roomlights)
Debug.Log(light.name);
}
// Update is called once per frame
void Update () {
if (istriggered && Input.GetKeyDown(KeyCode.L))
{
foreach (GameObject single_light in roomlights)
{
if (single_light.GetComponent<Light>().intensity == 1)
single_light.SetActive(false);
else
single_light.SetActive(true);
}
}
}
void OnTriggerEnter(Collider world_item)
{
istriggered = true;
Debug.Log("light switch");
}
void OnTriggerExit(Collider world_item)
{
istriggered = false;
Debug.Log("light switch gone");
}
}
答案 0 :(得分:0)
一些问题。
首先,在您的代码中:
roomlights = Gameobject.FindGameObjectsWithTag("lights_hall");
确保将Gameobject更改为游戏 O 对象。
现在,假设室内灯是GameObject [],请按如下方式设置代码:
foreach (GameObject single_light in roomlights)
{
if (single_light.GetComponent<Light>().enabled == true)
single_light.SetActive (false);
else
single_light.SetActive (true);
}
我的建议是禁用Light组件,而不是整个GameObject本身。这可以通过以下方式实现:
single_light.GetComponent<Light>().enabled = false;
using UnityEngine;
using System.Collections;
public class turnofflight : MonoBehaviour {
public GameObject[] roomlights;
// Use this for initialization
void Start () {
roomlights = GameObject.FindGameObjectsWithTag("light_comp");
foreach (GameObject light in roomlights)
Debug.Log(light.name);
}
// Update is called once per frame
void Update () {
foreach (GameObject single_light in roomlights)
{
if ((single_light.GetComponent<Light>().intensity == 1.0f))
single_light.SetActive(false);
else
single_light.SetActive(true);
}
}
}
我对此实施没有任何问题。