Unity对象活动状态在时间刻度0中不起作用

时间:2016-03-20 05:09:47

标签: c# unity3d

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

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

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

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

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

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 WaitForSeconds (0.5f);
        } else if(gameObj.activeSelf == true) {
            gameObjectAnimator.SetTrigger ("ZoomOut");
            yield return new WaitForSeconds (0.5f);
            gameObj.SetActive (false);   // code not execute when timescale = 0
        }
        yield return null;
}

对于大多数屏幕,代码工作正常,但是当我使用timescale = 0暂停游戏时显示问题。

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

1 个答案:

答案 0 :(得分:0)

我知道可能已经晚了,但是:

问题不是SetActive,而是WaitForSecondsTime.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;
}