前言
本篇实现的效果是在游戏运行后能够记录当前的游戏时间(年月日时分秒),并且可以通过修改变量从而改变游戏时间进行的快慢。
效果
步骤
1. 在Blueprints文件夹中新建如下两个文件夹,分别命名为“GameSettings”、“Player”
将“RTS_CameraPawn_BP”和“RTS_PlayerController_BP”移动到“Player”文件夹中
将“RTS_GameModeBase_BP”移动到“GameSettings”文件夹中
新建一个游戏状态基础
命名为“RTS_GameState_BP”
新建一个文件夹,命名为“Library”
在该文件夹中新添加一个蓝图函数库
命名为“RTS_FuncLib”
再添加一个蓝图接口
命名为“RTS_GameTime_IF”
2. 打开蓝图函数库“RTS_FuncLib”,重命名新函数为“SetGameTime”
添加三个输入和两个输出,分别命名为“DeltaTime”、“GameSpeed”、“InitialGameTime”、“GameTime”、“DayCount”
添加如下节点
3. 打开蓝图接口“RTS_GameTime_IF”,将新函数重命名为“UpdateGameSpeed”
添加一个输入,命名为“SpeedMultiplier”,浮点类型
4. 打开游戏状态基础“RTS_GameState_BP”,新建一个宏,命名为“ReferneceCasts”
在宏中添加如下节点来获取玩家控制器“RTS_PlayerController_BP”的引用,其中变量“ControllerRef”是类型转换后引脚“As RTS Player Controller BP”提升为的变量。
在事件图表中添加如下节点来执行宏
每一帧执行蓝图函数库中的创建的函数“SetGameTime”
将引脚“GameSpeed”和“InitialGameTime”提升为变量,然后命名为“GameSpeed”和“GameTime”,默认值分别为150、0
新添加一个整型变量,命名为“DayCounter”
设置“GameTime”和“DayCounter”
添加如下三个整型变量,分别命名为“Hours”、“Minutes”、“Seconds” ,均为公有变量,这个变量用于表示当前的游戏时间。其中,“Hour”的默认值设置为11,表示游戏一开始游戏处于中午。
在游戏开始时,根据时分秒设置初始的游戏时间(单位:小时)
再添加三个整型变量,分别命名为“Year”、“Month”、“Day”,用于表示当前的游戏日期,均为公有变量,这里默认值分别设置为2023、8、10
添加一个整型数组类型变量,命名为“GameDate”
在设置初始游戏时间后继续设置初始游戏日期
新建一个浮点型变量,命名为“DefaultGameSpeed”,默认值设为150
设置初始游戏速度:
新建一个函数,命名为“SetClock”
该函数逻辑如下:
再添加一个函数,命名为“SetCalendar”
函数逻辑如下:
再事件图表中去调用这两个函数
在类设置中添加蓝图接口“RTS_GameTime_IF”
新添加一个浮点型变量,命名为“SpeedMutiplier”,默认值设为1
在事件图表中添加如下节点
添加一个事件调度器,命名为“GameSpeedControl”
添加一个浮点类型输入,命名为“GameTime”
调用该事件调度器
5. 打开游戏模式基础“RTS_GameModeBase_BP”,设置游戏状态类为“RTS_GameState_BP”
此时运行游戏可以看到视口左上角打印的年月日时分秒,如下所示:
如果想加快游戏时间,可以将游戏状态“RTS_GameState_BP”中的变量“DefaultGameSpeed”的默认值设置小一点。
比如我把变量“DefaultGameSpeed”的默认值设置为0.025,游戏时间就加快了:
变量“DefaultGameSpeed”控制着现实时间和游戏时间的换算关系:
如果 “DefaultGameSpeed”的默认值设置为3600,就表示现实时间和游戏时间完全同步;
如果 “DefaultGameSpeed”的默认值设置为150,就表示现实中的1小时=游戏中的1天;
如果 “DefaultGameSpeed”的默认值设置为2.5,就表示现实中的1分钟=游戏中的1天;