控制灯光组件C#

时间:2018-08-31 10:38:26

标签: c# unity3d

我有一个游戏机制,玩家可以使用L键来切换汽车前灯,并使用S键来切换背景灯,这也可以控制向后移动。 这显示在下面的代码中。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class headLights : MonoBehaviour {

    private Light frontLight;
    private Light backLight;

// Use this for initialization
void Start () {
    frontLight = GetComponent<Light>();

}

// Update is called once per frame
void Update()
{
    if (Input.GetKeyDown(KeyCode.L))
    {
        frontLight.enabled = !frontLight.enabled;
    }

    if (Input.GetKeyDown(KeyCode.S))
    {
        backLight = GetComponent<Light>();
        backLight.enabled = !backLight.enabled;
    }
}

}

问题是当我按LS时,前灯和后灯都打开,因为我认为,GetComponent引用了场景中所有额外的Light组件并将它们概括为一个。 我想获得一个S键,仅在按下它的同时打开“ backLights”,而一个L键仅用于切换“ frontLights”。

我曾尝试解决此问题的方法

    frontLight = GameObject.Find("Player").GetComponent<Light>();

这段代码给了我错误,例如“游戏对象玩家没有附加任何灯光组件(尽管显然很清楚)。

我也尝试过使用标签,但是它们使我非常困惑,并且看起来很简单。我知道将来我将必须学习如何进行面向对象的语法和编码,所以我非常想学习如何引用它!

如果可以的话,请帮助我,这将使我开心~~:)

请注意,如果您的时间很短,您不必为我解决整个问题,只需给出我可以换出的通用语法将对我有很大帮助!

1 个答案:

答案 0 :(得分:3)

消除两个指示灯的歧义确实很容易。只需公开变量并将其设置在检查器中即可。在使用它们以确保已设置它们之前,请务必对它们进行空检查。

我只是意识到这可能没有道理。

可以这样说,您的层次结构是这样设置的:将灯光对象作为汽车的子级:

car
+-FrontLight
+-RearLight

应该将自定义行为放在轻型游戏对象上,而不是放在汽车上。

然后,行为将如下所示:

 public class headLights : MonoBehaviour {

    public Light frontLight;
    public Light backLight;

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update()
{
    if (Input.GetKeyDown(KeyCode.L))
    {
        if(frontLight != null) {
            frontLight.enabled = !frontLight.enabled;
        }
    }

    if (Input.GetKeyDown(KeyCode.S))
    {
        if(backLight != null) {
            backLight.enabled = !backLight.enabled;
        }
    }
}

这是因为灯不是汽车的组成部分,而是它们的孩子。