每帧生成 CharacterBody2D 当子弹会很贵。微型射击用 Area2D 按速度平移即可。
子弹脚本
gdscript
extends Area2D
@export var speed := 420.0
var dir := Vector2.RIGHT
func _ready() -> void:
body_entered.connect(_on_body_entered)
func _physics_process(delta: float) -> void:
global_position += dir * speed * delta
func _on_body_entered(body: Node2D) -> void:
if body.has_method("hurt"):
body.hurt()
queue_free()发射点:
gdscript
var b := bullet_scene.instantiate()
b.global_position = $Muzzle.global_position
b.dir = Vector2.RIGHT if facing_right else Vector2.LEFT
get_tree().current_scene.add_child(b)子弹加到当前场景,不要加到玩家下面,否则玩家一 queue_free 子弹消失。
层怎么分
| 对象 | 碰撞层 | 遮罩 |
|---|---|---|
| 玩家 | player | world |
| 玩家子弹 | player_bullet | world + enemy |
| 敌人 | enemy | world |
| 墙 | world | — |
玩家子弹遮罩不要勾 player,否则刚出膛就打中自己。
飞出屏幕要删:VisibleOnScreenNotifier2D 的 screen_exited 里 queue_free()。
