我可以在游戏播放和游戏前倒计时(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,这一想法(并试图无效)。还试图将我的倒计时脚本附加到我的主摄像机上,并将Text countdown;
更改为public Text countdown;
,这样我就可以将倒计时文本提供给它,但是没有任何东西。
发布于 2019-02-20 20:58:11
而不是在OnEnable
中启动一个新的协同器,所以每次GameObject设置为active。
您应该检查您的倒计时之前是否已经完成,只有在之前完成时才重新启动它。
此外,当您暂停合作中心:的注释时,您不会停止Coroutine。
备注:Coroutines是,而不是当MonoBehaviour是禁用时停止的,而是只有当它被明确销毁时才停止。您可以使用MonoBehaviour.StopCoroutine和MonoBehaviour.StopAllCoroutines来停止Coroutine。当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();
}
结果:如果倒计时在禁用之前没有完成,则继续进行,否则将启动新的倒计时。
举个例子,我刚才
private void StartRound()
{
countdown.text = "GO!";
}
而不是那个开关,您也可以使用
public List<Color> colors = new List<Color>();
将您的颜色添加到列表中(最顶部的color1,最底层的color3),而不是简单地使用
countdown.color = colors[count -1];
https://stackoverflow.com/questions/54793856
复制相似问题