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

Godot 4.2平台游戏Boss制作求助:实现攻击与召唤功能

Godot 4.2 平台游戏Boss实现指南(攻击+召唤+状态机)

1. 搭建状态机核心框架

在Boss的主脚本(如Boss.gd)中定义状态枚举与核心处理逻辑,这是Boss行为的基础:

extends CharacterBody2D

# 定义Boss状态枚举
enum BossState { IDLE, ATTACK, SUMMON, HURT, DEAD }
var current_state: BossState = BossState.IDLE
var health: int = 100 # 初始血量

func _physics_process(delta: float) -> void:
    # 根据当前状态执行对应逻辑
    match current_state:
        BossState.IDLE:
            handle_idle(delta)
        BossState.ATTACK:
            handle_attack(delta)
        BossState.SUMMON:
            handle_summon(delta)
        BossState.HURT:
            handle_hurt(delta)
        BossState.DEAD:
            handle_dead(delta)

2. 实现攻击功能

攻击碰撞体设置

在Boss节点下添加Area2D(命名为AttackArea),搭配CollisionShape2D绘制攻击范围,默认关闭监控(Inspector面板将Monitoring设为false)。

攻击逻辑编写

在Boss.gd中补充攻击状态处理函数:

func handle_attack(delta: float) -> void:
    # 播放攻击动画
    $AnimationPlayer.play("attack")
    
    # 动画播放到攻击帧时开启碰撞体
    if $AnimationPlayer.current_animation == "attack" and $AnimationPlayer.current_animation_position >= 0.2:
        $AttackArea.monitoring = true
    
    # 动画结束后重置状态并随机切换行为
    if $AnimationPlayer.is_animation_finished():
        $AttackArea.monitoring = false
        current_state = BossState.IDLE
        # 30%概率切换到召唤状态,否则继续攻击
        if randi() % 100 < 30:
            current_state = BossState.SUMMON

给AttackArea添加脚本AttackArea.gd处理击中逻辑:

extends Area2D

func _body_entered(body: Node2D) -> void:
    # 仅对玩家造成伤害
    if body.is_in_group("player"):
        body.take_damage(10) # 假设玩家脚本包含take_damage方法

3. 实现召唤敌人功能

准备工作

提前制作敌人场景(如Enemy.tscn),并在Boss节点下添加Marker2D(命名为SummonPoint),标记敌人生成位置。

召唤逻辑编写

在Boss.gd中补充召唤状态处理函数:

func handle_summon(delta: float) -> void:
    $AnimationPlayer.play("summon")
    
    # 动画播放到召唤帧时生成敌人
    if $AnimationPlayer.current_animation == "summon" and $AnimationPlayer.current_animation_position >= 0.5:
        var enemy_scene = load("res://scenes/Enemy.tscn")
        var enemy = enemy_scene.instantiate() # 注意:Godot4.2用instantiate,4.0用instance,这是关键差异
        enemy.position = $SummonPoint.position
        get_tree().get_root().add_child(enemy)
    
    # 动画结束后回到idle状态
    if $AnimationPlayer.is_animation_finished():
        current_state = BossState.IDLE

4. 完善状态切换逻辑

警戒触发(玩家进入范围激活Boss)

在Boss节点下添加Area2D(命名为AlertArea),绘制较大警戒范围,在Boss.gd中连接它的body_entered信号:

func _on_alert_area_body_entered(body: Node2D) -> void:
    if body.is_in_group("player") and current_state == BossState.IDLE:
        current_state = BossState.ATTACK # 首次触发直接进入攻击状态

受伤与死亡状态

在Boss.gd中添加受伤处理函数与对应状态逻辑:

# 外部调用该方法让Boss受伤
func take_damage(amount: int) -> void:
    health -= amount
    if health <= 0:
        current_state = BossState.DEAD
    else:
        current_state = BossState.HURT
        $AnimationPlayer.play("hurt")

func handle_hurt(delta: float) -> void:
    # 受伤动画结束后回到战斗状态
    if $AnimationPlayer.is_animation_finished():
        current_state = BossState.ATTACK if randi() % 2 == 0 else BossState.SUMMON

func handle_dead(delta: float) -> void:
    # 播放死亡动画后销毁Boss
    if $AnimationPlayer.is_animation_finished():
        queue_free()

5. 适配Godot4.2的关键注意点

  • 场景实例化:4.0版本用instance(),4.2必须用instantiate(),这是旧教程跑不通的核心原因。
  • 动画信号:可直接在编辑器AnimationPlayer面板添加自定义信号轨道,精准触发攻击/召唤时机,比手动判断动画位置更可靠。
  • 类型标注:4.2对变量类型要求更严格,明确标注current_state的枚举类型可避免隐式错误。

内容的提问来源于stack exchange,提问作者k10 Vet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:37:22