按下一个键时在两个游戏对象之间切换

问题描述 投票:0回答:2

我想做一个你向前开的小汽车游戏。

现在我想编写一个脚本,当你按下“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# 编码的新手。

谢谢

c# unity3d if-statement gameobject
2个回答
0
投票

所以你的问题是每一帧它都会检查你是否按下了“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);

        };

    }

0
投票

在评论部分我无法正确编写代码所以这是我的答案:

哇,我不知道它为什么起作用但是没关系..我确实在我的实际代码之前尝试过这里:

    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

© www.soinside.com 2019 - 2024. All rights reserved.