You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中除调整Time.timescale外,是否有其他实现暂停的方式?

无需修改Time.timescale的Unity暂停实现方法

下面是几种不用调整Time.timescale的暂停方案,适合需要保留真实时间(比如UI动画、后台计时)的场景:

1. 自定义时间变量管控游戏逻辑

自己维护一个全局的时间缩放变量,让所有受暂停影响的游戏逻辑都基于这个变量计算时间增量,而非直接用Time.deltaTime。

示例代码:

// 在GameManager中定义全局变量
public class GameManager : MonoBehaviour
{
    public static GameManager Instance;
    public float gameTimeScale = 1f;

    void Awake()
    {
        Instance = this;
    }
}

// 在玩家控制器中使用自定义时间变量
public class PlayerController : MonoBehaviour
{
    void Update()
    {
        float deltaTime = Time.deltaTime * GameManager.Instance.gameTimeScale;
        // 用deltaTime处理移动、转向等逻辑
        transform.Translate(Vector3.forward * deltaTime * 5f);
    }
}

暂停时只需将gameTimeScale设为0,恢复时设为1即可。同时别忘了同步调整动画、粒子系统的速度:

// 控制动画速度
GetComponent<Animator>().speed = GameManager.Instance.gameTimeScale;
// 控制粒子系统
GetComponent<ParticleSystem>().main.simulationSpeed = GameManager.Instance.gameTimeScale;

2. 批量启用/禁用游戏逻辑组件

把所有负责核心游戏逻辑的组件(比如AI控制器、玩家输入脚本、物理驱动脚本)归类,暂停时直接禁用这些组件,恢复时重新启用。

示例代码:

public class GameManager : MonoBehaviour
{
    public List<MonoBehaviour> gameLogicComponents; // 在Inspector中添加所有逻辑组件

    public void PauseGame()
    {
        foreach (var comp in gameLogicComponents)
        {
            comp.enabled = false;
        }
    }

    public void ResumeGame()
    {
        foreach (var comp in gameLogicComponents)
        {
            comp.enabled = true;
        }
    }
}

这种方法简单直接,但要注意组件禁用后不会保存临时状态(比如敌人的移动方向),如果需要保留状态,得提前在禁用前做数据缓存。

3. 基于状态机的流程控制

定义游戏状态枚举,所有游戏逻辑在执行前先判断当前状态,非运行状态则跳过逻辑执行。

示例代码:

public enum GameState
{
    Running,
    Paused,
    GameOver
}

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;
    public GameState CurrentState = GameState.Running;

    void Awake()
    {
        Instance = this;
    }
}

// 在敌人AI中判断状态
public class EnemyAI : MonoBehaviour
{
    void Update()
    {
        if (GameManager.Instance.CurrentState != GameState.Running)
            return;

        // 执行AI巡逻、追击等逻辑
    }
}

这种方法结构清晰,适合中大型项目,能灵活扩展不同游戏状态的处理逻辑。

4. 暂停物理模拟

如果游戏依赖Unity物理系统,可直接关闭物理自动模拟来暂停刚体运动,恢复时重新开启。

示例代码:

// 暂停物理(3D)
Physics.autoSimulation = false;
// 暂停2D物理
Physics2D.autoSimulation = false;

// 恢复物理
Physics.autoSimulation = true;
Physics2D.autoSimulation = true;

注意:物理暂停只会影响刚体、碰撞检测等物理相关逻辑,非物理驱动的动画、UI逻辑不受影响,需要单独处理。

额外注意:音频处理

Time.timescale不影响音频播放,所以暂停时如果需要静音或暂停音频,要单独控制:

// 全局暂停音频
AudioListener.pause = true;
// 或单独控制某个音频源
GetComponent<AudioSource>().Pause();

内容的提问来源于stack exchange,提问作者yujinkim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 20:25:26