1 Area2D节点

新建2个Area2D节点——Hutrbox和Hitbox,分别给它们CollisionShape2D子节点,作为攻击和被攻击的伤害判定区

2 Hutrbox处理

草场景引入hurtbox场景,打开子场景可编辑,给Hurtbox一个碰撞检测的形状和进入信号。

脚本逻辑更改,把上一节的创建草特效抽取为一个函数create_grass_effect(),hurtbox区域检测到信号,就播放摧毁动画,然后消失

grass.gd

1
2
3
4
5
6
7
8
9
10
11
12
13
extends Node2D

func create_grass_effect():
const GRASS_EFFECT = preload("res://Effects/grass_effect.tscn")
var grassEffect = GRASS_EFFECT.instantiate()
var world = get_tree().current_scene
world.add_child(grassEffect)
grassEffect.global_position = global_position

func _on_hurtbox_area_entered(area: Area2D) -> void:
create_grass_effect()
queue_free()

3 Hitbox处理

  • 同样的方法,先建一个Hitbox
  • 因为要检测的碰撞范围是“挥动的剑”,所以使用Marker2D的旋转属性,实现旋转
  • 利用父节点特性:子节点会跟着父节点移动,把HitboxPivot作为SwordHitbox的父节点,旋转的时候,Hitbox会绕它的父节点HitboxPivot旋转,借此改变碰撞检测的位置
  • 插入进动画轨道

image-20240604052748640

  • 优化攻击生效时机,在不同帧插入CollisionShape2D的disable属性

image-20240604053617616

4 物理层优化

项目设置给物理层命名,重新设置所有场景的碰撞层