Unity Engine

[Unity] Animation Controller

Aostols 2023. 4. 23. 18:08
반응형

 

애니메이션을 제어하기 위해서는 Animation Controller 컴포넌트를 사용합니다.

Animation Controller 는 StateMachine 으로 동작하며 StateMachine의 가장 큰 특징은 하나의 State만 존재한다는데 있습니다.

기본적인 모습은 위와 같으며 기본적으로는 위의 상태중 하나만 가지고 있습니다.

각각의 화살표는 Transition을 나타내며 각 State를 이동하는 조건을 나타 낼 수 있습니다.

 

Animator 창에서 Animation Controller를 보게 되면 Parameters 탭이 있는데 여기서 Transition에서 사용할 parameter 들을 설정 할 수 있습니다.

+버튼을 눌러서 타입을 정할 수 있고 이름을 변경 할 수 있습니다.

 

 

Transition을 선택하고 나오는 속성들 입니다.

가장 하단의 Conditions 가 Parameters 를 사용하는 란 입니다.

여기서 원하는 Parameters를 넣어주면 해당 Parameter 의 상태가 같아진다면 Transiton전환이 일어나게 됩니다.

Animator animator;
    
// Use this for initialization
void Start () {
    animator = GetComponent<Animator>();
}

// Update is called once per frame
void Update () {
    float h = Input.GetAxis("Horizontal");
    float v = Input.GetAxis("Vertical");
    bool fire = Input.GetButtonDown("Fire1");

    animator.SetFloat("Forward",v);
    animator.SetFloat("Strafe",h);
    animator.SetBool("Fire", fire);
}

 

 

Int형 Parameter의 경우 위와 같이크거나, 작거나, 같거나, 같지 않거나 등으로 설정 할 수 있습니다.

 

혹은 Parameter로 설정하고 싶지 않고 단순히 애니메이션의 시간으로 제어 하고 싶은 경우가 있는데 이때는 가장 위의 Has Exit Time을 체크해 주면 됩니다.

기본값은 '체크됨' 입니다.

체크 하게되면 Exit Time이 활성화 되는데 이 시간이 지난다면 Transition 전환이 이루어 지게 됩니다.

Exit Time 값의 단위는 실수입니다.

기본값인 0.75는 75%의 애니메이션이 재생된 것을 의미합니다.

1 이상의 값을 넣을 수도 있는데 반복횟수로 체크됩니다.

3.5를 넣었을 경우 3번 반복하고 4번째 재생의 50%인 시점입니다.

 

Fixed Duration 항목은 Transition Duration을 어떤식으로 쓸 것인가 인데 체크를 하게 되면 고정값(초)로 표시되게 됩니다.

체크를 해제하게 되면 %로 Exit Time과 같은 룰이 적용 됩니다.

 

레이어의 경우 마스킹을 더하여 여러가지 애니메이션을 부분적으로 적용할 수 있는 기능입니다.

레이어 우측의 톱니바퀴버튼을 누르면 오른쪽 상세 설정이 표시되는데 마스크를 설정하거나 Blending 을 설정할 수 있습니다.

 

레이어 마스크는 Asset 뷰에서 우클릭으로 Avatar Mask로 만들 수 있습니다.

Bone을 선택하면 해당 Bone들만 애니메이션이 적용 됩니다.

 

Blending 의 경우 Override와 Additive가 있습니다.

 

Override

Override는 아래 레이어가 위 레이어를 덮어버리게 됩니다.

만일 Override 타입에 Mask를 쓰게 된다면 해당 Mask된 영역만 애니메이션이 적용되게 됩니다.

예를들어 기본을 걷는 모션을 만들고 Override로 상체만 Mask하여 공격모션을 적용한다면 하체는 걷고 상체는 공격하는 모션을 만들 수 있습니다.

 

Additive

Additive는 아래 레이어의 내용을 윗레이어에 더하게 됩니다.

예를들어 피격모션의 경우 움찔하는 형태를 띄게 되는데 윗 레이어가 어떤 형태를 하고 있건 간에 움찔하는 애니메이션을 추가해서 피격 모션을 표현 할 수 있습니다.

 

여기에 레이어 자체의 비중을 변경할수 있는 기능이 있습니다.

위 이미지에서는 Base Layer가 선택되어 있고 가장 위 레이어라 Weight 설정이 보이나 변경 불가능 한 상태 입니다.

하지만 아래 레이어를 선택하게 되면 Weight 설정을 변경 할 수 있습니다.

 

예를들어 이러한 설정도 가능합니다.

BaseLayer 는 걷는 모션

Override Layer는 공격하는 모션

Override Layer는 상체 Mask

Override Layer의 Weight는 0.7

 

이렇게 설정 한다면 하체는 걷는 모션에 상체는 공격 7:걷기3이 섞여 있는 애니메이션이 출력되게 됩니다.

 

private void SetLayerWeight(int layer, float weight)
{
    animator.SetLayerWeight(layer, weight);
}

위와 같이 스크립트로 레이어의 Weight를 당연히 설정 할 수 있습니다.

또한 중요한 점은 Layer의 Weight가 한번에 바뀌게 되면 애니메이션이 튀는 현상이 나타나게 되는데 이를 해소하기 위해서는 Weight를 점진적으로 변경해야 합니다.

그럴때는 코루틴으로 만들어 적용하게 되면 Layer Weight를 점진적으로 변경시켜 자연스러운 Layer Blending을 만들 수 있습니다.

반응형

'Unity Engine' 카테고리의 다른 글

[Unity]ECS - 2  (0) 2023.12.19
[Unity]ECS  (1) 2023.12.05
[Unity] ScriptableObject + Reflection  (0) 2023.03.28
[Unity]Job System + String  (0) 2023.03.03
Cinemachine - Impulse + SecondaryNoise  (0) 2023.02.09