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

Godot 4.2.1中设置RigidBody2D缩放解决布偶翻转失控旋转问题

2D布偶系统转向后失控旋转问题

我给玩家制作了一个2D布偶(ragdoll)系统,核心需求是玩家转向后触发布偶效果时,布偶不会出现失控旋转。尝试过设置父Node2D的负缩放,再通过PhysicsServer2D将该缩放应用到刚体,但触发布偶效果后,布偶仍会失控旋转。还尝试过手动设置位置、通过PhysicsServer2D设置刚体缩放及全局位置等操作,相关代码如下:

func flip(dir):
    ragdollFunc(false,"idle")
    scale.x = dir
    for limb in UFunc.get_all_children(self,"RigidBody2D"):
        PhysicsServer2D.body_set_state(
            limb.get_rid(),
            PhysicsServer2D.BODY_STATE_TRANSFORM,
            Transform2D.IDENTITY.translated(scale)
            #Transform2D.IDENTITY.translated(limb.global_position)
            )
    ragdollFunc(true,"idle")

func ragdollFunc(_bool,animName,specific:=""):
    $Animation.stop()
    var all = UFunc.get_all_children(self)
    
    for body in all:
        for body2 in all:
            if body.is_class("RigidBody2D") && body2.is_class("RigidBody2D"):
                body.add_collision_exception_with(body2)
        if body.is_class("RigidBody2D"):
            #body.add_collision_exception_with(self)
            body.freeze = !_bool
    
    if _bool == false:
        $Animation.play(animName)
    
    for limb in UFunc.get_all_children(self,"RigidBody2D"):
        PhysicsServer2D.body_set_state(
            limb.get_rid(),
            PhysicsServer2D.BODY_STATE_TRANSFORM,
            Transform2D.IDENTITY.translated(limb.global_position)
            )
    for limb in UFunc.get_all_children(self,"RigidBody2D"):
        PhysicsServer2D.body_set_state(
            limb.get_rid(),
            PhysicsServer2D.BODY_STATE_TRANSFORM,
            Transform2D.IDENTITY.translated(scale)
            #Transform2D.IDENTITY.translated(limb.global_position)
            )

节点树及布偶效果如下:
节点树与布偶效果

内容的提问来源于stack exchange,提问作者Aaron Baer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:04:56