我可以在游戏进行期间和游戏进行前倒计时(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文本,但是什么也不能输入。
答案 0 :(得分:0)
比起您在OnEnable
中启动新的协程,这样每次将GameObject重新设置为活动状态时即可。
您宁愿检查您的倒数计时是否已经完成,并且仅在倒计时完成之前重新启动。
此外,从Coroutines:暂停笔记时,您不会停止协程
注意:当MonoBehaviour被禁用时,协程不会不停止,但只有在其被销毁时才停止。您可以使用MonoBehaviour.StopCoroutine和MonoBehaviour.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();
}
结果:如果在禁用前倒数计时尚未完成,则继续,否则开始新的倒数计时。
我刚才做的例子
private void StartRound()
{
countdown.text = "GO!";
}
代替该开关,您也可以简单地使用
public List<Color> colors = new List<Color>();
将您的颜色添加到列表中(最上面的一种蜜蜂color1,最底层的一种蜜蜂color3),而不是简单地使用
countdown.color = colors[count -1];