如何在 Godot 中实现昼夜循环

晝夜交替的循環能夠為您的遊戲注入更深層的沉浸感,它不僅能豐富視覺上的多樣性,更能催生出許多饒富趣味的遊戲機制。《我的世界》、《動物森友會》以及《飢荒》等知名遊戲都巧妙地運用了這種技術。若您的遊戲中含有即時運算的元素,不妨考慮也加入這個設計。

值得慶幸的是,在 Godot 4 中,要實現晝夜循環比以往任何時候都來得更加便捷。

設定 Godot 遊戲專案

在深入探討晝夜循環的實作之前,請先為您的遊戲奠定穩固的基礎。 首先,在 Godot 4 中建立一個全新的 2D 專案,並設定好必要的專案配置。

本文所使用的程式碼可以在這個 GitHub 儲存庫 中找到,並且是以 MIT 許可免費釋出的。

接著,創建一個玩家角色。 在您的場景中加入一個 CharacterBody2D 節點,並在其中添加一個具有矩形外型的 CollisionShape2D 和一個 Sprite2D。 這將作為您角色的視覺化呈現。

若要讓玩家能夠移動,您可以使用以下的 GDScript 程式碼。 將此腳本附加到您的角色節點:

 extends CharacterBody2D

var speed = 300

func _physics_process(delta):
    var input_dir = Vector2.ZERO

    if Input.is_action_pressed("ui_left"):
        input_dir.x -= 1

    if Input.is_action_pressed("ui_right"):
        input_dir.x += 1

    if Input.is_action_pressed("ui_up"):
        input_dir.y -= 1

    if Input.is_action_pressed("ui_down"):
        input_dir.y += 1

    velocity = input_dir.normalized() * speed
    move_and_collide(velocity * delta)

這段程式碼將允許玩家透過方向鍵來向左、向右、向上和向下移動。 您也可以添加一些敵人讓玩家閃躲。針對這些敵人,請使用 StaticBody2D 節點,並據此調整它們的形狀與位置。

添加晝夜循環的計時器

要建立晝夜循環,您需要一個能夠持續運作的計時器,在白天和夜晚之間交替。 這個計時器將負責追蹤遊戲中時間的流逝。

請將計時器節點添加到您的 Godot 場景中。 您可以透過在「場景」面板上點擊右鍵,選擇「新增節點」,接著在節點庫中搜尋「計時器」來完成此動作。

為了保持清晰,請將 Timer 節點重新命名為具有意義的名稱,像是 DayNightTimer。在檢查器面板中配置計時器節點的屬性。 特別是將「等待時間」屬性設定為 0(這是計時器啟動前的初始延遲),並勾選「單次」屬性,以便讓計時器重複運作。

現在,添加用於管理晝夜循環的 GDScript 程式碼:

 extends Node2D

var day_duration = 30
var night_duration = 30

var is_day = true

func _ready():
    
    $DayNightTimer.start()

func _on_DayNightTimer_timeout():
    if is_day:
        
        $DayNightTimer.start(day_duration)
        is_day = false

        
    else:
        
        $DayNightTimer.start(night_duration)
        is_day = true

        

在 _ready 函數中,當場景載入時啟動 DayNightTimer,以開始晝夜循環。 _on_DayNightTimer_timeout 函數會在每次計時器歸零時執行(也就是在白天和夜晚之間轉換的時間點)。

透過執行這些步驟,您將擁有一個實用的晝夜計時器,可以在白天和黑夜之間轉換,讓您能夠根據一天中的時間,為您的 Godot 遊戲加入動態的遊戲元素與視覺變化。

調整白天和夜晚的背景

為了配合您的晝夜循環,您需要一種方法來視覺化地呈現白天和黑夜之間的過渡。 您可以使用內建的 ColorRect 節點來創建適合白天和夜晚的背景。 這種方法可以實現更平滑的轉換,並更好地控制視覺效果。

在 Godot 場景中,新增一個 ColorRect 節點。 這個節點將作為您的背景,透過改變顏色來呈現白天和黑夜。 將 ColorRect 節點重新命名為具有意義的名稱,像是 BackgroundRect。 將其放置在背景圖層,確保它覆蓋整個視口。

在「檢查器」面板中,將「顏色」屬性設定為初始的背景顏色,這個顏色應該代表白天。 例如,您可以使用 Color(0.5, 0.5, 0.8) 來表示淺藍色的白天天空。

現在,更新 GDScript 程式碼以使用 ColorRect 節點:

 func _on_day_night_timer_timeout():
    if is_day:
        
        $DayNightTimer.start(day_duration)
        is_day = false

        

        
        $BackgroundRect.color = Color(0.5, 0.5, 0.8)
    else:
        
        $DayNightTimer.start(night_duration)
        is_day = true

        

        
        $BackgroundRect.color = Color(0, 0, 0)

更新 BackgroundRect 節點的顏色,以反映一天中的時間。 例如,在過渡到夜間時將其設定為黑色,以創建深色的背景。 在過渡到白天時,將其設定為淺藍色。

晝夜循環的音效

音效對於增強 Godot 中晝夜循環的沉浸感和真實感來說,起著至關重要的作用。它們為玩家提供聽覺上的提示,使白天和夜晚的過渡更加引人入勝。 您可以輕易地為您的 Godot 遊戲添加音效。

在開始之前,請確保您擁有代表白天和夜晚聲音的音訊資源(聲音檔案)。 例如,白天可能會聽到鳥鳴聲,晚上可能會聽到蟋蟀或貓頭鷹的叫聲。

在您的 Godot 場景中,添加兩個 AudioStreamPlayer2D 節點,並適當地命名它們。 您可以將它們命名為 $DaytimeSounds 和 $NighttimeSounds。

現在,更新 GDScript 程式碼來管理白天和夜晚之間的聲音轉換:

 func _on_day_night_timer_timeout():
    if is_day:
        
        $DayNightTimer.start(day_duration)
        is_day = false
     
        
        $NighttimeSounds.stop()
        $DaytimeSounds.play()
         
    else:
        
        $DayNightTimer.start(night_duration)
        is_day = true

        
        $DaytimeSounds.stop()
        $NighttimeSounds.play()

當晝夜計時器逾時時,此程式碼會檢查應該轉換到哪個階段,並播放適當的聲音來匹配。

您可以自由地客製化您的無版權音效,以配合您遊戲的主題和氛圍。 您還可以疊加多個音軌,或使用音訊效果(例如混響、回音等等)來創造更豐富的聽覺體驗。

讓您的 Godot 遊戲透過晝夜循環更具吸引力

在 Godot 遊戲中實作晝夜循環,可以顯著地增強玩家的沉浸感和參與度。 它為您的遊戲世界增添了深度,引入了動態的遊戲元素,並允許創造性地講述故事。

請務必根據您遊戲獨特的主題和機制來客製化晝夜循環,並勇於嘗試不同的視覺和遊戲效果,以創造出真正引人入勝的遊戲體驗。