效果预览

动画

1 添加人物碰撞

在play节点下新建一个collisionShape2D节点,选择shape添加碰撞检测的形状,这里添加椭圆形,并旋转90°(按自己喜好设置)

image-20240526041003766

调整形状,把脚盖住

2 添加空气墙测试人物碰撞

添加StaticBody2D节点,和它的CollisionPolygon2D子节点,绘制墙体,在调试中把显示碰撞区域打开

image-20240526042610767

3 处理挨着墙壁移动,角色会抖动的问题

使用move_and_slide()替换move_and_collide(velocity * delta)

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
extends CharacterBody2D

const ACCELERATION = 15 * 60
const MAX_SPEED = 100
const FRICTION = 10 * 60

var input_vector = Vector2.ZERO

func _physics_process(delta: float) -> void:

# 更新输入向量(仅当输入发生变化时才重新计算归一化)
input_vector.x=Input.get_axis("ui_left", "ui_right")
input_vector.y=Input.get_axis("ui_up", "ui_down")
if input_vector.length() > 0.01: # 防止除以零
input_vector = input_vector.normalized()

#非零向量
if input_vector != Vector2.ZERO:
velocity = velocity.move_toward(input_vector * MAX_SPEED,ACCELERATION * delta - FRICTION * delta)
else :
velocity = velocity.move_toward(Vector2.ZERO,FRICTION * delta) #摩擦力

#相比上1节,只变了这一行代码
move_and_slide()

完成