Godot报错:Invalid Set 'x' (on base:'bool') of value of type 'int' 求解
Godot报错:Invalid Set 'x' (on base:'bool') of value of type 'int' 原因及解决
错误原因
你代码里的核心问题是对move_and_slide()的返回值理解错误:
move_and_slide()的返回值是布尔类型(bool),仅用来表示角色是否在移动过程中发生了滑动碰撞。- 你把这个布尔值赋值给了原本定义为Vector2类型的
mon变量,后续再尝试修改mon.x,本质是试图给一个布尔值添加/修改x属性,这完全不符合类型规则,因此触发报错。
move_and_slide()函数的作用
这是Godot中CharacterBody2D节点处理移动与物理碰撞的核心函数,核心功能包括:
- 基于节点自带的
velocity属性(Vector2类型)计算角色移动轨迹 - 自动处理碰撞检测与响应,包括碰撞后的滑动、斜坡适应、重力应用(需提前设置
velocity.y) - 返回布尔值,告知开发者本次移动是否发生了滑动碰撞(可用于后续逻辑判断,比如播放滑行动画)
修复后的代码
正确的逻辑是先设置角色的移动速度(使用CharacterBody2D自带的velocity属性),再调用move_and_slide()处理移动:
extends CharacterBody2D func _physics_process(delta): # 根据输入设置水平移动速度(建议用200这类合理数值,1的话移动速度过慢) if Input.is_action_pressed("ui_left"): velocity.x = -200 elif Input.is_action_pressed("ui_right"): velocity.x = 200 else: velocity.x = 0 # 调用move_and_slide处理移动与碰撞 move_and_slide()
如果坚持要用自定义变量存储速度,也可以这样写:
extends CharacterBody2D var mon = Vector2.ZERO func _physics_process(delta): # 先根据输入设置自定义速度变量 if Input.is_action_pressed("ui_left"): mon.x = -200 elif Input.is_action_pressed("ui_right"): mon.x = 200 else: mon.x = 0 # 将自定义速度赋值给节点自带的velocity velocity = mon # 调用move_and_slide处理移动 move_and_slide()
内容的提问来源于stack exchange,提问作者ben cc
相关产品推荐
相关产品推荐

