[Unity] 본 캠프 3주차 Unity 입문 팀 프로젝트 - 애니메이터 오버라이드 컨트롤러

jhj603·2024년 5월 26일
0

팀 프로젝트를 위해 강의를 들으면서 공부를 하던 중, 손쉽게 애니메이션을 교체할 수 있는 애니메이터 오버라이드에 대해 알게 됐습니다.

비록, 팀 프로젝트에서는 애니메이션을 사용할 일이 거의 없었지만 굉장히 편리한 기능이라 생각해 이에 대해 공부해서 개인 공부 프로젝트에 적용시켜 본 것을 적어보겠습니다.


애니메이터 오버라이드 컨트롤러

Animator Override Controller : 같은 애니메이션 구성을 가진 다른 GameObject가 있을 경우, 애니메이션 파일만 바꿔 같은 애니메이터를 활용하게 하는 컴포넌트

기존의 애니메이션을 사용하던 방법으로는 플레이어나 몬스터들을 만들 때, 애니메이션의 상태들은 같으나 이미지만 바뀌기 때문에 이미지에 맞는 애니메이터 컨트롤러와 애니메이션 파일들을 만들어야 했습니다.

그리고 각 이미지에 맞는 캐릭터 프리팹들을 만들어주거나, 기존 프리팹의 애니메이터에서 캐릭터 타입에 따른 트랜지션 설정을 통해 애니메이션을 바꾸는 등의 방법으로 교체할 수 있었습니다.

저는 기존 프리팹의 애니메이터에서 트랜지션 설정을 통해 바꿨었는데, 캐릭터의 종류가 늘어나면 그만큼 트랜지션이 복잡해지는 것을 느꼈습니다.

애니메이터 오버라이드 컨트롤러는 이러한 행위들을 하지 않고도 손쉽게 애니메이터 컨트롤러와 애니메이션 파일들을 교체할 수 있게 해줍니다.

애니메이터 오버라이드 컨트롤러 적용법

우선, 각 캐릭터 이미지 별로 애니메이터 컨트롤러와 애니메이션 파일들은 만들어야 합니다.

플레이어 캐릭터의 이미지를 선택하게끔 만들었기 때문에 기존 캐릭터 애니메이터 컨트롤러 Character와 애니메이션 파일들 player_idle, player_walking을 만들었습니다.

그리고 변경될 캐릭터의 애니메이터 컨트롤러 KnightCharacter와 애니메이션 파일들 player_idle_knight, player_walking_knight를 만들었습니다.

이 때, KnightCharacter는 평범한 애니메이터 컨트롤러가 아닌 애니메이터 오버라이드 컨트롤러로 만들어줘야 합니다.

애니메이터 오버라이드 컨트롤러 만드는 법

  • Project 창 우클릭 -> Create 클릭 -> Animator Override Controller 클릭

위의 절차를 통해 KnightCharacter라는 애니메이터 오버라이드 컨트롤러를 만들었습니다.

KnightCharacter를 클릭한 뒤, Inspector 창을 보면 위와 같이 기존 애니메이터 컨트롤러와 다른 여러 옵션들을 세팅할 수 있습니다.

먼저 하나씩 살펴보겠습니다.

    1. Controller : Override할 기존의 Animator Controller를 설정시키는 옵션입니다.
    1. Override : 기존 Animator Controller에서 사용되는 애니메이션 파일들을 Override할 애니메이션 파일들을 설정하는 옵션입니다.

이렇게 애니메이터 오버라이드 컨트롤러를 설정해주면 따로 애니메이터에서 트랜지션 설정을 할 필요없이 Character 애니메이터에서 설정한 트랜지션대로 애니메이션이 전환됩니다.

또, player_idle 애니메이션은 player_idle_knight로, player_walking 애니메이션은 player_walking_knight로 Override가 됩니다.

이제 이렇게 만든 Animator Override Controller를 스크립트를 통해 사용해야 합니다.

using UnityEngine;

public class CharacterAnimationController : AnimationController
{
    private static readonly int isWalking = Animator.StringToHash("isWalking");

    private readonly float magnitudeThreshold = 0.5f;

    [SerializeField] private CharacterStatHandler characterStatHandler;

	// 게임 진행 중에 애니메이터 컨트롤러를 바꾸기 위해 RuntimeAnimatorController 필드들 선언
    [SerializeField] private RuntimeAnimatorController mainController;
    [SerializeField] private RuntimeAnimatorController knightController;

    protected override void Awake()
    {
        base.Awake();
    }

    private void Start()
    {
        controller.OnMoveEvent += Move;
    }

    private void Move(Vector2 direction)
    {
        animator.SetBool(isWalking, direction.magnitude > magnitudeThreshold);
    }

	// 캐릭터 변경 시, 애니메이터를 교체하는 함수
    public void ChangeCharacter()
    {
    	// 기존 캐릭터를 선택한 경우
        if (CharacterType.Main == characterStatHandler.CurrentStat.characterType)
            // 현재 애니메이터의 애니메이터 컨트롤러를 Character 애니메이터 컨트롤러로 설정
            animator.runtimeAnimatorController = mainController;
        // 기사 캐릭터를 선택한 경우
        else
        	// 현재 애니메이터의 애니메이터 컨트롤러를 KnightCharacter 애니메이터 컨트롤러로 설정
            animator.runtimeAnimatorController = knightController;
    }
}

게임 내에서 캐릭터를 변경해야 하기 때문에 일반적인 AnimatorController를 사용할 수 없습니다.

이를 위한 특별한 AnimatorController가 있는데 바로 RuntimeAnimatorController입니다.

이 필드들에 각 캐릭터에 맞는 애니메이터를 저장시킨 뒤, animator의 runtimeAnimatorController에 대입하면 해당 캐릭터에 맞는 애니메이터 컨트롤러와 애니메이션 파일들로 설정되어 애니메이션을 재생시키고 전환할 수 있게 됩니다.

Inspector 창에서 플레이어의 CharacterAnimationController 스크립트에 만들었던 Character 애니메이터 컨트롤러와 KnightCharacter 애니메이터 컨트롤러를 설정시켜 줬습니다.

이제 캐릭터를 변경하면, CharacterAnimationController 스크립트의 ChangeCharacter() 메서드가 호출돼서 animator의 Animator Controller가 Character 또는 KnightCharacter로 바뀌어 캐릭터가 변경되고 애니메이션도 제대로 동작하게끔 만들어집니다.

위와 같이 인게임에서 캐릭터를 변경해도 변경한 캐릭터의 애니메이션이 적용되는 모습을 볼 수 있습니다.


3D에서는 애니메이션이 더욱 늘어날텐데 이 Animator Override Controller를 배웠기 때문에 3D에서도 손쉽게 애니메이션을 바꿀 수 있을 것 같습니다.

이번에 배운 Animator Override Controller를 적극 사용해서 3D 프로젝트에서도 다양한 캐릭터를 만들 수 있도록 하려 합니다.

profile
자라나라 실력 실력

0개의 댓글