Unity/정보

[Unity] 아바타 마스크를 이용해서 부위별로 방향 분리 하는 방법

달시_Dalsi 2023. 4. 21. 08:32

 

 

위 사진처럼 캐릭터의 부위별(상체, 하체 등)로 방향을 다르게 주는 것이 최종 목표이다.

부위별로 다른 애니메이션 재생은 많이 알려져 있으므로 다루지 않을 것이다.

 

1. 작업 할 캐릭터 모델을 받아오자

 

캐릭터와 애니메이션을 무료로 가져올 수 있는 사이트인 믹사모에서 가져오자.

 

https://www.mixamo.com/#/

 

자신이 가진 캐릭터를 사이트를 이용하여 믹사모의 애니메이션을 적용 시킬수도 있고 믹사모 캐릭터와 애니메이션을 조합하여 다운로드 할 수도 있으니 여러모로 혼자 개발할 때 유용한 사이트다.

지금 캐릭터, 애니메이션은 아래의 두가지를 조합하자.

캐릭터와 애니메이션을 선택하면 오른쪽에서 미리보기를 볼 수 있으며 다운로드를 누르면 아래와 같은 창이 뜬다.

옵션은 사진과 동일하게 한 뒤에 다시 다운로드를 누르자.

 


 

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

 

다운로드 받은 캐릭터 모델의 Rig탭의 옵션을 다음과 같이 설정하자

Animation탭 -> Mask -> Definition을 자기 모델에서 만드는 것으로

택한 뒤에 TransForm에 체크사항을 보면 체크유무가 가능한 칸들이 있다.

이게 애니메이션마다 자동으로 체크가 되는 것이 있고 안되는 것이 있으므로

사용하고자 하는 애니메이션마다 휴머노이드로 전환 시 확인을 해줘야한다.

체크가 안되어 있다면 해당 부분은 당연히 애니메이션 재생이 안될 것이다.

(idle 애니메이션이니 Loop를 활성화 해주자)

아래 사진의 옵션도 예상 애니메이션을 보면서 각 애니메이션마다 자연스럽게 재생되도록 옵션을 만져줘야한다.

이제 캐릭터를 신에 배치하고 idle 애니메이션을 넣은 애니메이터를 오브젝트에 추가해주자.

여기서 애니메이터 아바타에 값이 잘들어가 있는지 확인하자


3. 코드 작성

 

이제 스크립트를 하나 만들어서 넣어주자

코드는 아래와 같다.

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);
    }
}
 

코드는 간단하다.

방향을 돌려줄 아바타의 특정 부위를 넣어줄 Transform 변수를 선언한다.

아바타를 가져오기위해 애니메이터를 변수로 넣어주고

애니메이터의 아바타에 있는 원하는 부위를 Transform변수에 넣어준다.

 

여기서 원하는 부위란, 캐릭터 모델의 Rig 탭의 Configure…라고 되있는 버튼을 클릭해서 들어가자

(캐릭터의 아바타를 클릭해서 바로 들어가는 방법도 있다.)

들어가게 되면 인스펙터창에 각 위치마다 캐릭터의 뼈대가 들어가있음을 알수있다.

그래서 자신이 원하는 부위가 들어간 부분의 이름을 스크립트로 가져와서 쓰면 해당 부분을 조절 할 수 있는 것이다.

(본인은 상체 전체를 사용하기에 Spine을 가져온 것)

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

Update가 아닌 LateUpdate임을 잊지말자.

 


4. 결과 확인

 

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

본인은 Lookat을 사용했으니 큐브를 하나 생성해서 변수에 넣어주었다.

(당연히 Lookat말고 방향을 조절하는 방법 모든 것을 사용가능하다.)

위 사진처럼 씬에 캐릭터를 설치하고 Idle 애니메이션만 넣어주자

 

그리고 실행하고 목표물을 이리저리 움직여주면 캐릭터도 움직이는 것을 볼 수 있다.

추가로 설명하자면 지금 방식은 뼈대의 방향을 원하는 방향으로 고정시키는 것이므로

원래의 애니메이션이 어색하게 바뀔수도 있다.

 

해결방법 중 한가지는 자신이 원하는 부위에 게임 실행후 부모 오브젝트를 따로 설정해주어

부모 오브젝트를 조절하면 해결될것이다.

 

'Unity > 정보' 카테고리의 다른 글

[Unity] 경량화된 notosans 폰트  (0) 2023.05.09
[Unity] 사용자 커스텀 마우스 커서 적용  (0) 2023.04.25
[Unity] apk 용량 경량화 방법들  (0) 2023.04.21
[Unity] UI 드래그 이동  (0) 2023.04.20
[Unity] 스크롤바 UI Prefab  (0) 2023.04.20