새소식

Unity/VR

[Unity] VR 캐릭터 하체 애니메이션 컨트롤러 조작

  • -

개요

 

VR(퀘스트2) 컨트롤러의 스틱으로 캐릭터의 하체 애니메이션을 조작해 보자.

 

그전에 기본 상태(Idle) 애니메이션과 걷는(Walking) 애니메이션이 필요한데 Mixamo에서 구할 수 있다.

 

Mixamo

 

www.mixamo.com

 

이전에 진행했던 프로젝트를 이어서 한다.

 

[Unity] VR 캐릭터 손 애니메이션 컨트롤러 조작

개요 VR(퀘스트2) 컨트롤러의 트리거(검지)와 그립 버튼(중지)에 따라 캐릭터의 손이 집게손가락이 되거나 주먹을 쥐게 해 보자. 이전에 진행했던 VR 기기와 캐릭터 모델이 연동된 상태에서 계속

teinoi.tistory.com

 


 

사전 세팅

 

캐릭터 모델이 휴머노이드 타입이며 아바타가 생성되어 있는지 확인한다.

 

적용할 애니메이션 클립의 Rig 탭을 다음과 같이 변경 및 할당한다.

 

Animation Type : Humanoid

Avatar Definition : Copy From Other Avatar

Source : 캐릭터 모델의 아바타

 

애니메이션 반복을 위해 Animation 탭에서 Loop Time 속성을 체크한다.

 

프로젝트 뷰에서 Avatar Mask를 생성하여 위 이미지같이 하체만 애니메이션이 적용되게 세팅한다.

 


 

애니메이터 컨트롤러 세팅

 

캐릭터의 애니메티어 컨트롤러를 다음과 같이 세팅한다.

 

레이어 설정에서 Mask 항목에 생성했던 아바타 마스크를 할당하고 IK Pass 옵션을 체크한다.

 

그리고 기본 상태(Idle) 애니메이션과 걷는(Walking) 애니메이션을 서로 연결하여 전환할 수 있게 한다.

 

Bool 타입과 Float 타입의 파라미터를 만든다.

Bool 타입 파라미터 - 애니메이션을 전환하기 위해 사용
Float 타입 파리미터 - 캐릭터가 뒤로 걷는 것을 구현하기 위해 사용

 

서로 연결된 Transition의 조건을 다음과 같이 세팅한다.

 

Idle > Walking : Bool 타입 파라미터 = true

Walking > Idle : Bool 타입 파라미터 = false

 


 

컨트롤러와 애니메이션 연동

 

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

public class AnimationController : MonoBehaviour
{
    public InputActionReference move;
    public Animator animator;

    void OnEnable()
    {
        move.action.started += OnMoveStarted;
        move.action.canceled += OnMoveCanceled;
    }

    void OnDisable()
    {
        move.action.started -= OnMoveStarted;
        move.action.canceled -= OnMoveCanceled;
    }

    void OnMoveStarted(InputAction.CallbackContext context)
    {
        float moveInputY = context.ReadValue<Vector2>().y;

        bool isMovingForward = moveInputY > 0;
        float animationSpeed = isMovingForward ? 1 : -1;

        SetAnimationParameters(true, animationSpeed);
    }

    void OnMoveCanceled(InputAction.CallbackContext context)
    {
        SetAnimationParameters(false, 0);
    }

    void SetAnimationParameters(bool isWalking, float animSpeed)
    {
        animator.SetBool("isWalking", isWalking);
        animator.SetFloat("animSpeed", animSpeed);
    }
}

AnimationController.cs

 

InputSystem을 사용해서 컨트롤러 조작을 체크한다.

 

캐릭터에 스크립트를 적용하고 조작할 컨트롤러와 애니메이터를 할당한다.

 

Move : XRI LeftHand Locomotion/Move(왼쪽 컨트롤러 스틱)

Animator : 캐릭터의 애니메이터

 

실행 결과

왼쪽 컨트롤러 스틱 조작으로 애니메이션이 조작되는 모습

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.