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

6tqwzwtp  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(186)

我想做一个小汽车游戏,让你向前开。
现在我想编写一个脚本,当你按下“V”键时,相机切换到另一个相机,如果你再按一次,它会返回。
我有2个相机游戏对象,一个在我的车后面,一个在司机座位上。
一个摄像头始终处于禁用状态,因此您始终可以通过一个摄像头查看内容。
默认值为:
BehindC - Active 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次在一秒钟或东西idk。
如果你能解释一下你将如何解决这个问题以及代码是如何工作的,我将不胜感激,因为我是C#编码的新手。
谢谢

z6psavjg

z6psavjg1#

在评论部分,我不能正确地编写代码,所以这里是我的答案:
哇,我不知道为什么它工作,但好吧。.我确实试过在我的实际代码这里:

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”语句有效,而这两个if语句无效?你能解释一下吗
编辑:
好吧,我找到答案了。..
如果你有两个if语句,脚本会尝试同时检查两个条件,这是不起作用的,这就是为什么什么都没有发生。
如果你有一个“if”语句和“else if”语句,脚本只能同时检查一个条件,所以它必须接受一个条件并运行代码。
非常感谢你的回答@CodePirate
如果你想像我一样更好地理解它,请尝试这个网站:How To Differentiate If, Else if, Else in C#

jgzswidk

jgzswidk2#

所以你的问题是,每一帧它都检查你是否按了“V”,以及BehindC对象是否处于活动状态。如果是,你激活FrontC对象并停用BehindC对象。但是在下一帧中,它再次检查,发现BehindC对象被禁用,然后直接跳到else语句并再次启用它。
你需要做的是使用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);

        };

    }

相关问题