SkeletonModification2DPhysicalBones in Godot – Complete Guide

Welcome to the thrilling world of 2D skeletal animation in Godot 4! If you’ve ever been fascinated by the way your favorite 2D characters move with such fluidity and life, you’re in for a treat. In this tutorial, we’re going to dive deep into the canals of animation magic through the use of the SkeletonModification2DPhysicalBones class. Whether you’re a budding game developer or an experienced coder looking to polish your skills, the knowledge of how to apply physics to your character’s bones will bring a new level of realism and interactivity to your games. So brace yourself for an engaging journey into the practical application of physics-based animations!

What is SkeletonModification2DPhysicalBones?

SkeletonModification2DPhysicalBones is a class in Godot 4 that is designed to bring together the worlds of skeletal animation and 2D physics. It allows your Bone2D nodes in a Skeleton2D hierarchy to inherit transformations from corresponding PhysicalBone2D nodes. This means your animated characters can have bones that not only follow predefined animations but also respond dynamically to the physics environment around them.

What is it for?

Imagine a character whose tail reacts to wind, or a cape that floats as the hero jumps; these are the types of dynamic, physics-affected animations you can create with SkeletonModification2DPhysicalBones. Utilizing this class, you can have your animations interact with the game world in a realistic manner, elevating the immersion of your games to new heights.

Why Should I Learn It?

Learning how to use the SkeletonModification2DPhysicalBones class is essential for game developers who want to integrate nuanced, physics-driven animations into their 2D games. Not only does it make your characters feel more ‘alive’, but it also adds a layer of depth and interaction that can set your game apart in a crowded marketplace. Equipping yourself with this knowledge opens up a universe of creative possibilities for character design and gameplay mechanics.

CTA Small Image

Setting Up Your Project

Before we start tweaking bones and adding physics, let’s set up a basic Godot project. Once you’ve launched Godot 4 and created a new project, follow these simple steps.

First, we need to create a new 2D scene. This will serve as the playground for our physical bones.

Click on Scene > New Scene > 2D Scene

Next, let’s create a Skeleton2D node which will act as the parent for our bones.

Click on the “+” button > Search and add Skeleton2D node

Finally, we need to add a sprite for our character that we will animate.

Click on the Skeleton2D node > Click on the “+” > Add Sprite node

Creating the Bones

With our scene set up, it’s time to add bones to our character. This will require a Sprite with a compatible texture that has areas you’d like to animate, such as limbs.

Below is a simple piece of code to add a Bone2D node, which serves as an individual bone for our skeleton. Make sure you create one for each part of your character you want to have independent movement.

Click on the Skeleton2D node > Click on the “+” > Add Bone2D node

Next, we have to position the Bone2D to match the corresponding part of the sprite. Below is an example of how you could set up a basic arm bone.

Select Bone2D node > Move and rotate it to align with the character’s arm

Adding PhysicalBone2D

After setting up the skeletal structure, it’s time to get physical! PhysicalBone2D nodes will give our bones the desired physics properties.

Let’s add a PhysicalBone2D to work with our Bone2D.

Select the Bone2D node > Click on the “+” > Add PhysicalBone2D node

You should now set the weight, friction, and bounce properties to simulate realistic physics behavior.

Select PhysicalBone2D node > Set the `weight` property > Adjust `friction` and `bounce` as needed

Linking Bones with SkeletonModification2DPhysicalBones

Now, in order for our Bone2D nodes to follow the physical properties we’ve set up, we need to link them with the SkeletonModification2DPhysicalBones class. For each bone you wish to be affected by physics, follow this approach:

Enable the “use_physics” property of your Bone2D to allow physics interaction.

Select Bone2D node > In the Inspector, check the “use_physics” property

Now, link the PhysicalBone2D to the respective Bone2D.

Select PhysicalBone2D node > Drag the corresponding Bone2D node into the “Bone2D” property box

After completing these steps for each bone, your bones will interact with the physical environment according to the physical properties you’ve specified, such as reacting to gravity or collisions.

In the upcoming sections, we’ll take a closer look at how these components work together during the animation process and how to fine-tune your physical bones for even more impressive results. Stay tuned as we continue our engaging journey into the world of 2D skeletal animation with Godot 4, and remember, this is just the beginning! With these basics, you’re well on your way to creating captivating animations that will make your characters spring to life.Setting up the SkeletonModification2DPhysicalBones is a pivotal step towards having your bones governed by both animation and physics. Here’s how you can begin implementing this to bring life to your skeleton:

First, let’s add the SkeletonModification2DStack node to our Skeleton2D node:

Select the Skeleton2D node > Click on the “+” > Add SkeletonModification2DStack node

Within the SkeletonModification2DStack, we will need to add a new SkeletonModification2DPhysicalBones. This modification will act as a layer in which all our bones that require physics are listed and managed:

Select SkeletonModification2DStack node > In the Inspector, click on "Add SkeletonModification" > Choose "PhysicalBones"

Now that we’ve set up our modification stack, let’s begin “mapping” the PhysicalBone2D nodes to our Bone2D nodes:

// Assuming 'arm_bone' is the name of your arm's Bone2D
var physical_bones_modification = $Skeleton2D/SkeletonModification2DStack.get_modification("PhysicalBones")
physical_bones_modification.map_physical_bone_to_bone2d("arm_physical_bone", "arm_bone")

We can also start mapping multiple bones using code to streamline the process:

var physical_bones_modification = $Skeleton2D/SkeletonModification2DStack.get_modification("PhysicalBones")
for bone in array_of_bones_to_map:
    var physical_bone_name = bone + "_physical_bone"
    physical_bones_modification.map_physical_bone_to_bone2d(physical_bone_name, bone)

To adjust the physical properties from code, you’ll want to manipulate the PhysicalBone2D nodes directly. Whether you are increasing weight to simulate a heavy object or decreasing friction for a slippery surface, here’s how you might alter these properties programmatically:

// Adjust the weight of the arm's physical bone
$Skeleton2D/arm_bone/PhysicalBone2D.weight = 10

// Decrease the friction for a slippery effect
$Skeleton2D/arm_bone/PhysicalBone2D.friction = 0.1

// Increase the bounce for a springy reaction
$Skeleton2D/arm_bone/PhysicalBone2D.bounce = 0.8

What’s most compelling about Godot’s animation system is the possibility to blend the physical reactions with animated movements. To achieve this, we can specify when the bone should be following the animation or the physics by toggling the “disable_physics” property:

// To have the arm follow the animation instead of physics
$Skeleton2D/arm_bone.disable_physics = true

// To have the arm respond to physics
$Skeleton2D/arm_bone.disable_physics = false

Manipulating these properties allows you to control the physics responses at runtime, providing dynamism to your animations based on gameplay events, such as a character getting hit or pushing an object.

Remember to always test your configurations in action to ensure the physical properties behave as expected. You may need to iterate several times, adjusting weights, friction coefficients, and bounciness to get the “feel” just right.

With these examples in hand, you’re now equipped to start transforming your static animations into fully interactive, physics-driven masterpieces that respond to the in-game world with realism and flair. Keep experimenting with the different settings to discover the perfect balance for seamless and natural character movement. And as always, we at Zenva are excited to support you on your development journey!To further enhance your 2D animations with physics in Godot 4, let’s dive into some more advanced features and techniques. This part of the tutorial is where things get increasingly interactive and engaging!

For starters, let’s talk about responding to collisions. You might want your character’s cape to flutter upon hitting the ground or another object. Here’s how you could detect a collision and apply a temporary stiffening effect to simulate the impact:

// Connect the 'body_entered' signal from PhysicalBone2D to a function in your script
$Skeleton2D/cape_bone/PhysicalBone2D.connect("body_entered", self, "_on_PhysicalBone2D_body_entered")

func _on_PhysicalBone2D_body_entered(body):
    // Increase weight briefly to simulate the impact
    $Skeleton2D/cape_bone/PhysicalBone2D.weight *= 2.0
    # Reset weight after a short delay
    yield(get_tree().create_timer(0.2), "timeout")
    $Skeleton2D/cape_bone/PhysicalBone2D.weight /= 2.0

Perhaps you want to simulate different physical responses based on the part of the body. For example, let’s automate the process of making a character’s feet stick to the ground more than other parts:

// Define properties for different parts
var body_parts = {
    "foot_bone": {"weight": 5.0, "friction": 1.0},
    "hand_bone": {"weight": 3.0, "friction": 0.5},
    # Add more parts as necessary...

// Apply properties to each PhysicalBone2D
for part in body_parts:
    var bone_path = $Skeleton2D.get_path_to($Skeleton2D.find_node(part))
    var physical_bone = get_node(bone_path + "/PhysicalBone2D")
    physical_bone.weight = body_parts[part]["weight"]
    physical_bone.friction = body_parts[part]["friction"]

Additionally, you might want to dynamically adjust the physical properties of a bone based on game events, like entering water or moving through the air. Here’s an example of how you’d make your character’s physics more buoyant while underwater:

func enter_water():
    foreach bone in $Skeleton2D.get_bone_list():
        var bone_name = bone.get_name()
        var physical_bone = $Skeleton2D.get_node(bone_name + "/PhysicalBone2D")
        if physical_bone:
            physical_bone.weight = max(physical_bone.weight / 2, 1.0)

func exit_water():
    foreach bone in $Skeleton2D.get_bone_list():
        var bone_name = bone.get_name()
        var physical_bone = $Skeleton2D.get_node(bone_name + "/PhysicalBone2D")
        if physical_bone:
            physical_bone.weight *= 2

Adjusting the rest length of springs attached to your PhysicalBone2D can also make for interesting effects, like squashing and stretching:

func squash():
    $Skeleton2D/head_bone/PhysicalBone2D.spring_rest_length *= 0.8

func stretch():
    $Skeleton2D/head_bone/PhysicalBone2D.spring_rest_length /= 0.8

If you want to switch between physics-driven and traditionally animated motion, perhaps during a cutscene, you could blend between them using a tween:

// Assuming we have a Tween node as a child of Skeleton2D named Tween
func blend_to_animation():

func blend_to_physics():

These code examples are designed to inspire you to explore the endless possibilities of 2D skeletal animation with Godot 4. Utilize the physics system creatively to simulate diverse interactions and make your game’s universe even more absorbing. As always, we love seeing what you create with the knowledge you gain from our resources, so don’t hesitate to let us know about your animation adventures!

Embark Further on Your Game Development Journey

Now that you’ve delved into the world of 2D skeletal animation with Godot 4, you might be pondering, “Where to next?” The answer is exciting and limitless! Strengthen the skills you’ve just learned by exploring more complex projects and challenges. If you’re looking to deepen your understanding of Godot and expand your game development expertise, our Godot Game Development Mini-Degree is the perfect next step on your journey.

Our comprehensive course collection covers a broad range of essential topics for building cross-platform games with Godot. From mastering 2D and 3D assets to programming intricate gameplay mechanics, you’ll gain the knowledge necessary to take your development skills from novice to pro. And with Godot 4’s user-friendly approach and strong community, you’ll find endless support as you progress. Whether you’re passionate about creating immersive RPGs, fast-paced RTS games, or engaging survival games, our mini-degree has something for everyone.

For those seeking even more Godot content, our diverse range of Godot courses will surely satisfy your learning appetite. At Zenva, we believe in offering flexible and project-based learning opportunities that cater to both beginners and more experienced developers. So continue your game development adventure with us, and turn your creativity into playable realities. The game industry awaits you, ready to be amazed by the worlds and experiences you’re about to create!


In this tutorial, we’ve only scratched the surface of what’s possible with Godot 4’s 2D skeletal animation system. With the power of SkeletonModification2DPhysicalBones and a dash of creativity, your animated characters can interact with their environment in ways that were once the domain of painstaking frame-by-frame animation. Armed with this knowledge, you’re on the path to creating truly dynamic and responsive characters that will capture the hearts of gamers worldwide. Remember, every great adventure begins with a single step, and with each new project, your skills will grow exponentially.

Don’t stop here; take what you’ve learned to the next level by enrolling in our Godot Game Development Mini-Degree. Clear tutorials, in-depth courses, and practical projects await to further your expertise in Godot and game development. So join us at Zenva, and together, let’s transform your game development dreams into reality!

Python Blog Image

FINAL DAYS: Unlock coding courses in Unity, Godot, Unreal, Python and more.