You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 20:22:35