Unity/정보

[Unity] 휴머노이드 애니메이션을 활용한 상체와 하체의 방향 조정 방법

달시_Dalsi 2024. 9. 4. 02:12

 

 Unity에서 캐릭터 애니메이션을 구현할 때, 상체와 하체를 각각 다른 방향으로 향하게 하는 것은 다양한 게임에서 중요한 요소입니다. 예를 들어, FPS 게임에서 플레이어가 상체는 오른쪽을 조준하면서 하체는 앞으로 뛰는 상황을 구현하고 싶다면, 상체와 하체의 애니메이션 방향을 별도로 조정해야 합니다. 이번 글에서는 이러한 기능을 구현하는 여러 방법 중 하나를 소개하겠습니다.

위 사진처럼 캐릭터의 상체와 하체 등 부위별로 서로 다른 방향을 주는 것이 최종 목표입니다. 부위별로 다른 애니메이션을 재생하는 방법은 이미 널리 알려져 있으므로, 이번에는 다루지 않겠습니다.

작업할 캐릭터 모델 준비

캐릭터와 애니메이션은 무료로 제공되는 사이트인 Mixamo에서 가져옵시다.

www.mixamo.com

 

Mixamo

 

www.mixamo.com

 

자신이 보유한 캐릭터에 Mixamo의 애니메이션을 적용할 수 있을 뿐만 아니라, Mixamo에서 제공하는 캐릭터와 애니메이션을 조합해 다운로드할 수도 있어 혼자 개발할 때 매우 유용한 사이트입니다. 이번에는 아래 두 가지 캐릭터와 애니메이션을 조합해 사용하겠습니다.

 

 

캐릭터와 애니메이션을 선택하면 오른쪽에서 미리보기를 확인할 수 있으며, '다운로드' 버튼을 누르면 아래와 같은 창이 나타납니다.

옵션을 사진과 동일하게 설정한 후, 다시 '다운로드' 버튼을 눌러주세요.

 

 

 

캐릭터 모델(애니메이션) 옵션 설정

다운로드한 캐릭터 모델의 Rig 탭에서 옵션을 다음과 같이 설정해줍시다.

 

Animation 탭 -> Mask -> Definition에서 'Create From This Model'을 선택한 후, TransForm 항목에서 체크 여부를 확인하면 체크할 수 있는 칸들이 있습니다. 이 부분은 애니메이션마다 자동으로 체크되기도 하고, 안되기도 하므로, 사용하려는 애니메이션이 휴머노이드로 전환될 때마다 꼭 확인해야 합니다. 만약 체크가 안되어 있다면 해당 부분의 애니메이션은 재생되지 않습니다. (참고로, idle 애니메이션이라면 Loop를 활성화해 주세요.)

아래 사진의 옵션도 예상되는 애니메이션을 보면서, 각 애니메이션이 자연스럽게 재생되도록 세부 설정을 조정해줘야 합니다.

이제 캐릭터를 씬에 배치하고, idle 애니메이션을 포함한 애니메이터를 오브젝트에 추가해줍니다. 이후 애니메이터의 아바타에 값이 제대로 들어가 있는지 확인합니다.

 

 
 

 

코드 작성

이제 새로운 스크립트를 만들어서 오브젝트에 추가해줍시다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotateAvatar : MonoBehaviour
{
    public Transform spine; // 아바타의 상체
    public Animator myani;
    public Transform LookTarget;

    void Start()
    {
        myani = transform.GetComponent<Animator>();
        spine = myani.GetBoneTransform(HumanBodyBones.Spine); // 상체 transform 가져오기
    }

    private void LateUpdate()
    {
        spine.transform.LookAt(LookTarget.position);
    }
}

 

 

spine 변수는 방향을 조정할 아바타의 특정 부위인 Transform을 참조합니다.
myani는 애니메이터 컴포넌트를 참 조합니다.

LookTarget은 상체가 바라볼 목표물의 Transform을 참조합니다.
LateUpdate에서 상체의 방향을 목표물 쪽으로 조정합니다.

 

원하는 부위 설정을 위해서는 캐릭터 모델의 Rig 탭에서 'Configure…' 버튼을 클릭하거나, 캐릭터의 아바타를 클릭하여 직접 접근할 수 있습니다.

들어가면 인스펙터 창에서 각 위치마다 캐릭터의 뼈대가 표시되는 것을 확인할 수 있습니다. 원하는 부위가 포함된 부분의 이름을 스크립트에서 가져와 사용하면 해당 부위를 조정할 수 있습니다. (본인은 상체 전체를 사용하기 위해 Spine을 참조한 것입니다.)

마지막으로 LateUpdate에서 방향 값을 조절해주는 코드를 작성하면 됩니다.

Update가 아닌 LateUpdate를 사용해야 한다는 점을 잊지 마세요.

 

결과

다시 씬으로 돌아와서 우리가 정한 부위가 바라볼 오브젝트를 하나 생성해줍니다.

본인은 LookAt을 사용했으므로 큐브를 하나 생성하여 변수에 할당했습니다. (물론 LookAt 외에도 방향을 조절하는 다양한 방법을 사용할 수 있습니다.)

 

위 사진처럼 씬에 캐릭터를 배치하고, Idle 애니메이션만 추가해줍니다. 실행한 후 목표물을 이리저리 움직이면 캐릭터도 함께 움직이는 것을 확인할 수 있습니다.

 

추가로 설명하자면, 현재 방식은 뼈대의 방향을 원하는 방향으로 고정시키기 때문에 원래의 애니메이션이 어색하게 변할 수 있습니다. 해결 방법 중 하나는 게임 실행 후 자신이 원하는 부위에 부모 오브젝트를 따로 설정하는 것입니다. 이렇게 하면 부모 오브젝트를 조절하여 문제를 해결할 수 있습니다.