制作一个调试器,该调试器在场景播放时按按钮启动。调试正确后,游戏需要在代码中调用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时从该确切点恢复?谢谢
答案 0 :(得分:0)
您的代码正常运行,应该如何工作。
来自docs:“ timeScale影响Time类的所有时间和增量时间测量变量。”
此外,它影响Update,Lateupdate和fixedupdate方法的调用次数。
它不会影响代码执行的“速度”。
因此,当您输入更新方法并更改时间范围时,您只会在退出更新循环后才注意到结果。它不会像您期望/希望的那样神奇地在更新功能内停止。
如果希望在继续某些代码块之前等待特定功能完成,则可能要使用coroutines。