当前位置: 首页 > article >正文

麦田物语学习笔记:构建游戏的时间系统

基本流程

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 表示自上一帧更新以来的时间间隔,单位是秒。


http://www.kler.cn/a/506392.html

相关文章:

  • 【React】静态组件动态组件
  • 【Unity】unity3D 调用LoadSceneAsync 场景切换后比较暗 部门材质丢失
  • 【2024年华为OD机试】 (C卷,100分)- 用连续自然数之和来表达整数(Java JS PythonC/C++)
  • Spring 核心技术解析【纯干货版】- VIII:Spring 数据访问模块 Spring-Tx 模块精讲
  • CDP中的Hive3之Hive Metastore(HMS)
  • 【C】初阶数据结构3 -- 单链表
  • 常见链表专题相关算法
  • 网络是怎么样连接的--输入www.baidu.com之后网络的底层运行
  • ​HPM6700——以太网通信lwip_udpecho_freertos_socket
  • 《汽车维护与修理》是什么级别的期刊?是正规期刊吗?能评职称吗?
  • Hadoop图书数据分析系统 大屏数据展示 智能图书推荐系统(协同过滤余弦函数) 代码 数据库 全套开发工具
  • C++ 学习
  • AngularJs入门之创建最简单HelloWorld Demo应用
  • Java ee 文件操作和IO
  • python-leetcode-单词规律
  • C# OpenCV机器视觉:图片去水印
  • 自然语言处理(GloVe):原理、特点、应用、技术、相关学术分享
  • ASP.NET Core - .NET 6 以上版本的入口文件
  • Python 爬虫爬取京东商品信息 ||京东商品详情API
  • 记一次CentOS扩容boot升级内核版本
  • 告别烦恼:WiFi出现感叹号?快速恢复网络畅通指南
  • electron 如何申请 Mac 系统权限
  • 【Tortoise-ORM】 基础与数据库操作
  • 力扣-数组-228 汇总区间
  • c#-Halcon入门教程——标定
  • 【C语言】内存函数详解与模拟实现