Contents

如何在 Godot 中添加高效的碰撞檢測以實現流暢的遊戲體驗

碰撞檢測是遊戲開發的關鍵方面之一,顯著影響玩家體驗。準確的碰撞檢測可確保遊戲角色與其環境無縫交互,營造沉浸感和真實感。

Godot 是一款出色的開源遊戲引擎,提供強大的精確碰撞檢測功能,確保無縫且引人入勝的遊戲體驗。

設置戈多遊戲

在開始在 Godot 中創建更複雜的 2D 平台遊戲之前,建議從基本實現開始,其中包括玩家角色和平台作為遊戲環境的基礎。這一初始步驟將為構建進一步的功能和增強功能奠定堅實的基礎。

隨附的代碼可以通過 GitHub 存儲庫訪問,該存儲庫授予用戶根據 MIT 許可證條款免費使用它的權限。

此外,實例化一個“CharacterBody2D”對像作為場景中的根節點,並合併一個“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 實體將必要的平台元素合併到環境中,以實現全面的配置。

/bc/images/simple-collision-game-in-godot.jpg

不同的碰撞形狀

Godot 提供了一系列碰撞形狀,專為適合各種類型的遊戲實體而定制,以便精確描繪檢測到碰撞的區域。

重要的是要記住,通過將碰撞形狀直接附加到玩家角色,人們可以最精確地界定其碰撞區域的邊界。

圓形碰撞形狀

當以放射狀方式實現角色與其周圍環境之間的交互時,例如對於擁有圓形或球形碰撞盒的角色,圓形碰撞形狀可能是有利的。在玩家角色中合併圓形碰撞形狀的過程涉及幾個步驟,包括創建自定義腳本、向角色的身體添加組件、設置光線投射、定義接觸點以及根據碰撞調整移動邏輯。通過利用這些技術,遊戲開發人員可以為玩家創造更加身臨其境和互動的遊戲體驗。

 # Inside the player character's script
var collision_shape = CollisionShape2D.new()
var circle_shape = CircleShape2D.new()
circle_shape.radius = 32
collision_shape.shape = circle_shape
add_child(collision_shape) 

矩形碰撞形狀

矩形碰撞形狀特別適合具有更多棱角、盒狀或直線形體的角色模型。要將矩形碰撞形狀合併到 Unity 項目中,請按照下列步驟操作:

 # Inside the player character's script
var collision_shape = CollisionShape2D.new()
var rect_shape = RectangleShape2D.new()
rect_shape.extents = Vector2(32, 64)
collision_shape.shape = rect_shape
add_child(collision_shape) 

凸多邊形碰撞形狀

利用凸多邊形碰撞形狀為表現出不規則或非直線配置的角色提供了高度的多功能性。這種形式非常適合近似個人輪廓的輪廓。合併此類配置需要執行以下步驟:

 # Inside the player character's script
var collision_shape = CollisionShape2D.new()
var polygon_shape = ConvexPolygonShape2D.new()
polygon_shape.set_points([Vector2(-32,-64), Vector2(32,-64), Vector2(0, 64)])
collision_shape.shape = polygon_shape
add_child(collision_shape) 

利用合適的碰撞形式並將其粘貼到玩家的虛擬形像上,可以精確檢測指定區域內的碰撞,從而提高遊戲玩家與虛擬環境之間交互的精度。

檢測碰撞

對象之間的衝突檢測是交互元素和遊戲機制實現中的一個關鍵方面。在 Godot 中,物理引擎的結合可以實現這種碰撞檢測。

 # Detecting Collisions in _physics_process
func _physics_process(delta):
    var input_dir = Vector2.ZERO
    # ... (input handling)

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

    if collision:
        print("collided") 

下面是輸出:

/bc/images/collision-in-godot.jpg

碰撞信號和碰撞掩模

Godot 提供了碰撞信號和碰撞遮罩等高級功能,可用於增強遊戲中對象之間交互的複雜性。

碰撞信號

碰撞信號代表對象之間的事件驅動的通信機制,其中物理交互觸發信號的發射。通過連接到這些信號,人們可以在戈多物理系統的背景下對發生的特定碰撞實例實施定制的反應。

為了響應主角與可收集物體接觸而產生音頻提示,可以利用碰撞信號,如下所示:

 # Inside the player character's script
func _ready():
    connect("body_entered", self, "_on_body_entered")

func _on_body_entered(body: Node):
    if body.is_in_group("collectible"):
        # Play a sound effect
        play_collectible_sound()

        # Perform additional logic like collecting the item

        # Remove the collectible from the scene
        body.queue_free() 

在此演示中,當玩家角色與另一個物理實體接觸時,會觸發“body_entered”信號。通過利用“_on_body_entered”方法,人們可以對碰撞的發生做出反應。如果撞擊物體屬於“收藏品”組,則可能會播放未經許可的音頻效果。

碰撞遮罩

碰撞掩模能夠調節哪些碰撞層能夠相互連接。此類掩碼的存在由稱為位掩碼的按位運算中的位表示。通過將這些掩模應用於各個元件,可以細化所述元件之間的交互水平,從而優化整體系統效率。

考慮這樣一種場景,其中一個人的數字遊戲中有對手和射彈。目標是讓這些對手在不互相干擾的情況下衝擊平台,同時確保射彈僅與對手接觸,而不與平台接觸。通過利用碰撞掩模來實現這一目標的方法包括以下步驟:

 # Inside the enemy's script
func _ready():
    # Disable collision with other enemies
    set_collision_mask_value(2, false)
    
    # Enable collision with platforms
    set_collision_mask_value(3, true)

# Inside the bullet's script
func _ready():
    # Enable collision with enemies
    set_collision_mask_value(2, true)

    # Disable collision with platforms
    set_collision_mask_value(3, false) 

碰撞遮罩是控制遊戲對象之間碰撞的強大工具。通過有選擇地啟用或禁用這些遮罩,開發人員可以精確控制哪些對象可以相互交互,從而產生更真實且計算效率更高的碰撞。

碰撞檢測的最佳實踐

為了保證無縫的遊戲體驗和有效的碰撞檢測,建議遵循這些推薦的方法。

使用簡單的形狀

利用複雜的碰撞形式可能需要大量的計算資源。在可行的情況下,建議採用基本幾何配置(例如圓形或矩形輪廓)來檢測碰撞。

圖層碰撞遮罩

Godot 提供了一種定義碰撞層和遮罩的機制,使您能夠調節哪些對象相互交互以優化性能。

在平台遊戲中,玩家角色能夠執行各種動作,例如跳上平台和沿著牆壁滑動。為了促進這些交互,開發人員利用碰撞層和掩模來創建特定的結果。

碰撞組

將具有可比碰撞特徵的對象分組在一起可以促進更有效的組織,並通過簡化識別給定數據集中重疊或交叉元素的過程來實現優化的碰撞檢測。

邊界框

為了優化性能,可以利用邊界框通過不太複雜的碰撞檢測過程來快速確定對像是否非常接近,而不是採用更精確的碰撞檢查方法。

使用運動學查詢

Godot 提供了一種稱為運動學查詢的功能,它允許在不物理操縱對象位置的情況下進行碰撞檢測。這對於在潛在碰撞發生之前進行預測是有利的。

通過碰撞檢測讓 Godot 遊戲更具吸引力

在 Godot 遊戲中集成有效的碰撞檢測系統不僅保證了屏幕上的角色與其周圍環境之間的順暢交互,而且還為創造性的遊戲動態提供了可能性。

碰撞檢測在通過平台挑戰、謎題和戰斗場景等各種遊戲機制增強玩家參與度方面發揮著不可或缺的作用。碰撞檢測的實施有助於實現無縫且響應靈敏的交互,這對於創建身臨其境的遊戲體驗至關重要。