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

kupeojn6  于 2022-11-25  发布在  其他
关注(0)|答案(2)|浏览(156)

正如标题所说,我想给予我的玩家一个临时的2倍乘数,然后在之后拿走它。到目前为止,我有一个按钮,他们点击设置他们当前的乘数x2,然后在10秒钟后拿走它,问题是如果他们在这段时间里购买了一个增加他们乘数的东西,这会把事情搞砸,我不知道如何处理。乘数在游戏开始时设置为1,可以通过购买“升级”来添加。
编辑:我有两个脚本,一个跟踪你有多少铁和你当前的点击乘数是什么,它也处理显示到屏幕上的文本,它被称为游戏管理器。
我的游戏有3个按钮,一个需要10铁,并给玩家加1到他们的点击乘数其他2做同样的事情,但需要更多的铁,并给一个更高的颠簸点击乘数。
然后,我添加了一个第4个按钮,当按下时,将给予玩家一个2倍,以他们的乘数为30秒(ex当前点击乘数是5后,按钮按下,现在是10后,30秒,它返回到5)
问题是,如果玩家点击2x按钮,然后购买1x点击乘数升级,他们不会保留他们在2x按钮协同程序中购买的那个。(ex当前点击乘数是1点击2倍按钮点击乘数现在是2然后购买1倍升级,所以点击乘数现在是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;
    }

}
guicsvcw

guicsvcw1#

这里的主要问题是你阻塞了这个函数。一个更好的解决方案是在Update函数中取消乘数设置,并检查它已经持续了多长时间。

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;
        }
    }
}
tyu7yeag

tyu7yeag2#

从我们的描述来看,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

相关问题