Unity 3D CustomDebugger with timeScale = 0 不停止 FixedUpdate

Posted

技术标签:

【中文标题】Unity 3D CustomDebugger with timeScale = 0 不停止 FixedUpdate【英文标题】:Unity 3D CustomDebugger with timeScale = 0 not stopping FixedUpdate 【发布时间】:2018-07-09 01:09:33 【问题描述】:

制作一个调试器,在播放场景时按下按钮即可启动。一旦调试为真,游戏需要在代码中调用一个名为 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 中调用 DebugStep 时,第一个打印语句和第二个打印语句会执行,即使它们之间的时间刻度已设置为 0。当我尝试从其他脚本中的 FixedUpdate 内部调用 DebugStep 时,这是一个更大的问题,我希望在 DebugStep 调用之后暂停整个 FixedUpdate 脚本,然后在我取消暂停时从该点继续。

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

有没有办法改变这一点,让游戏在 Timescale = 0 时完全停止,然后在我将 Timescale 设置回 1 时从那个确切的点恢复?谢谢

【问题讨论】:

【参考方案1】:

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

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

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

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

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

如果您希望等待特定功能完成后再继续执行某个代码块,您可能需要使用coroutines。

【讨论】:

以上是关于Unity 3D CustomDebugger with timeScale = 0 不停止 FixedUpdate的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D 中 用quaternion 来对一个坐标点进行旋转的初步体会

Unity3D初学心得

Unity3D---快捷键

Unity3D之笛卡尔坐标系转换——屏幕坐标转换世界坐标,世界坐标转换相机坐标工具

Unity3D之笛卡尔坐标系转换——屏幕坐标转换世界坐标,世界坐标转换相机坐标工具

在 WPF 应用程序中嵌入 Unity3D 应用程序