天天看點

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學習之路【十】晝夜交替系統

繼續閱讀