timeScale = 0的Unity 3D CustomDebugger无法停止FixedUpdate

时间:2018-07-09 01:09:33

标签: unity3d

制作一个调试器,该调试器在场景播放时按按钮启动。调试正确后,游戏需要在代码中调用DebugStep的功能完全停下来,然后从该位置继续。这是我的脚本,附加在画布按钮上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ToggleDebugButton : MonoBehaviour {

//private TimeDebugger timeDebugger;

[Header("Debugger")]
public bool isDebugging;
public string debugStep;

[Header("Basic Properties")]
public bool isMoving;
public bool isAttacking;
public bool isSwinging;
private BasicProperties basicProperties;

void Start()
{
    basicProperties = GameObject.Find("MrPresident").GetComponent<BasicProperties>();
    isDebugging = false;
    GetComponent<Button>().onClick.AddListener(TogglePause);
}
public void TogglePause()
{
    isDebugging = !isDebugging;
    if ( !isDebugging )
    {
        Time.timeScale = 1f;
    }  
}

public void FixedUpdate()
{
    DebugStep("DebugUpdateEnd");
}

public void DebugStep(string source)
{
    if (isDebugging)
    {
        isMoving = basicProperties.isMoving;
        isAttacking = basicProperties.isAttacking;
        isSwinging = basicProperties.isSwinging;

        debugStep = source;
        print("start set timescale 0");
        Time.timeScale = 0f;
        print("end set timescale 0");
    }
}

}

问题在于,即使在FixedUpdate中将Debug设置为0后,在FixedUpdate中调用DebugStep时,也会执行第一个打印语句和第二个打印语句。当我尝试从其他脚本的FixedUpdate内部调用DebugStep时,这是一个更大的问题,我希望在DebugStep调用之后暂停整个FixedUpdate脚本,然后在我取消暂停时从该点开始。

我不认为这是会发生的,因为当我将2个DebugStep调用放置在FixedUpdate中的其他位置时,当timeScale应该设置为0并在第一次打电话。我认为,即使在脚本中间将timeScale设置为0时,所有脚本中属于当前FixedUpdate周期的所有FixedUpdates也会完成。我对么?实际上,我真的不确定,因为如果我在FixedUpdate中对DebugStep进行了2次以上的调用,则游戏每个周期只会停止一次

是否可以更改此设置,以使游戏在Timescale = 0时完全停止,然后在我将Timescale设置回1时从该确切点恢复?谢谢

1 个答案:

答案 0 :(得分:0)

您的代码正常运行,应该如何工作。

来自docs:“ timeScale影响Time类的所有时间和增量时间测量变量。”

此外,它影响Update,Lateupdate和fixedupdate方法的调用次数。

它不会影响代码执行的“速度”。

因此,当您输入更新方法并更改时间范围时,您只会在退出更新循环后才注意到结果。它不会像您期望/希望的那样神奇地在更新功能内停止。

如果希望在继续某些代码块之前等待特定功能完成,则可能要使用coroutines