如何在 Godot 中使用 RayCast2D 節點進行視線檢測
視線檢測通過一種讓角色或物體感知周圍環境的機制為您的遊戲增加了一層複雜性。您可以將此功能用於敵人 AI 行為、玩家可見性機制、潛行遊戲等等。
在 Godot 中,通過利用 RayCast2D 節點實現視線檢測既精簡又靈活。
設置戈多遊戲
要開始在 Godot 中使用 RayCast2D 節點,首先需要建立一個基本的二維遊戲環境。這包括創建一個能夠通過使用鍵盤輸入移動的玩家角色,以及角色與遊戲世界中的各種平台進行交互的能力。
為了開始在 Unity 中設計玩家角色,請按照下列步驟操作:1.通過在“項目”窗口中右鍵單擊並選擇“場景”來創建一個空場景。將其命名為“PlayerCharacter”或類似名稱。2。將新的遊戲對象拖到這個新創建的場景中的層次結構面板上。這將作為我們玩家角色的根對象。3。選擇根遊戲對像後,轉到檢查器面板並單擊底部的“添加組件”按鈕。從可用組件列表中,選擇“CharacterController2D”並單擊“添加”。該組件對於 Unity.4 中的任何 2D 角色移動都是必需的。接下來,將另一個 GameObject 從 Assets 面板拖到 Hierarchy 面板上。這次選擇預
隨附的代碼可以通過 GitHub 存儲庫訪問,該存儲庫充當開發人員與其他人共享工作的開源平台。這組特定的代碼是根據 MIT 許可證條款獲得許可的,從而授予用戶免費使用它的權限。
所提供的 GDScript 代碼與玩家移動相關,如其標題所示。它包含一個名為“move”的函數,該函數似乎負責根據用戶輸入和其他因素(例如跳躍和攀爬)處理角色的移動。該代碼還利用了水平和垂直速度、加速度、重力等變量。
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 組件來構造,該組件提供了用於定義對象形狀的各種選項。通過深思熟慮地安排這些元素,我們可以有效地為用戶創造身臨其境的平台體驗。
設置 RayCast2D
要利用 Unity3D 和 GDScript 將視線檢測合併到您的項目中,請按照以下步驟集成 Godot 引擎中的“Raycast2D”節點:
var raycast: RayCast2D
func _ready():
raycast = RayCast2D.new()
add_child(raycast)
確保將此腳本附加到
提供視線交互的視覺反饋
現在,當玩家的視軸與表面相交時,您可以通過從當前位置發出光束並將其指向其預期軌跡來生成通知。如果這條射線擊中一個實體,則意味著玩家能夠感知視野內的平台。
將上述代碼合併到現有腳本中,如下所示:
func _physics_process(delta):
# ... (previous movement code)
raycast.target_position = Vector2(100, 0)
if raycast.is_colliding():
print("Collided with platform!")
這是輸出:
擴展 RayCast2D 的功能
利用大量的創新功能對於將游戲中的交互性和復雜性提升到非凡的程度至關重要。
get_collider()
利用 get_collider() 函數可以檢索射線遇到的初始實體。如果光線軌跡內沒有物體,此方法將返回 null,這提供了有關玩家視線中是否存在障礙物的有價值的信息。
if raycast.is_colliding():
var collided_object = raycast.get_collider()
if collided_object:
print("You can see:", collided_object.name)
get_collider_rid()
get_collider_rid() 函數允許在碰撞檢測系統中檢索與第一個碰撞對象相對應的資源 ID (RID),從而在確定遊戲或其他交互式應用程序期間哪些對象發生接觸時提供有價值的信息。
if raycast.is_colliding():
var collider_rid = raycast.get_collider_rid()
if !collider_rid.is_valid():
print("No valid object RID")
else:
print("Object RID:", collider_rid)
get_collider_shape()
get_collider_shape() 函數檢索與初始重疊對象的幾何形式關聯的唯一標識符,如果沒有發生碰撞,則檢索零 (0)。
if raycast.is_colliding():
var collider_shape = raycast.get_collider_shape()
if collider_shape == 0:
print("No valid shape ID")
else:
print("Shape ID:", collider_shape)
get_collision_normal()
為了更深入地理解交互,利用 get_collision_normal() 函數提供碰撞點處對象的法線向量。當光線源自形狀內部並且滿足“hit_from_inside”條件時,此函數返回的法線將表示為“Vector2”實例,其 x 值為零,y 值為零。
if raycast.is_colliding():
var collision_normal = raycast.get_collision_normal()
print("Collision Normal:", collision_normal)
get_collision_point()
當遇到與之碰撞的對象時, get\_collision\_point() 函數精確確定全局定義的坐標系內發生碰撞的點。
if raycast.is_colliding():
var collision_point = raycast.get_collision_point()
print("Collision Point:", collision_point)
利用 RayCast2D 模塊的複雜功能,人們可以獲得有關場景中投影光束和障礙實體之間相互作用的寶貴理解。
利用這些技術可以獲取關鍵數據,這些數據有可能極大地影響遊戲機制、對象交互性和用戶體驗。
包括附加功能
除了基本的視線檢測功能之外,還可以通過結合更高級的功能來增強遊戲的動態元素。
事件觸發器
可以啟動特定的遊戲事件,而不是簡單地顯示通知。例如,揭示隱藏路線、激活機器或通知對手玩家的行踪都可以增強遊戲體驗。
動態障礙物處理
為了解決對視線的潛在干擾,必須採用一種機制來動態檢測可能妨礙視覺接收的任何障礙物。這樣,當物體進入或離開用戶的視野時,視線將能夠實時調整。
自定義視覺指示器
為了增強傳統的文本提示,人們可以開發定制的視覺信號,強調玩家和物體之間的視線連接。此類增強功能可能包括改變角色或物品精靈的色調、展示符號表示或激活與這些關係相關的動畫組件。
戰爭迷霧機制
為了增強策略類游戲的體驗,建議實施戰爭迷霧機制。這些機制限制了玩家的可見性,直到建立視線,從而逐步揭開遊戲世界並促進深思熟慮的戰略選擇。
視線檢測的最佳實踐
視線 (LOS) 檢測的優化對於確保無縫遊戲體驗至關重要,因為它有助於防止障礙物並確保玩家可以看到他們需要進行交互或有效導航的內容。遵循這些最佳實踐將幫助您實現這一目標:
光線投射頻率
除非絕對需要,否則不要在每次迭代中不斷執行光線投射。相反,僅當玩家的行踪或場景發生相當大的變化時才考慮檢查可見性。通過這樣做,您可以最大限度地減少不必要的計算並優化性能。
光線長度
通過調整光線投射的持續時間以僅覆蓋所需區域,而不會導致過多的計算,從而確保最佳性能。過度延伸的射線可能會對效率產生負面影響,因此在覆蓋範圍和計算負擔之間取得平衡非常重要。
碰撞層
利用碰撞層和遮罩來細化視線檢測所考慮的對象範圍,從而排除針對無關緊要實體的無關光線投射。
緩存結果
當對各種對像或連續幀內執行視線分析的多個實例時,建議將結果存儲在緩存中以防止不必要的計算。
平台級集成
通過考慮周圍環境的垂直度、不同的平台高度以及環境中任何可能影響視力的因素等因素,確保遊戲的視線檢測系統與其平台關卡設計保持一致。
確保您的檢測系統能夠考慮到遊戲中存在的微妙複雜性,以便為玩家提供輕鬆一致且用戶友好的體驗。
通過視線檢測讓 Godot 遊戲更具吸引力
視線檢測允許玩家根據自己的視覺視角以各種方式計劃、隱藏自己或處理障礙物,從而增強遊戲環境的深度和真實感。通過整合這一元素,開發人員可以將普通的平台遊戲轉變為更具吸引力和身臨其境的體驗,從而提高玩家的參與度並創造持久的記憶。