我有一个游戏机制,玩家可以使用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;
}
}
}
问题是当我按L
或S
时,前灯和后灯都打开,因为我认为,GetComponent引用了场景中所有额外的Light组件并将它们概括为一个。
我想获得一个S
键,仅在按下它的同时打开“ backLights”,而一个L
键仅用于切换“ frontLights”。
我曾尝试解决此问题的方法
frontLight = GameObject.Find("Player").GetComponent<Light>();
这段代码给了我错误,例如“游戏对象玩家没有附加任何灯光组件(尽管显然很清楚)。
我也尝试过使用标签,但是它们使我非常困惑,并且看起来很简单。我知道将来我将必须学习如何进行面向对象的语法和编码,所以我非常想学习如何引用它!
如果可以的话,请帮助我,这将使我开心~~:)
请注意,如果您的时间很短,您不必为我解决整个问题,只需给出我可以换出的通用语法将对我有很大帮助!
答案 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;
}
}
}
这是因为灯不是汽车的组成部分,而是它们的孩子。