天天看点

UE4学习之路【十】昼夜交替系统

之前利用时间轴实现了简易门开关过程的渐变,这次我学到了另外一种方法,就是利用FInterpTo函数,这个函数可以将传入的变量值按帧慢慢地修改,达到渐变的效果,不过今天我不再做门了,我要利用这个函数来制作一个简单的昼夜交替系统。

昼夜交替蓝图类

我们可以通过在世界蓝图中编辑结点来修改地图中DirectionLight、SkyLight和SkySphere的属性值,但是这样的话我们每切换一个场景,就要重新在当前世界蓝图中重新编辑一次。这会加大我们的工作量,所以我们创建一个昼夜交替蓝图类Day_Night并添加到地图中。我们在Day_Night中添加三个变量,变量类型分别为Direction Light、Sky Light和BP Sky Sphere,并将它们设置为public,然后与地图中的资源建立通信。

UE4学习之路【十】昼夜交替系统

昼夜交替函数

我们在Day_Night里添加两个函数Day_to_Night和Night_to_Day用来实现由白天到晚上和由晚上到白天的转换。

我们来编辑Day_to_Night,将DirectionLight的引用添加到蓝图中,获取它的灯光组件,然后通过SetIntensity函数来设置灯光的亮度,这里需要传入一个float类型的值,也就是我们需要设置的亮度。一开始说过了,我们要实现昼夜亮度的渐变效果,可以使用时间轴,但是这次我们使用FInterpTo函数。我们用GetIntensity函数来获取灯光组件当前亮度,连接FInterpTo函数的Current引脚,目标亮度可以对比默认天空亮度调低一些,插补速度调整为1.0,同时我们给Night_to_Day添加一个float型变量,用来从外部传入一个差值时间,也就是每一帧的时间,将这个引脚连接FInterpTo函数的DeltaTime,最后返回值传给SetIntensity函数,这样我们DirectionLight亮度的渐变效果就实现了。

UE4学习之路【十】昼夜交替系统

同理,我们可以实现SkyLight的亮度和SkySphere云的透明度的渐变

UE4学习之路【十】昼夜交替系统

接着我们复制一份Day_to_Night函数,修改部分参数后命名为Night_to_Day

昼夜交替的触发

首先我们将DirectionLight的Mobility属性设置为Movable,这表示它将成为可移动的对象,否则编译器会报错。

UE4学习之路【十】昼夜交替系统

要想触发昼夜交替,我们需要每一帧都进行操作,于是我们添加EventTick事件,在后面添加SetActorRelativeRotation函数,传入DirectionLight的引用并设定一个围绕y轴的变化值,这个数值将决定一个完整的昼夜交替所需时间。为了能时刻都显示天空球的状态,我们在后面添加一个UpdateSunDirection函数,传入SkySphere的引用,这个函数是SkySphere里的一个接口,每次触发可以刷新天空球的状态,到这里我们的平行光源就可以转动了。

UE4学习之路【十】昼夜交替系统
UE4学习之路【十】昼夜交替系统

接下来就是该调用我们自定义的函数的时候了,但是我们怎么判断什么时候该调用Day_to_Night,什么时候又该调用Night_to_Day呢,这里我们使用PrintString函数进行测试。我们先使用GetActorRotation函数获取平行光源围绕Y轴相对于默认位置旋转的值,然后传给PrintString函数打印在屏幕上,经过测试发现,当其值大于0的时候是晚上,小于0的时候是白天。

UE4学习之路【十】昼夜交替系统

所以我们将其值与0比较,传出一个布尔型变量,将这个变量传入一个分支结点,True则调用Night_to_Day,否则调用Day_to_Night。两个函数传入对象都是自己,最后我们使用GetWorldDeltaSeconds函数获取每一帧的时间差值传入自定义函数,函数将被成功调用。

UE4学习之路【十】昼夜交替系统

现在昼夜交替的时候我们天空的亮度、云的透明度都会渐变了

UE4学习之路【十】昼夜交替系统
UE4学习之路【十】昼夜交替系统

继续阅读