我想做一个你向前开的小汽车游戏。
现在我想编写一个脚本,当你按下“V”键时,相机切换到另一个相机,如果你再次按下它会返回。
我有 2 个相机游戏对象,一个在我的车后面,一个在驾驶座上。
始终禁用一个摄像头,因此您始终可以通过一个摄像头看到。
默认为:
BehindC - 主动 FrontC - 禁用
我试图告诉脚本,当我按下“V”键并且后置摄像头处于活动状态时,应禁用后置摄像头并启用前置摄像头。
另一种方式是相同的,如果后置摄像头未激活并且我按“V”,则前置摄像头被禁用并启用后置摄像头。
public class CameraSwitcher : MonoBehaviour
{
//BehindC is the Camera behind my Car
public GameObject BehindC;
//FrontC is the Camera in the drivers Seat
public GameObject FrontC;
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.V) && BehindC.activeInHierarchy)
{
BehindC.SetActive(false);
FrontC.SetActive(true);
}
else
{
BehindC.SetActive(true);
FrontC.SetActive(false);
};
}
}
当我尝试运行它并按“V”时,摄像头会在几毫秒内切换到前置摄像头并返回到后置摄像头,但你可以看到这个。
我认为这个 if 语句检查得太快并且切换相机也太快,因为“void Update”方法太快了。
也许我需要一些东西来延迟它并允许它在一秒钟内只检查 1 次或者其他一些东西。
如果你能解释一下你将如何解决这个问题以及代码是如何工作的,我将不胜感激,因为我是 C# 编码的新手。
谢谢
所以你的问题是每一帧它都会检查你是否按下了“V”以及 BehindC 对象是否处于活动状态。如果是这样,您激活 FrontC 对象并停用 BehindC 对象。但随后在下一帧中,它再次检查并发现 BehindC 对象已禁用,然后直接跳转到 else-Statement 并再次启用它。
您需要做的是使用 else if -Statement 代替 else-Statement 并定义它仅在按下“V”且 FrontC 对象处于活动状态时才重新激活 BehindC 对象。
像这样:
void Update()
{
if (Input.GetKeyDown(KeyCode.V) && BehindC.activeInHierarchy)
{
BehindC.SetActive(false);
FrontC.SetActive(true);
}
else if (Input.GetKeyDown(KeyCode.V) && FrontC.activeInHierarchy)
{
BehindC.SetActive(true);
FrontC.SetActive(false);
};
}
在评论部分我无法正确编写代码所以这是我的答案:
哇,我不知道它为什么起作用但是没关系..我确实在我的实际代码之前尝试过这里:
if (Input.GetKeyDown(KeyCode.V) && BehindC.activeInHierarchy)
{
BehindC.SetActive(false);
FrontC.SetActive(true);
}
if (Input.GetKeyDown(KeyCode.V) && FrontC.activeInHierarchy)
{
BehindC.SetActive(true);
FrontC.SetActive(false);
};
为什么这不起作用?当我尝试运行它时,什么也没有发生。
为什么“else if”起作用而不是这 2 个 if 语句。你能解释一下吗?
编辑:
好吧,我找到了答案......
如果你有 2 个 if 语句,脚本将尝试同时检查 2 个条件,这是行不通的,这就是什么都没有发生的原因。
如果您有一个“if”语句和“else if”,脚本只能同时检查 1 个条件,因此它必须接受一个条件并运行代码。
非常感谢您的回答@CodePirate
如果你们中有人想像我一样更好地理解它,请试试这个网站: 如何在C#中区分If, Else if, Else