Animation

·2023년 4월 14일
0

Unity

목록 보기
13/22

📌Animation


애니메이터분들이 미리 세팅된 Animation을 만들어준다
Unity 모델에도 유니티짱에서 만들어진 Animation이 작동한다.
(Animation타입 Humanoid)

애니메이션 리타겟팅

같은 스켈레톤 에셋을 공유하나 비율이 다른 캐릭터간에 애니메이션 재사용할 수 있도록
(체형 달라도 사용할 수 있게)
이것 때문에 유니티짱 Animation이 기본 Unity모델에도 적용된다

Animation
레거시 애니메이션(구버전에서 사용하는 애니메이션)
요즘은 사용안한다고함


📌Animator


요즘은 이걸쓴다고한다
메카님 애니메이션(메카님은 Unity에 통합된 애니메이션 소프트웨어의 이름)

Controller

기본으로 세팅된 것도 있지만 교육을 위해서 새로 만든다

열어보면 이런창이 나온다(Entry가 시작점)

애니메이션 적용

Animator에 Controller 설정을 한다

WAIT

Run

Entry(시작지점)을 RUN과 연결시키고 실행한다

코드로 구현

        if (_moveToDest)
        {
            Animator anim = GetComponent<Animator>();
            anim.Play("RUN");
        }
        else
        {
            Animator anim = GetComponent<Animator>();
            anim.Play("WAIT");
        }

📌Animation Blending


멈출 때 부자연스럽게 한순간에 멈추는 애니메이션 수정을 위해서
회전할 때 Slerp 사용한 것처럼 blending을 사용해서 일정 퍼센트 wait/run한다

Blend에 WAIT와 RUN을 추가해서 서로 블렌딩한다.

Thresho는 애니메이션 그래프 상의 위치를 뜻한다
0~1 사이의 값은 WAIT00와 RUN00_F가 블렌딩 될 것이라는걸 뜻한다.

Lerp

이를 표현하기 위해서 Lerp를 사용한다

 if (_moveToDest)
        {
            //현재값에서 1쪽으로 일정비율로 간다
            wait_run_ratio = Mathf.Lerp(wait_run_ratio, 1, 10.0f * Time.deltaTime);
            Animator anim = GetComponent<Animator>();
            anim.SetFloat("wait_run_ratio", wait_run_ratio);
            anim.Play("WAIT_RUN");
        }
        else
        {
            wait_run_ratio = Mathf.Lerp(wait_run_ratio, 0, 10.0f * Time.deltaTime);
            Animator anim = GetComponent<Animator>();
            anim.SetFloat("wait_run_ratio", wait_run_ratio);
            anim.Play("WAIT_RUN");
        }

📌State패턴


위와같이 블렌딩을 사용할 때 문제점

  1. 애니메이션이 아주 많다면 일일이 하나한 블렌딩 수치 맞추기 어렵다
  2. 코드상 하드 코딩 하는것도 찝찝하다
  3. 다른 여러가지 상태도 있다면 구현이 힘들어진다
    ex) 점프 , 떨어지는거, 스킬캐스팅, 스킬채널링

State패턴

내 상태에서 적용할 수 있는 코드를 분리할 수 있는 장점
단점 : 동시에 두가지 상태를 가질 수 없다

State구현

public enum PlayerState
    { 
        Die,
        Moving,
        Idle,
    }

    PlayerState _state = PlayerState.Idle;

void Update()
    {
        switch (_state)
        {
            case PlayerState.Die:
                UpdateDie();
                break;
            case PlayerState.Moving:
                UpdateMoving();
                break;
            case PlayerState.Idle:
                UpdateIdle();
                break;
        }
    }

State마다 만들어진 함수에 대응되는 코드와 애니메이션을 넣으면된다.

다른상태로 전환

 if (dir.magnitude < 0.0001f)
        {
            _state = PlayerState.Idle;
        }

한 상태에서 다른 상태로 가기 위한 조건을 정의하게 된다
위는 Moving State에서 위치에 도착하면 Idle State로 바뀌는 상태이다


📌State Machine


한 상태에서 다른 상태로 넘어가기 위한 조건을 달아줘야한다(없으면 기본 조건으로 넘어감)

코드로 구현가능한데 왜 이렇게 만드나?

State가 엄청 늘어나서 조건이 복잡해질수록 코드로 하는것 보다
상태관리를 툴로 하면 보기가 편하고 관리가 용이하다

그냥 연결했을 때

Blending조절

툴로 편하게 조절 가능

Has Exit Time

끝나는 지점이 있다 -> 애니메이션을 실행한번 한뒤에 빠져나와라
Has Exit Time을 체크안하면 같은 애니메이션 무한반복된다

Blend 세부세팅

Exit Time : 얼마정도 기다렸다가 넘어갈꺼나
Fixed Duration : 절대시간
ex) Fixed Duration (O) 0.55초
Fixed Duration (X) 55%

동작순서

(하나에 여러개 연결하고 조건이 없을시 기준)
Exit Time 작은것이 우선이고 같은 경우는 Transitions 순서대로 동작


📌State Machine 조건설정


경우에 따라서는 자동으로 연결했을 때 좋은경우가 있다
ex) 점프: 점프할 때 조금씩 달라지는 모습(점프 -> 최고점 -> 내려올 때 모습)
일반적인 달리기 멈추기는 조건으로 만들어줘야한다

파라미터 조건

파라미터 조건을 가지고 State Machine 조건을 설정한다
프로그램(코드) <-> 파라미터 <-> Animator(State Machine)
장점 : 애니메이션 부분과 코드 분리

구현

파라미터를 넣고 각 애니메이션 연결 부위에 조건을 달아서 코드를 설정 후 speed값을 변경시켜주면 된다

애니메이션코드

//애니메이션
Animator anim = GetComponent<Animator>();
anim.SetFloat("speed", 0);

위는 멈춰있을 때 애니메이션 부분을 구현한 것이다


추가내용

나중에 상하체 분리 애니메이션을 만들 때 애니메이션 레이어를 사용한다

이동 점프 수영 같은 경우는 State Machine으로 만들고
스킬이 많아질경우 처음한것처럼 코드로 빼서 따로 관리함

참고자료

Part3: 유니티 엔진
섹션 6.Animation(애니메이션)

애니메이션 리타겟팅
Blend
Lerp
메카님 애니메이션

profile
개인공부저장용(하루의 기록)

0개의 댓글