Unity 강의/Unity Course(2) - 절대강좌! 유니티

[Unity Course 2] 04. 주인공 캐릭터 제작 : 애니메이션

첨부엉. 2024. 6. 18. 18:08
반응형

 

위키북스 출판사 이재현 저자님의 '절대강좌! 유니티' 책을 참고하여 필기한 내용입니다.

 

애니메이션

레거시 애니메이션 : 하위 호환성을 고려한 애니메이션 소스 코드로 컨트롤해야 함

메카님 애니메이션 : 모션 캡처 애니메이션, 리타게팅 기능

 

주인공 캐릭터는 레거시 애니메이션 타입으로 구현하고 적 캐릭터는 메카님 애니메이션으로 구현

 

리소스의 Resources/Animations 폴더에서 PlayerAnimation 패키지를 임포트 한다.

 

 

Animation Type 옵션 설명
None 애니메이션을 사용하지 않는다
Legacy 하위 호환성을 유지하기 위한 이전 방식의 애니메이션
Generic 메카님 애니메이션, 인체형 모델이 아닌 3D 모델에 적용, 리타게팅할 수 없음
Humanoid 메카님 애니메이션, 리타게팅이 가능하며, 사람과 같이 2족 보행하는 모델에 적용

 

레거시 애니메이션 : Animation 컴포넌트

메카님 애니메이션 : Animator 컴포넌트

 

Animation, Animator 컴포넌트 모두 애니메이션과 관련되어 있지만 작동방식이 다르다.

**3D 모델에 추가된 컴포넌트의 종류를 보고 해당 모데리의 애니메이션 유형이 무엇으로 설정됐는지 구별 가능해야됨

 

애니메이션 클립

 : 캐릭터의 걷기, 달리기, 점프, 총쏘기와 같은 동작을 기록한 파일을 말함

애니메이션 컴포넌트는 애니메이션 클립에 기록된 관절의 위치와 회전 값을 프레임 단위로 재생시키는 역할

 

3D 모델링 툴에서 제작한 애니메이션 클립을 애니메이션 파일로 만드는 방법

1. 모든 애니메이션 클립이 하나의 애니메이션 파일에 들어있고 각 애니메이션 클립이 시작프레임과 종료 프레임을 갖고 있음 (개발자가 직접 분리해서 사용해야됨)

2. 위와 동일하나 미리 분리되어 나오는 경우

3. 애니메이션 클립을 동작별로 분리해 놓은 별도의 파일

 

세번째 방식이 편리하다.

 

애니메이션 적용

Idle 애니메이션을 선택하고 프로젝트 뷰에 있는 Player를 드래그 앤 드롭한다.

 

다섯개의 애니메이션만 사용하는데

각 애니메이션의 Wrap Mode 를 Loop 로 설정한다.

 

Animation 컴포넌트 속성

1. 실행되면 처음 동작하는 애니메이션 클립을 연결하는 속성

2. 배열 타입의 속성으로 실행할 수 있는 애니메이션 클립을 저장(이 목록에 없는 애니메이션은 실행 불가)

 

하이어라키 뷰에서 Player를 선택후 잠근다음 Animations에 드래그앤 드롭

이때 여러 파일을 선택하기 위해서는 Ctrl 누르고 선택

 

Animation 에는 Idle를 넣는다.

Animation 컴포넌트의 Play Automatically 속성은 애니메이션 클립을 자동으로 실행하는 옵션

이를 해체하고 코드로 추가

 

using UnityEngine;

public class PlayerCtrl : MonoBehaviour
{
    [SerializeField]
    private Transform tr;
    // 이동 속력 변수
    public float moveSpeed = 10.0f;
    // 회전 속도 변수
    public float turnSpeed = 80.0f;
    // Animation 컴포넌트를 저장할 변수
    private Animation anim;

    void Start()
    {
        // 컴포넌트를 추출해 변수에 대입
        tr = GetComponent<Transform>();
        anim = GetComponent<Animation>();

        anim.Play("Idle");

    }
    
    ...생략

 

anim로 컴포넌트를 추출해 저장하고 .Play() 함수를 사용하여 재생한다.

함수의 인자는 애니메이션 클립명을 문자열로 넘긴다.

 

애니메이션 블렌딩

현재 수행중인 애니메이션에서 다른 애니메이션으로 넘어갈 때 부드럽게 연결해주는 기능 제공

using UnityEngine;

public class PlayerCtrl : MonoBehaviour
{
    [SerializeField]
    private Transform tr;
    // 이동 속력 변수
    public float moveSpeed = 10.0f;
    // 회전 속도 변수
    public float turnSpeed = 80.0f;
    // Animation 컴포넌트를 저장할 변수
    private Animation anim;

    void Start()
    {
        // 컴포넌트를 추출해 변수에 대입
        tr = GetComponent<Transform>();
        anim = GetComponent<Animation>();

        anim.Play("Idle");

    }

    void Update()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");  
        float r = Input.GetAxis("Mouse X");


        // 전후좌우 이동할 방향 벡터 계산
        Vector3 moveDir = (Vector3.forward * v) + (Vector3.right * h);

        // Translate 함수를 사용한 이동 로직
        tr.Translate(moveDir.normalized * Time.deltaTime * moveSpeed);

        // Vector3.up 축을 기준으로 turnSpeed만큼의 속도로 회전
        tr.Rotate(Vector3.up * turnSpeed * Time.deltaTime * r);

        PlayerAnim(h, v);
    }

    void PlayerAnim(float h, float v)
    {
        // 키보드 입력값을 기준으로 동작할 애니메이션 실행

        if(v>= 0.1f){
            anim.CrossFade("RunF", 0.25f); // 전진 애니메이션 실행
        }
        else if(v <= -0.1f){
            anim.CrossFade("RunB", 0.25f); // 후진 애니메이션 실행  
        }
        else if (h >= 0.1f){
            anim.CrossFade("RunR", 0.25f); // 오른쪽 이동 애니메이션 실행
        }
        else if (h <= -0.25f){
            anim.CrossFade("RunL", 0.25f); // 왼쪽 이동 애니메이션 실행
        }
        else{
            anim.CrossFade("Idle", 0.25f); // 정지 시 Idle 애니메이션 실행
        }
    }
}

위와 같이 코드 변경

 

Animation.CrossFade("변경할 애니메이션 클립의 명칭", 페이드아웃 시간);

단순히 정해진 시간동안 애니메이션이 변경되는 것이 아니라 애니메이션 키프레임을 보간해 부드럽게 보정

반응형