참치김밥은 최고의 한식이다

[유니티] Ragdoll 사용법 스크랩 (제일 이해하기 쉬웠음) 본문

Unity

[유니티] Ragdoll 사용법 스크랩 (제일 이해하기 쉬웠음)

l__j__h 2024. 1. 31. 10:17

출처 : https://wergia.tistory.com/67?category=748455

 

어떤 게임을 보면 죽은 캐릭터가 특정한 사망 애니메이션 없이 흐느적거리면서 쓰러지거나 날아가는 모습을 볼 수 있다. 고정된 사망 애니메이션이 아니라 물리적인 처리로 다양한 사망 모션을 연출하기 위한 기법으로 이것을 rag doll(랙돌, 래그돌)이라고 부른다. 래그돌의 단어적인 의미는 헝겊 인형, 봉제 완구라는 뜻인데, 캐릭터가 힘을 잃고 날아가거나 흐느적거리는 모습이 마치 헝겊 인형 같다고 해서 붙여진 이름이다.

 

이 기능을 사용하면 앞서 말했듯이 캐릭터가 사망시 특정한 애니메이션만 나오는 것이 아니라 다양한 각도나 힘으로 넘어지는 것을 연출할 수 있게 된다.

 

 

 

구현하기

 

이 래그돌 기능을 사용하기 위해서는 우선 사람의 본(bone, 뼈대) 구조를 가진 모델이 필요하다.

 

 

이 예제에서는 애셋 스토어에서 손쉽게 구할 수 있는 유니티 짱을 사용했다. 캐릭터의 기본 자세는 T자 자세를 잡고 있는 것을 사용할 것을 권장한다. 다른 포즈를 취하고 있는 모델의 경우 래그돌을 적용하면 래그돌이 쉽게 무너지는 경향이 있다.

 

 

유니티 짱 모델을 불러왔다면 Hierarchy 뷰에서 우클릭을 한 후에 3D Object>Ragdoll... 항목을 선택한다.

 

 

그러면 Create Ragdoll 창이 뜨는데 창의 각 항목에 대응되는 유니티 짱의 본을 선택해서 넣어주어야 한다. 그리고 Total Mass 값은 래그돌의 무게를 정하는 값이다. 이 값을 정해주면 사람의 평균적인 부위별 무게 비율에 맞춰 각 본들의 무게가 정해진다. 유니티에서 말하는 Mass 값의 기본 단위는 1값이 1kg이라고 하기 때문에 Total Mass 값은 임시로 45kg으로 정해주도록 하자.

 

Strength 값은 래그돌이 모양을 유지하고 붕괴되지 않도록 도와주는 힘에 대한 값이다.

 

 

래그돌이 적용된 게임에서 종종 사망한 캐릭터의 몸이 엿가락처럼 늘어나서 마구 흔들리는 문제는 이 Strength 값이 낮아서 발생하는 문제이다.

 

 

마지막으로 Create 버튼을 클릭하면 모델링의 신체 각 부위에 콜라이더들이 씌워진 것을 볼 수 있다. 이러면 캐릭터에 래그돌이 성공적으로 적용된 것이다.

 

 

 

 

플레이 버튼을 눌러보면 유니티 짱이 힘없이 쓰러지는 장면을 볼 수 있다. 머리카락 부위가 뻣뻣한 것이 보이긴 여기에 추가적인 본이 있다면 머리카락 쪽에도 래그돌 기능을 넣어줄 수 있다.

 

 

 

물리적인 힘 가하기

 

게임에서 캐릭터들이 죽은 뒤에 진행 방향이나 공격 받은 방향의 반대로 날아가는 것을 자주 볼 수 있는데, 이 기능은 유니티 상에서 구현하기 어렵지 않다. 래그돌 기능이 적용된 각 신체 부위의 경우, 물리적인 힘을 받을 수 있는 리지드 바디(Rigidbody)를 가지고 있다. 코드 상에서 원하는 신체 부위의 리지드 바디에 AddForce를 가해주면 캐릭터가 날아가는 것을 볼 수 있다.

 

using UnityEngine;

public class RagDollPhysics : MonoBehaviour
{
    [SerializeField]
    Rigidbody spineRigidBody;
   
    // Update is called once per frame
    void Update ()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            spineRigidBody.AddForce(new Vector3(0f, 10000f, 10000f));
        }
    }
}

 

위의 코드는 Space 키를 누르면 캐릭터의 리지드 바디에 특정한 방향으로 힘을 가하는 코드이다.

 

 

작성한 스크립트를 유니티 짱 모델에 넣어주고 래그돌이 적용된 본들 중에 원하는 본을 스크립트에 넣어준다. 예제에서는 신체의 상단 중심이 되는 가슴쪽 척추의 리지드 바디를 선택했다.

 

 

 

 

모든 작업이 끝났다면 플레이 버튼을 누르고 Space 키를 눌러보자. 그러면 유니티 짱이 쓰러지려다 앞으로 날아가는 것을 볼 수 있을 것이다.

 


 

래그돌을 이용하는 방법을 추가로 이야기하자면, 이런 래그돌 오브젝트를 만들어둔 다음, 애니메이션이 포함된 일반 캐릭터가 정상적으로 움직이다가 캐릭터가 죽으면 일반 캐릭터 오브젝트의 액티브를 끄고 래그돌 오브젝트의 액티브를 켜서 교체하는 식으로 자주 사용된다.

 

래그돌의 성능은 캐릭터의 사지 전체와 몸통의 관절에 대한 물리를 모두 계산해야하기 때문에 조금은 무거운 편에 속한다. 그렇기 때문에 일반적으로는 캐릭터가 죽고난 이후 몇 초간 물리를 켜두다가 그 이후에 더 이상 움직임이 거의 없는 상태가 되면 물리 계산을 끄거나, 아예 오브젝트를 지우는 방식으로 최적화를 해주어야 한다.

출처: https://wergia.tistory.com/67?category=748455 [베르의 프로그래밍 노트:티스토리]

728x90