灯游戏对象没有轻组件?

时间:2016-03-17 23:37:55

标签: c# unity3d

我对灯光管理有点困惑。

我有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");

    }
}

1 个答案:

答案 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;

我已经设置了一个示例项目,此实现应该适合您。

Hierarchy setup and inspector

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);
            }

    }
}

我对此实施没有任何问题。