繁体   English   中英

如何在使用协程将当前乘数乘以 2 30 秒后保持当前乘数

[英]How to keep current multiplier after multiplying your current multiplier by two for 30 seconds with a coroutine

正如标题所说,我想给我的播放器一个临时的 2 倍乘数,然后再把它拿走。 到目前为止,我有一个他们单击的按钮,用于设置他们当前的乘数 x2,然后在 10 秒后将其取走,问题是如果他们在那段时间购买增加的乘数,它会把事情搞砸,我不确定如何处理它. GameManager.The multiplier 在游戏开始时设置为 1,可以通过购买“升级”来增加。

编辑:我有两个脚本,一个跟踪你有多少 Iron 和你当前的点击乘数是多少,它还处理将两者显示到屏幕上的文本,它称为 GameManager。

我的游戏有 3 个按钮,一个需要 10 个 Iron,让玩家的点击倍数加 1,其他 2 个做同样的事情,但需要更多的 Iron 并为点击倍数提供更高的冲击。

然后我添加了第 4 个按钮,当按下该按钮时,玩家将获得 2 倍的乘数,持续 30 秒(之前的点击乘数在按下按钮后为 5,现在为 10,在 30 秒后返回到 5)

问题是,如果玩家点击 2x 按钮,然后购买 1x 点击乘数升级,他们不会保留他们在 2x 按钮协程期间购买的那个。 (当前点击乘数是 1 次点击,2x 按钮点击乘数现在是 2,然后购买 1x 升级,所以点击乘数现在是 3。30 秒后,乘数应该返回到 2,但返回到 1,就好像他们从未购买过1x 升级)

希望这能更好地解释我的问题。 我尝试添加原始乘法器的临时变量,然后使用 mathf.ABS 找出差异,然后用它做一些事情,但老实说,它开始让我感到困惑,所以我在这里征求意见大声笑我的代码到目前为止是:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class TwoX: MonoBehaviour
{
    [SerializeField] Button _TwoX;

void Start () {
        Button btn = TwoX.GetComponent<Button>();
        btn.onClick.AddListener(TaskOnClick);
    }

    void TaskOnClick(){
        StartCoroutine(test());
    }

   IEnumerator test()
    {
        GameManager.Multiplier = GameManager.Multiplier * 2;
        yield return new WaitForSeconds(10);
        GameManager.Multiplier = GameManager.Multiplier / 2;
    }

}

根据您的描述,听起来GameManager.Multiplier是一个int所以这些步骤确实是

  • 初始值1
  • * 2 => 2
  • + 1 => 3
  • / 2 => 1

因为int除法不知道小数(如果它是一个float ,结果将是1.5f )。


我会使用的技巧是根本不使用*/而是+-

private bool alreadyDoubled;

IEnumerator test()
{
    // avoid hat the routine is running multiple times if your player spams the button
    if(alreadyDoubled) yield break;

    // block other instances of this routine
    alreadyDoubled = true;

    // cache the original value!
    // the advantage of a Coroutine here is that you can simply keep
    // along a value within this Coroutines scope
    var addition = GameManager.Multiplier;

    // This basically equals doing * 2
    GameManager.Multiplier += addition; 

    yield return new WaitForSeconds(10);

    // This only removes the addition, regardless of what happened to the value in the meantime
    GameManager.Multiplier -= addition; 

    // allow the next instance of this routine to start
    alreaeyDoubled = false;
}

这次的步骤将是

  • 初始值1
  • " * 2 " -> 实际上+ 1 -> 2
  • + 1 => 3
  • " / 2 " -> 实际上- 1 -> 2

您在这里的主要问题是您阻止了 function。更好的解决方案是在更新 function 中取消设置乘数并检查它已经持续了多长时间。

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class TwoX: MonoBehaviour
{
    [SerializeField] Button _TwoX;

    float upgradeTime = 0.0f;
    float delay = 10.0f
    bool isUpgraded = false;

    void Start ()
    {
        Button btn = TwoX.GetComponent<Button>();
        btn.onClick.AddListener(TaskOnClick);
    }

    void TaskOnClick()
    {
        if (!isUpgraded)
        {
            GameManager.Multiplier *= 2;
            upgradeTime = Time.time;
            isUpgraded = true;
        }
    }

    void Update()
    {
        if (Time.time >= upgradeTime + delay && isUpgraded)
        {
            GameManager.Multiplier /= 2;
            isUpgraded = false;
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM