261 字
1 分钟
Godot-CharacterBody2D移动遇到的坑

在Godot中创建了一个Player场景,根节点是Character2D。

这是我Player的GD Script代码,实现了移动功能。

extends CharacterBody2D
@export var speed : float = 10;
func _ready() -> void:
pass;
func _physics_process(delta: float) -> void:
var movespeed:float = speed;
if Input.is_action_pressed('slow'):# 按shift降速
movespeed/=2;
velocity=Input.get_vector("move_left","move_right","move_up","move_down");
position += velocity*movespeed;

乍一看没问题,但当我设置游戏边界的空气墙时,出问题了。

即使Player附有碰撞体节点,却不能被空气墙阻挡。

然后上网看到贴吧的一个大佬给出了回答:CharacterBody2D进行移动时,只有使用move_and_slide()或者move_and_collide 方法才能进行碰撞检测

改正后的代码如下:

extends CharacterBody2D
@export var speed : float = 10;
func _ready() -> void:
pass;
func _physics_process(delta: float) -> void:
var movespeed:float = speed;
if Input.is_action_pressed('slow'):# 按shift降速
movespeed/=2;
velocity=Input.get_vector("move_left","move_right","move_up","move_down")*movespeed;
move_and_slide();

简单粗暴操作position和unity的transform.Translate差不多,只会进行坐标系上的移动,并不会考虑到物理计算。

算是一个开发时的小坑

另外为啥我从Unity转到Godot了,因为我最近闲的蛋疼想找点乐子

Godot-CharacterBody2D移动遇到的坑
https://klqn.top/posts/cv0016/
作者
丘比女王
发布于
2025-09-13
许可协议
CC BY-NC-SA 4.0
封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00