You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:01:17