Godot-金幣

Area2D

在 Godot 中,Area2D 是一個 2D 物理節點,用來偵測碰撞區域內的物件觸發事件,但它本身不會受物理力影響
可以想像成一個「看不見的感應區」,專門用來檢測其他物體進入、離開或在裡面停留。

主要用途

  • 感應進入/離開事件(例如敵人進入攻擊範圍)
  • 觸發特效(玩家踩到陷阱)
  • 收集道具(玩家碰到寶箱、硬幣)
  • 偵測子彈擊中

當把coin基本動畫與碰撞設定好之後,就要開始寫”當玩家碰到錢幣後的事件”腳本。

在新建腳本時

樣板有分為 Node: Default 與 Object: Empty

因為是節點上的腳本,所以要選 Node。

Node: Default 與 Object: Empty 差別

Node: Default

性質:Godot 中所有場景的基礎單位,屬於場景樹的一部分。

特點

  • 可以掛在場景樹(Scene Tree)上
  • 能接收 _process()_ready() 等事件
  • 能有子節點

使用時機

  • 需要放到場景裡執行邏輯
  • 要管理其他節點(父子關係)
  • 要跟 Godot 的生命週期互動

例子:遊戲中的管理器、可見物件的基底、AI 控制器等。

Object: Empty

  • 性質:Godot 最基礎的類型,比 Node 還低一層,不屬於場景樹。
  • 特點
    • 沒有位置、縮放、旋轉
    • 不會自動執行 _process()(除非手動連接計時器或訊號)
    • 不能有子節點
  • 使用時機
    • 純資料結構(類似 C++/Python 的物件)
    • 背後運行的工具類、算法類
    • 與場景樹無關的邏輯
  • 例子:數據存儲類、演算法運算器、網路封包解析器。

Node: Default → 「舞台上的演員」:站在舞台(場景樹)上,可以互動、被看到。

Object: Empty → 「後台工作人員」:不在舞台上,但在後面做資料處理或控制。

初始程式碼如下

extends Area2D
// 意思:這個腳本繼承自 Area2D 節點類型。
// 效果:這個物件就擁有 Area2D 的所有功能,例如偵測碰撞、進出事件(body_entered 等)。


# Called when the node enters the scene tree for the first time.
func _ready() -> void:
	pass # Replace with function body.
// _ready():Godot 生命週期方法之一。
// 觸發時機:當這個節點 第一次被加到場景樹中並完成初始化 時呼叫(比 _process 早一次)。
// pass:表示什麼都不做(佔位用),你可以把它換成自己的程式碼。

# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
	pass
// _process(delta):每幀(frame)呼叫一次,用來處理持續的邏輯。

extends Area2D → 我是個可以偵測碰撞範圍的節點

_ready() → 第一次出場時要做的事

_process(delta) → 每一幀要持續做的事

可在旁邊屬性面板中切換到結點,可以找到 _on_body_entered Function,可以把它加入到程式碼當中。

// body_entered 是 Area2D 的內建訊號,當 另一個有碰撞的物體(例如 Player)進入這個 Area2D 範圍 時觸發。
func _on_body_entered(body: Node2D) -> void:
	print("coin touch!!!!") // 顯示到終端機上
	queue_free() // 這是 Godot 內建方法,會 把當前節點排進刪除隊列(不是立刻刪掉,而是等安全時機刪除)。適用場景:拿到的硬幣要消失、子彈打到目標後消失等等。

注意

關於 Area2D 底下的 _on_body_entered 會判定碰撞點。例如移動平台的路徑上有碰到,會出現平台把錢幣吃掉的狀況。這時就要考慮到 collision 設定中的 layer 與 mask

上圖所示,player 所在 2 層,但可以感應 1 層, coin 存在於 1 層,感應 2 層 。所以這樣就可以只讓 coin 感應2層的所有東西,如果平台設定是 1:1話,coin 就不會觸發。

上圖可以看到,平台已經碰到錢幣,但錢幣沒有觸發到 _on_body_entered ,導致錢幣不會消失。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *