5 min read

In this article we will learn how to apply Ragdoll physics to a character.

(For more resources related to this topic, see here.)

Applying Ragdoll physics to a character

Action games often make use of Ragdoll physics to simulate the character’s body reaction to being unconsciously under the effect of a hit or explosion. In this recipe, we will learn how to set up and activate Ragdoll physics to our character whenever she steps in a landmine object. We will also use the opportunity to reset the character’s position and animations a number of seconds after that event has occurred.

Getting ready

For this recipe, we have prepared a Unity Package named Ragdoll, containing a basic scene that features an animated character and two prefabs, already placed into the scene, named Landmine and Spawnpoint. The package can be found inside the 1362_07_08 folder.

How to do it…

To apply ragdoll physics to your character, follow these steps:

  1. Create a new project and import the Ragdoll Unity Package. Then, from the Project view, open the mecanimPlayground level.
  2. You will see the animated book character and two discs: Landmine and Spawnpoint.
  3. First, let’s set up our Ragdoll. Access the GameObject | 3D Object | Ragdoll… menu and the Ragdoll wizard will pop-up.
  4. Assign the transforms as follows:
    • Root: mixamorig:Hips
    • Left Hips: mixamorig:LeftUpLeg
    • Left Knee: mixamorig:LeftLeg
    • Left Foot: mixamorig:LeftFoot
    • Right Hips: mixamorig:RightUpLeg
    • Right Knee: mixamorig:RightLeg
    • Right Foot: mixamorig:RightFoot
    • Left Arm: mixamorig:LeftArm
    • Left Elbow: mixamorig:LeftForeArm
    • Right Arm: mixamorig:RightArm
    • Right Elbow: mixamorig:RightForeArm
    • Middle Spine: mixamorig:Spine1
    • Head: mixamorig:Head
    • Total Mass: 20
    • Strength: 50

    Insert image 1362OT_07_45.png

  5. From the Project view, create a new C# Script named RagdollCharacter.cs.
  6. Open the script and add the following code:
    using UnityEngine;
    using System.Collections;
    
    public class RagdollCharacter : MonoBehaviour {
    
      void Start () {
          DeactivateRagdoll();
        }
    
        public void ActivateRagdoll(){
        gameObject.GetComponent<CharacterController> ().enabled 
    = false;
        gameObject.GetComponent<BasicController> ().enabled = 
    false;
        gameObject.GetComponent<Animator> ().enabled = false;
        foreach (Rigidbody bone in 
    GetComponentsInChildren<Rigidbody>()) {
            bone.isKinematic = false;
            bone.detectCollisions = true;
        }
        foreach (Collider col in 
    GetComponentsInChildren<Collider>()) {
            col.enabled = true;
        }
        StartCoroutine (Restore ());
    
        }
      public void DeactivateRagdoll(){
    
        gameObject.GetComponent<BasicController>().enabled = 
    true;
        gameObject.GetComponent<Animator>().enabled = true;
        transform.position = GameObject.Find("Spawnpoint").transform.position;
        transform.rotation = GameObject.Find("Spawnpoint").transform.rotation;
        foreach(Rigidbody bone in 
    GetComponentsInChildren<Rigidbody>()){
            bone.isKinematic = true;
              bone.detectCollisions = false;
          }
        foreach (CharacterJoint joint in 
    GetComponentsInChildren<CharacterJoint>()) {
          joint.enableProjection = true;
        }
        foreach(Collider col in 
    GetComponentsInChildren<Collider>()){
          col.enabled = false;
        }
      gameObject.GetComponent<CharacterController>().enabled
     = true;
    
        }
    
      IEnumerator Restore(){
        yield return new WaitForSeconds(5);
        DeactivateRagdoll();
      }
    }
    
  7. Save and close the script.
  8. Attach the RagdollCharacter.cs script to the book Game Object. Then, select the book character and, from the top of the Inspector view, change its tag to Player.
  9. From the Project view, create a new C# Script named Landmine.cs.
  10. Open the script and add the following code:
    using UnityEngine;
    using System.Collections;
    
    public class Landmine : MonoBehaviour {
      public float range = 2f;
      public float force = 2f;
      public float up = 4f;
      private bool active = true;
    
      void  OnTriggerEnter ( Collider collision  ){
        if(collision.gameObject.tag == "Player" && active){
          active = false;
          StartCoroutine(Reactivate());
          collision.gameObject.GetComponent<RagdollCharacter>().ActivateRagdoll();
          Vector3 explosionPos = transform.position;
                Collider[] colliders = 
    Physics.OverlapSphere(explosionPos, range);
              foreach (Collider hit in colliders) {
            if (hit.GetComponent<Rigidbody>())
                      hit.GetComponent<Rigidbody>().AddExplosionForce(force, explosionPos, range, up);
                 }
            }
        }
      IEnumerator Reactivate(){
        yield return new WaitForSeconds(2);
        active = true;
      }
    }
    
  11. Save and close the script.
  12. Attach the script to the Landmine Game Object.
  13. Play the scene. Using the WASD keyboard control scheme, direct the character to the Landmine Game Object. Colliding with it will activate the character’s Ragdoll physics and apply an explosion force to it. As a result, the character will be thrown away to a considerable distance and will no longer be in the control of its body movements, akin to a ragdoll.

How it works…

Unity’s Ragdoll Wizard assigns, to selected transforms, the components Collider, Rigidbody, and Character Joint. In conjunction, those components make ragdoll physics possible. However, those components must be disabled whenever we want our character to be animated and controlled by the player. In our case, we switch those components on and off using the RagdollCharacter script and its two functions: ActivateRagdoll() and DeactivateRagdoll(), the latter including instructions to re-spawn our character in the appropriate place.

For the testing purposes, we have also created the Landmine script, which calls RagdollCharacter script’s function named ActivateRagdoll(). It also applies an explosion force to our ragdoll character, throwing it outside the explosion site.

There’s more…

Instead of resetting the character’s transform settings, you could have destroyed its gameObject and instantiated a new one over the respawn point using Tags. For more information on this subject, check Unity’s documentation at: http://docs.unity3d.com/ScriptReference/GameObject.FindGameObjectsWithTag.html.

Summary

In this article we learned how to apply Ragdoll physics to a character. We also learned how to setup Ragdoll for the character of the game.

To learn more please refer to the following books:

  • Learning Unity 2D Game Development by Examplehttps://www.packtpub.com/game-development/learning-unity-2d-game-development-example.
  • Unity Game Development Blueprintshttps://www.packtpub.com/game-development/unity-game-development-blueprints.
  • Getting Started with Unityhttps://www.packtpub.com/game-development/getting-started-unity.

Resources for Article:


Further resources on this subject:


Packt

Share
Published by
Packt

Recent Posts

Top life hacks for prepping for your IT certification exam

I remember deciding to pursue my first IT certification, the CompTIA A+. I had signed…

3 years ago

Learn Transformers for Natural Language Processing with Denis Rothman

Key takeaways The transformer architecture has proved to be revolutionary in outperforming the classical RNN…

3 years ago

Learning Essential Linux Commands for Navigating the Shell Effectively

Once we learn how to deploy an Ubuntu server, how to manage users, and how…

3 years ago

Clean Coding in Python with Mariano Anaya

Key-takeaways:   Clean code isn’t just a nice thing to have or a luxury in software projects; it's a necessity. If we…

3 years ago

Exploring Forms in Angular – types, benefits and differences   

While developing a web application, or setting dynamic pages and meta tags we need to deal with…

3 years ago

Gain Practical Expertise with the Latest Edition of Software Architecture with C# 9 and .NET 5

Software architecture is one of the most discussed topics in the software industry today, and…

3 years ago