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

Godot 4.1:如何通过代码按需创建指定尺寸形状的带碰撞Area2D

解决Godot中动态创建HitBox碰撞形状不显示的问题

你的核心问题是只创建了CapsuleShape2D对象,但没有设置它的实际尺寸参数——默认情况下,CapsuleShape2D的radius和height都是0,所以即使挂到CollisionShape2D上,也看不到任何碰撞形状,和没创建一样。

修正后的HitBox代码

class_name HitBox
extends Area2D

var collision_shape: CollisionShape2D
var capsule_shape: CapsuleShape2D

func _ready():
    # 设置碰撞层和掩码
    collision_layer = 2
    collision_mask = 0
    monitorable = true

    # 创建并配置胶囊碰撞形状
    capsule_shape = CapsuleShape2D.new()
    # 必须设置尺寸,数值根据你的攻击范围调整
    capsule_shape.radius = 16.0
    capsule_shape.height = 32.0

    # 创建CollisionShape2D并关联形状
    collision_shape = CollisionShape2D.new()
    collision_shape.name = "CollisionShape2D"
    collision_shape.shape = capsule_shape  # 直接赋值比set_shape更直观
    add_child(collision_shape)

# 可选:添加设置形状参数的方法,方便不同攻击调用不同尺寸
func set_capsule_size(radius: float, height: float):
    capsule_shape.radius = radius
    capsule_shape.height = height

动态创建/销毁HitBox的调用示例(玩家脚本中)

在玩家的攻击逻辑里,你可以这样动态生成HitBox,攻击结束后销毁:

extends CharacterBody2D

func attack():
    # 动态创建HitBox
    var hit_box = HitBox.new()
    # 设置HitBox的位置(比如相对于玩家的出拳位置)
    hit_box.position = global_position + Vector2(30, 0)  # 向右偏移30像素
    # 可选:根据攻击类型设置不同的碰撞尺寸
    hit_box.set_capsule_size(20.0, 40.0)
    # 添加到场景树
    add_child(hit_box)

    # 攻击持续时间(比如0.2秒)后销毁HitBox
    await get_tree().create_timer(0.2).timeout
    hit_box.queue_free()

关键说明

  • 所有形状类(比如CapsuleShape2D、RectangleShape2D)都需要手动设置尺寸参数,编辑器里选择形状后默认会给一个基础尺寸,但代码创建时默认是0,必须显式设置。
  • 用shape直接赋值替代set_shape是Godot 3.x及以上版本的推荐写法,更符合GDScript的风格。
  • 销毁节点时务必用queue_free(),确保节点安全从场景树移除并释放资源。

内容的提问来源于stack exchange,提问作者Julian Mccann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:22:15