首先建立一個如 Day8 的 player 場景,不過先不要加上腳本
# 架構如下
|--CharacterBody2D
| |--CollisionShape2D
| |--Sprite2D
介紹 StaticBody2D
A 2D physics body that can't be moved by external forces. When moved manually, it doesn't affect other bodies in its path.
A 2D physics body that can't be moved by external forces. When moved manually, it doesn't affect other bodies in its path.
這個節點不會被外力影響或移動,若手動移動也不會影響到其他物體。
現在我們要在 player 加上物理設定。
附加腳本到 CharacterBody2D,樣板選擇 Object: Empty
,會產生一個空的腳本:
extends CharacterBody2D
先宣告我們的重力,取得的位置在 專案 -> 專案設定 -> 一般 -> 物理 -> 2D -> Default Gravity
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
接著新增物理迴圈 _physics_process
func _physics_process(delta):
# 待會新增物理邏輯位置
在迴圈中新增判斷檢測物件是否在地面上,若否則更新角色的垂直速度。
if not is_on_floor():
velocity.y += gravity * delta
The up_direction and floor_max_angle are used to determine whether a surface is "floor" or not.
在說明中可以看到判斷地面的方式是 up_direction 及 floor_max_angle 這兩個屬性,up_direction 是一個朝上的向量,floor_max_angle 是最大能被判斷為地板的角度預設為 45度,超過 45度就不會被當作地板並持續觸發我們的判斷。
最後呼叫 move_and_slide() 方法。
move_and_slide()
Moves the body based on velocity. If the body collides with another, it will slide along the other body (by default only on floor) rather than stop immediately. (...)
這邊擷取說明的一部分,簡單看可以知道這個方法會根據 velocity
移動我們的物件並且會有慣性的滑動不會直接停止。
完成我們的角色物理設定儲存場景(註:這次為了方便後續觀察有將 scale (屬性面板 -> Node2D -> Transform -> Scale)調小)
extends CharacterBody2D
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
func _physics_process(delta):
if not is_on_floor():
velocity.y += gravity * delta
move_and_slide()
extends Node
@export var player_scene:PackedScene
# Called when the node enters the scene tree for the first time.
func _ready():
pass
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
# 這裡更改為 just pressed 避免一次點擊觸發多次的情況發生
if Input.is_action_just_pressed("left_click"):
spawn()
func spawn():
var godot = player_scene.instantiate()
godot.position = get_viewport().get_mouse_position()
add_child(godot)
現在播放就可以看到物件會持續下落。
StaticBody2D
作為我們測試用的固定物理物件可以產生碰撞,在節點下加入 CollisionPolygon2D
讓我們能繪製物件的碰撞形狀,繪製方式如昨日 Polygon2D
方法,繪製完成後為了方便觀察我們一樣再加入 Polygon2D
加上顏色。# 結構如下
|--StaticBody2D
| |--CollisionPolygon2D # 在 2D 場景中新增頂點
| |--Polygon2D # 在 2D 場景中新增頂點
:)