gpt4 book ai didi

c# - 受 timeScale 影响的协程 WaitForSeconds

转载 作者:行者123 更新时间:2023-12-04 01:56:08 26 4
gpt4 key购买 nike

我正在为我的 UI 元素制作一个简单的动画。

我有一个动画组件,它有 2 个不同的动画 - ZoomIn 和 ZoomOut。

每当需要在屏幕上显示 UI 元素(例如按钮)时,就会显示这些动画。

我通常更喜欢在不显示时停用游戏对象。

我为动画编写了以下方法:

私有(private) IEnumerator ToggleObjectWithAnimation (GameObject gameObj) {
动画师 gameObjectAnimator = gameObj.GetComponent();//Animator 设置为未缩放时间
如果(gameObj.activeSelf == false){
gameObj.transform.localScale = new Vector3 (0, 0, 1.0f);
gameObj.SetActive (true);
gameObjectAnimator.SetTrigger ("ZoomIn");
yield return new WaitForSeconds (0.5f);
} 否则如果(gameObj.activeSelf == true){
gameObjectAnimator.SetTrigger ("ZoomOut");
yield return new WaitForSeconds (0.5f);
gameObj.SetActive (false);//当 timescale = 0 时代码不执行
}
yield 返回空;
}

该代码在大多数屏幕上都可以正常工作,但是当我使用 timescale = 0 暂停游戏时会出现问题。

当 timescale 为 0 时,gameObj.SetActive (false) 行不起作用。

最佳答案

我知道可能有点晚了,但是:

问题不在于 SetActive但是那个 WaitForSeconds si 受 Time.timeScale 影响!

The actual time suspended is equal to the given time multiplied by Time.timeScale. See WaitForSecondsRealtime if you wish to wait using unscaled time.



所以如果你有 Time.timescale=0 WaitForSeconds永远不会完成!

你应该使用 WaitForSecondsRealtime
private IEnumerator ToggleObjectWithAnimation (GameObject gameObj) 
{
Animator gameObjectAnimator = gameObj.GetComponent (); // Animator is set to unscaled time

if (gameObj.activeSelf == false)
{
gameObj.transform.localScale = new Vector3 (0, 0, 1.0f);
gameObj.SetActive (true);
gameObjectAnimator.SetTrigger ("ZoomIn");
yield return new WaitForSecondsRealtime(0.5f);
}
else if(gameObj.activeSelf == true)
{
gameObjectAnimator.SetTrigger ("ZoomOut");
yield return new WaitForSecondsRealtime(0.5f);
gameObj.SetActive (false); // code not execute when timescale = 0
}
yieldr eturn null;
}

关于c# - 受 timeScale 影响的协程 WaitForSeconds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36110448/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com