Godot4中敌人击退代码报错:move_toward函数调用无效求助
问题分析与修复方案
报错根源
你遇到的Invalid call. Nonexistent function 'move_toward' in base 'bool'错误,核心原因是Godot 4 对CharacterBody2D.move_and_slide()的返回值做了改动:
- Godot 3中,
move_and_slide()返回未用完的剩余运动向量(Vector2类型) - Godot 4中,它返回布尔值(
bool),仅表示角色是否发生了移动
你的代码里把move_and_slide(knockback)的结果赋值给knockback,导致原本是Vector2类型的knockback被覆盖成布尔值,下一次帧调用knockback.move_toward()时,自然会因为调用对象是布尔值而报错。
修复代码
直接修改_physics_process逻辑,不要用move_and_slide的返回值覆盖knockback:
extends CharacterBody2D var knockback = Vector2.ZERO func _physics_process(delta): # 持续衰减击退速度,让角色逐渐停止 knockback = knockback.move_toward(Vector2.ZERO, 200 * delta) # 直接传入knockback作为速度调用move_and_slide,无需接收返回值 move_and_slide(knockback) func _on_hurtbox_area_entered(area): knockback = Vector2.RIGHT * 200
额外说明
- 删除
move_and_slide参数的操作是错误的:move_and_slide必须传入速度向量才能驱动角色移动,无参数调用不符合Godot 4的API规范。 - 用
move_and_slide替换move_toward也逻辑错误:move_toward的作用是让向量平滑趋近目标值(这里用来衰减击退速度),和移动逻辑是两个不同的环节,不能互相替代。
内容的提问来源于stack exchange,提问作者DaPOPs
相关产品推荐
相关产品推荐

