unity入门:记录每局游戏时间

发布于:2025-09-12 ⋅ 阅读:(16) ⋅ 点赞:(0)

1. 使用 Time.time(受 Time.timeScale 影响)

Time.time 表示从游戏开始到当前帧所经过的时间(秒),它会受到 Time.timeScale 的影响(例如游戏暂停时时间停止增加),代码如下。

using UnityEngine;

public class GameTimeTracker : MonoBehaviour
{
    private float startTime; // 记录本局开始的时间
    private float currentLevelTime; // 存储本局已进行的时间

    void Start()
    {
        // 在每一局开始时记录开始时间
        startTime = Time.time;
    }

    void Update()
    {
        // 计算本局已经进行的时间(受timeScale影响)
        currentLevelTime = Time.time - startTime;
        // 你可以用这个值更新UI或者做其他逻辑判断
        // Debug.Log("本局已进行时间: " + currentLevelTime.ToString("F2") + " 秒");
    }

    // 提供一个方法来获取本局总时间
    public float GetCurrentLevelTime()
    {
        return currentLevelTime;
    }

    // 在下一局开始前或者本局结束时,可以调用ResetLevelTime重置时间
    public void ResetLevelTime()
    {
        startTime = Time.time;
        currentLevelTime = 0f;
    }
}

2. 使用 Time.realtimeSinceStartup(不受 Time.timeScale 影响)

如果你希望游戏时间即使游戏暂停(Time.timeScale = 0)也能继续计时,可以使用 Time.realtimeSinceStartup。它表示自游戏启动以来的真实时间,代码如下。

using UnityEngine;

public class RealTimeGameTimeTracker : MonoBehaviour
{
    private float startRealTime; // 记录本局开始的真实时间
    private float currentLevelRealTime; // 存储本局已进行的真实时间

    void Start()
    {
        // 在每一局开始时记录开始的真实时间
        startRealTime = Time.realtimeSinceStartup;
    }

    void Update()
    {
        // 计算本局已经进行的真实时间(不受timeScale影响)
        currentLevelRealTime = Time.realtimeSinceStartup - startRealTime;
        // Debug.Log("本局已进行的真实时间: " + currentLevelRealTime.ToString("F2") + " 秒");
    }

    public float GetCurrentLevelRealTime()
    {
        return currentLevelRealTime;
    }

    public void ResetLevelRealTime()
    {
        startRealTime = Time.realtimeSinceStartup;
        currentLevelRealTime = 0f;
    }
}

3. 使用 Time.deltaTime 累计

你也可以在 Update 中通过累计 Time.deltaTime(上一帧到当前帧的时间间隔)来计算总时间。这种方式同样受 Time.timeScale 影响,代码如下。

using UnityEngine;

public class CumulativeTimeTracker : MonoBehaviour
{
    private float totalLevelTime; // 累计本局时间

    void OnEnable()
    {
        // 重置累计时间
        totalLevelTime = 0f;
    }

    void Update()
    {
        // 每帧增加增量时间
        totalLevelTime += Time.deltaTime;
        // Debug.Log("本局累计时间: " + totalLevelTime.ToString("F2") + " 秒");
    }

    public float GetTotalLevelTime()
    {
        return totalLevelTime;
    }

    public void ResetTotalLevelTime()
    {
        totalLevelTime = 0f;
    }
}

将currentLevelTime(秒数)转换为小时、分钟、秒的格式

代码如下:

// 最简单的转换方法
string formattedTime = TimeSpan.FromSeconds(currentLevelTime).ToString(@"hh\:mm\:ss");

网站公告

今日签到

点亮在社区的每一天
去签到