我正在为我的 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)这一行不起作用。
我知道这可能有点晚但是:
问题不是
SetActive
,而是WaitForSeconds
受Time.timeScale
的影响!
。如果您想使用unscaledTime.timeScale
时间等待,请参阅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;
}