Godot中如何让屏幕外的子弹在创建时立即启动移动?
解决子弹屏幕外不移动的问题
1. 关闭VisibleOnScreenEnabler2D的自动暂停功能
你的子弹节点挂载了VisibleOnScreenEnabler2D,如果它的**Pause on Exit**选项处于勾选状态,子弹在屏幕外时会被自动暂停,导致_physics_process停止运行,自然无法移动。
- 选中子弹节点下的
VisibleOnScreenEnabler2D - 在检查器面板中找到
Pause Mode相关设置,取消勾选Pause on Exit(或直接将Process Mode设为Always)
2. 优化子弹初始化逻辑
可靠获取玩家节点
避免在_ready()中依赖未就绪的玩家节点,改用等待机制确保玩家加载完成:
extends Area2D @export var speed := 200.00 @onready var Ani := $AnimationPlayer var player: Node2D var time_to_live: float = 3.0 var movement_vector := Vector2.ZERO func _ready(): # 等待玩家节点进入场景树后再获取 await get_tree().group_enter_tree("Player") player = get_tree().get_nodes_in_group("Player")[0] # 初始化朝向与移动向量 look_at(player.global_position) movement_vector = (player.global_position - global_position).normalized() Ani.play("Animation") func _physics_process(delta): global_position += movement_vector * speed * delta # 增加生命周期计时,防止子弹无限存在 time_to_live -= delta if time_to_live <= 0: queue_free() func _on_visible_on_screen_enabler_2d_screen_exited(): queue_free() func _on_body_entered(body): # 用玩家组判断目标,比依赖节点名称更稳定 if body.is_in_group("Player") and body.can_be_hurt: body.take_damage(5) queue_free()
关键修改说明:
- 用
await get_tree().group_enter_tree("Player")确保玩家节点就绪后再初始化子弹 - 改用玩家组判断碰撞目标,避免节点名称变更导致逻辑失效
- 增加生命周期计时,即使未触发屏幕退出信号,子弹也会自动销毁
3. 检查子弹节点的Process Mode
确保子弹节点本身的**Process Mode**设置为Always(在检查器的Node面板中),而非Process when Visible——后者会让屏幕外的节点停止运行_process和_physics_process。
内容的提问来源于stack exchange,提问作者Griper
相关产品推荐
相关产品推荐

