首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >游戏暂停时隐藏倒计时当游戏恢复时重新启动

游戏暂停时隐藏倒计时当游戏恢复时重新启动
EN

Stack Overflow用户
提问于 2019-02-20 19:24:40
回答 1查看 68关注 0票数 0

我可以在游戏播放和游戏前倒计时(3,2,1)中暂停我的游戏,这两种情况都在GameManager中作为UserIsPlaying被跟踪,只有倒计时也被跟踪为CountdownIsOn (正如您将在脚本片段中看到的那样)。

我面临的问题是,每当我在倒计时期间暂停游戏,然后恢复,倒计时就会重新启动(我相信这是因为我将它隐藏为一个游戏对象,而游戏对象上有倒计时脚本)。

下面是我的PauseMenu脚本的相关部分(我在Resume公共空脚本中做相反的操作)。

代码语言:javascript
运行
复制
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;
}

这是我的倒数剧本。

代码语言:javascript
运行
复制
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,这一想法(并试图无效)。还试图将我的倒计时脚本附加到我的主摄像机上,并将Text countdown;更改为public Text countdown;,这样我就可以将倒计时文本提供给它,但是没有任何东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-20 20:58:11

而不是在OnEnable中启动一个新的协同器,所以每次GameObject设置为active。

您应该检查您的倒计时之前是否已经完成,只有在之前完成时才重新启动它。

此外,当您暂停合作中心:的注释时,您不会停止Coroutine。

备注:Coroutines是,而不是当MonoBehaviour是禁用时停止的,而是只有当它被明确销毁时才停止。您可以使用MonoBehaviour.StopCoroutineMonoBehaviour.StopAllCoroutines来停止Coroutine。当MonoBehaviour被摧毁时,协同线也会被停止。

由于您使用Time.timeScale = 0f;来暂停,所以您应该使用WaitForSecondsRealtime来等待,这不会受到Time.timeScale的影响

代码语言:javascript
运行
复制
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();
}

结果:如果倒计时在禁用之前没有完成,则继续进行,否则将启动新的倒计时。

举个例子,我刚才

代码语言:javascript
运行
复制
private void StartRound()
{
    countdown.text = "GO!";
}

而不是那个开关,您也可以使用

代码语言:javascript
运行
复制
public List<Color> colors = new List<Color>();

将您的颜色添加到列表中(最顶部的color1,最底层的color3),而不是简单地使用

代码语言:javascript
运行
复制
countdown.color = colors[count -1];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54793856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档