麦田物语学习笔记:构建游戏的时间系统
基本流程
1.代码思路
(1)新建一个TimeManager.cs
(2)创建枚举变量来表示四季,在TimeManager里需要的变量有: 游戏内的秒,分钟,小时,天,月,年;游戏内的季节;控制一个季节有多少个月;控制时间的暂停;计时器tikTime
(3)在Settings里添加计时器的阈值,以及各个时间的进位
(4)初始化各个时间单位以及实现更新游戏时间的逻辑
2.代码实现
新增枚举类
public enum Season
{
春, 夏, 秋, 冬
}
TimeManager.cs
public class TimeManager : MonoBehaviour
{
private int gameSecond,gameMinute,gameHour,gameDay,gameMonth,gameYear;
private Season gameSeason = Season.春;
private int monthInSeason = 3;
public bool gameClockPause;
private float tikTime;
private void Awake()
{
NewGameTime();
}
private void Update()
{
if (!gameClockPause)
{
tikTime += Time.deltaTime;
if (tikTime >= Settings.secondThreshold)
{
tikTime -= Settings.secondThreshold;
UpdateGameTime();
}
}
}
private void NewGameTime()
{
gameSecond = 0;
gameMinute = 0;
gameHour = 8;
gameDay = 1;
gameMonth = 1;
gameYear = 2025;
gameSeason = Season.春;
}
private void UpdateGameTime()
{
gameSecond++;
if (gameSecond > Settings.secondHold)
{
gameMinute++;
gameSecond = 0;
if (gameMinute > Settings.minuteHold)
{
gameHour++;
gameMinute = 0;
if (gameHour > Settings.hourHold)
{
gameDay++;
gameHour = 0;
if (gameDay > Settings.dayHold)
{
gameMonth++;
gameDay = 1;
if (gameMonth > 12)
{
gameMonth = 1;
}
monthInSeason--;
if (monthInSeason == 0)
{
monthInSeason = 3;
int seasonNumber = (int)gameSeason;
seasonNumber++;
if (seasonNumber > Settings.seasonHold)
{
gameYear++;
seasonNumber = 0;
}
gameSeason = (Season) seasonNumber;
if (gameYear > 9999)
{
gameYear = 2025;
}
}
}
}
}
}
Debug.Log("Second: " + gameSecond + "Minte: " + gameMinute);
}
}
Settings中新增变量
//时间相关
//阈值越小,速度越快,用计时器,只要满足这个阈值,秒数就加1
public const float secondThreshold = 0.1f;
public const int secondHold = 59;
public const int minuteHold = 59;
public const int hourHold = 23;
public const int dayHold = 10;
public const int seasonHold = 3;
最终效果
注意到59秒后进1分钟
补充知识点
1.update里的帧数是不受时间控制的,而是看计算机运算的速度
Update
函数的调用机制:Update
函数是 Unity 中的一个核心函数,它会在每一帧被调用一次。当游戏运行时,Unity 会不断地渲染新的帧,每渲染一帧,就会调用一次Update
函数。然而,这个渲染帧的速度并不是固定的。- 计算机的性能会对渲染帧的速度产生影响。例如,一台高性能的计算机可能每秒能够渲染 60 帧甚至更多,而一台性能较低的计算机可能每秒只能渲染 30 帧或更少。这意味着在高性能计算机上,
Update
函数会在一秒内被调用 60 次或更多次,而在低性能计算机上,Update
函数在一秒内可能只会被调用 30 次左右。
不依赖时间的调用频率:
Update
函数的调用频率并不直接取决于时间的流逝,而是取决于 Unity 引擎完成一帧渲染所需的时间。如果渲染一帧的过程很快(计算机性能好),Update
函数就会被频繁调用;如果渲染一帧的过程很慢(计算机性能差),Update
函数的调用频率就会降低。
解决方法
- 使用
Time.deltaTime
进行时间补偿:- 为了避免
Update
函数调用频率的不稳定性对游戏逻辑的影响,我们可以使用Time.deltaTime
。
- 为了避免
2.Time.deltaTime
Time.deltaTime
表示自上一帧更新以来的时间间隔,单位是秒。