在游戏暂停时隐藏倒数计时,在游戏恢复时重新计时

时间:2019-02-20 19:24:40

标签: c# unity3d

我可以在游戏进行期间和游戏进行前倒计时(3、2、1)期间暂停我的游戏-在GameManager中,两者都以UserIsPlaying的形式跟踪,只有倒数以CountdownIsOn的形式跟踪:很好(如您在脚本片段中所见)。

我面临的问题是,每当我在倒计时中暂停游戏然后恢复播放时,倒计时都会重新开始(我认为这是由于我将其隐藏为游戏对象,并且该游戏对象具有倒计时脚本)。

这是我的PauseMenu脚本的相关部分(我在同一脚本的Resume公共无效对象中做相反的操作)。

public GameObject pauseMenuUI;
public GameObject hidePauseButtonPM;

public GameObject hidePlayer;
public GameObject hideCountdownPause;

public void Pause ()
{        
    pauseMenuUI.SetActive(true);
    hidePauseButtonPM.SetActive(false);

    if (GameManager.CountdownIsOn)
    {
        hidePlayer.SetActive(false);
        hideCountdownPause.SetActive(false); 

    }
    if (GameManager.UserIsPlaying && !GameManager.CountdownIsOn)
    {
        hidePlayer.SetActive(false);                        
    }

    Time.timeScale = 0f;
    GameIsPaused = true;
}

这是我的倒计时脚本。

public Color color3;     
public Color color2;
public Color color1;

Text countdown;    

void OnEnable()
{
    countdown = GetComponent<Text>();
    countdown.text = "3";        
    StartCoroutine("Countdown");
}

IEnumerator Countdown()
{
    int count = 3;

    for (int i = 0; i < count; i++)
    {
        countdown.text = (count - i).ToString();            
        if ((count - i) == 3)
        {
            countdown.color = color3;                
        }
        if ((count - i) == 2)
        {
            countdown.color = color2;                
        }
        if ((count - i) == 1)
        {
            countdown.color = color1;                
        }
        yield return new WaitForSeconds(1);            
    }
    StartRound();
}

所以我对你的问题是:如何在Pause期间隐藏倒数计时,以使其不会在Resume上重新开始?

曾考虑过(但无济于事)将游戏暂停时将倒计时文字的alpha更改为0,并在恢复后将其更改为255。还尝试将Countdown脚本附加到我的主摄像头,并将Text countdown;更改为public Text countdown;,以便我可以向其输入Countdown文本,但是什么也不能输入。

1 个答案:

答案 0 :(得分:0)

比起您在OnEnable中启动新的协程,这样每次将GameObject重新设置为活动状态时即可。

您宁愿检查您的倒数计时是否已经完成,并且仅在倒计时完成之前重新启动。

此外,从Coroutines:暂停笔记时,您不会停止协程

  

注意:当MonoBehaviour禁用时,协程不会不停止,但只有在其被销毁时才停止。您可以使用MonoBehaviour.StopCoroutineMonoBehaviour.StopAllCoroutines停止协程。当MonoBehaviour被销毁时,协程也将停止。

由于您使用Time.timeScale = 0f;暂停,因此应使用WaitForSecondsRealtime进行等待,不受Time.timeScale的影响

public Color color3;     
public Color color2;
public Color color1;

private Text countdown; 

// moved this to outer scope in order to
// "share" it among routines   
int count = 3;
// flag to control whether the last countdown was finished
private bool countdownFinished = true;    

private void Awake()
{
    // do this only once
    countdown = GetComponent<Text>();
}

private void OnEnable()
{
    countdown.text = count.ToString();        
    StartCoroutine(Countdown());
}

private void OnDisable()
{
    // just to be sure cancel all running Coroutines
    // should be done anyway automatically
    StopAllCoroutines();
}

private IEnumerator Countdown()
{
    // only restart the countdown if it was finished before
    // otherwise continue the last one
    if (countdownFinished) count = 3;

    countdownFinished = false;

    // inverting that for loop would make things a lot
    // easier for you
    while (count > 0)
    {
        countdown.text = count.ToString();

        // better use a switch for that         
        switch (count)
        {
            case 3:
                countdown.color = color3;
                break;

            case 2:
                countdown.color = color2;
                break;

            case 1:
                countdown.color = color1;
                break;
        }

        yield return new WaitForSecondsRealtime(1);
        count--;
    }

    countdownFinished = true;
    StartRound();
}

结果:如果在禁用前倒数计时尚未完成,则继续,否则开始新的倒数计时。

enter image description here

我刚才做的例子

private void StartRound()
{
    countdown.text = "GO!";
}

代替该开关,您也可以简单地使用

public List<Color> colors = new List<Color>();

将您的颜色添加到列表中(最上面的一种蜜蜂color1,最底层的一种蜜蜂color3),而不是简单地使用

countdown.color = colors[count -1];