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

news/2025/1/17 23:23:40/

基本流程

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.ppmy.cn/news/1564001.html

相关文章

php基本数据结构

数据结构 数组:包含了Java的数组、列表list、Map结构 类比Java 数组:$phpArray [1,2,3,4];list: $phpList ["name","age","phone"];Map: $phpMap ["name">"1" , "age">"2…

【自然语言处理】BERT系列模型-详解

一、BERT模型介绍 思考题:Bert模型的架构以及每一部分的作用? 思考题:Bert模型两大预训练任务,并谈一谈你的理解? 1 BERT简介 BERT是2018年10月由Google AI研究院提出的一种预训练模型. BERT的全称是Bidirectional En…

react中,如何使用antd的Row栅格系统使元素左对齐

页面展示 元素结构 代码 const handleFormItem (item, index) > {if (item.type date) {return (<RangePickerformat"YYYY-MM-DD HH:mm:ss"style{{ width: 100% }}showTime{{hideDisabledOptions: true,defaultValue: [dayjs(00:00:00, HH:mm:ss), dayjs(2…

springboot 利用html模版导出word

1.maven配置 <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.32</version></dependency> 2.控制层业务代码 GetMapping("/exportConstructionLogDocx") ApiOper…

2024年合肥市科普日小学组市赛第一题题解

9304&#xff1a;数字加密&#xff08;encrypt&#xff09;(1) 【问题描述】 在信息科技课堂上&#xff0c;小肥正在思考“数字加密”实验项目。项目需要加密n个正整数&#xff0c;对每一个正整数x加密的规则是&#xff0c;将x的每一位数字都替换为x的最大数字。例如&#xff0…

代码随想录算法训练营Day48 | 图论理论基础、深搜理论基础、98. 所有可达路径、广搜理论基础

文章目录 图论理论基础深搜理论基础98. 所有可达路径思路与重点 广搜理论基础 图论理论基础 讲解链接&#xff1a;代码随想录 深搜理论基础 讲解链接&#xff1a;代码随想录 98. 所有可达路径 题目链接&#xff1a;98. 所有可达路径讲解链接&#xff1a;代码随想录状态&am…

怎么抓取IOS手机app的网络流量,也就是iphone手机抓包

继续昨天的教程&#xff0c;如抓取ios手机上的https请求。今天介绍如何在抓取iphone手机上的非https请求 也就是socket通信的数据。如果在pc上我们会第一时间讲到wireshark&#xff0c;但是对移动设备&#xff0c;似乎就要复杂很多。最近研究发现的工具嗅探大师&#xff0c;能…

2025 年将是统一网络安全的一年

到 2025 年&#xff0c;网络安全将不再只是 IT 团队专属的技术主题&#xff0c;而是将日益成为董事会层面的优先事项。随着网络攻击的频率和严重性不断增加&#xff0c;董事会将需要能够让他们了解组织安全状况的平台。 Armis 首席执行官 Yevgeny Dibrov 认为&#xff0c;统一网…