受 timeScale 影响的协程 WaitForSeconds

问题描述 投票:0回答:1

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

我有一个动画组件,它有两种不同的动画——放大和缩小。

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

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

我为动画写了以下方法:

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

代码在大多数屏幕上工作正常,但当我使用时间刻度 = 0 暂停游戏时显示问题。

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

c# unity3d coroutine
1个回答
10
投票

我知道这可能有点晚但是:

问题不是

SetActive
,而是
WaitForSeconds
Time.timeScale
的影响!

实际暂停时间等于给定时间乘以

Time.timeScale
。如果您想使用unscaled
时间等待,请参阅
WaitForSecondsRealtime

所以如果你有

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.