【问题标题】:Changing the fire rate while button pressed按下按钮时更改射速
【发布时间】:2017-04-11 00:40:43
【问题描述】:

我现在有一个使用 C# 在 Unity 上进行的 2D 射击游戏,我想在获得一个加电项目时将船的射速提高 5 秒。它有点工作,但是当飞船启动时,在释放并再次按下按钮之前,射速不会改变。有没有办法在按下按钮时在通电后立即改变射速?另外,加电功能是我想出来的,如果有更好的方法来制作加电功能,那也会很有帮助。在此先感谢:)

void Update(){
    if (Input.GetKeyDown(KeyCode.Space)){
        InvokeRepeating("Fire", 0.000001f, fireRate);
    }
}
void PowerUp()
{
    Upgrade = true;
    timeLeft = +5f;
    if (Upgrade == true)
    {
        fireRate = 0.1f;
    }
    if (timeLeft <= 0)
    {
        Upgrade = false;
        fireRate = 0.5f;
    }
}

【问题讨论】:

    标签: c# unity3d unity5


    【解决方案1】:

    您应该将引用类型传递给 Fire 协程,而不是 float fireRate。

    只需将fireRate 包装在一个类中即可:

    class FireData
    {
       public float fireRate = 0.1;
    }
    

    然后在你的脚本中,

    FireData fireData = new FireData { fireRate = 0.5f };
    void Update(){
        if (Input.GetKeyDown(KeyCode.Space)){
            InvokeRepeating("Fire", 0.000001f, fireData);
        }
    }
    void PowerUp()
    {
        Upgrade = true;
        timeLeft = +5f;
        if (Upgrade == true)
        {
            fireData.fireRate = 0.1f;
        }
        if (timeLeft <= 0)
        {
            Upgrade = false;
            fireData.fireRate = 0.5f;
        }
    }
    

    Fire()协程中,使用这个fireData.fireRate来获取fireRate。

    顺便说一句,我认为你的加电功能已经足够好了。

    但是使用协程的方式不正确。不要在同一个函数上多次调用InvokeRepeating

    if (Input.GetKeyDown(KeyCode.Space)){
        InvokeRepeating("Fire", 0.000001f, fireRate);
    }
    

    相反,您应该使用 bool 值来控制火灾何时开始。

    if (Input.GetKeyDown(KeyCode.Space)){
        fireData.Firing = true;
    }
    if(fireData.Firing)
    {
        InvokeRepeating("Fire", 0.000001f, fireRate);
    }
    

    还记得添加一个逻辑来停止通过StopCoroutine 触发。

    【讨论】:

    • 对不起,我正忙于其他事情,直到现在我才能进行更改。我也花了一些时间来了解如何使用协程。感谢您的帮助和描述性解释!
    猜你喜欢
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多