Unity 검색

애니메이터 컨트롤러를 간결하고 깔끔하게 유지하기 위한 5가지 팁

Last updated: December 2018

페이지 내용: 윌 암스트롱(Will Armstrong)이 안내하는 애니메이터 컨트롤러에 관한 5가지 팁입니다. 이 팁의 핵심은 스크립트를 작성할 때와 마찬가지로 전체 개발 주기에 걸쳐 효율적으로 재사용하고, 확장하고, 지원 및 디버깅 가능한 캐릭터 애니메이터 컨트롤러를 만들어야 한다는 점입니다.모든 스크린샷은 파이어워치(Firewatch) 캐릭터 헨리(Henry)의 애니메이션을 캡처한 것입니다.

블렌드 트리로 복잡성 숨기기

블렌드 트리는 상태를 나타내거나 코드를 다시 호출하지 않으며, 정의한 매개변수에 기반하여 여러 클립 사이에 블렌딩되기만 하기 때문에 복잡성을 숨기는 데 효과적입니다.

여기서 중요한 점은 게임의 나머지 부분을 분리하지 않고도 블렌드 트리에서 반복 작업을 수행할 수 있다는 것입니다. 대부분의 블렌드 트리 내 애니메이션에는 동작을 연결할 수 없기 때문에 거미줄처럼 복잡한 상태를 숨기고 버그를 방지할 수 있습니다.

unity-tidy-animators-locomotion-blend-tree

보기에는 복잡해 보이지만, 이러한 블렌드 트리가 실제로는 과정을 더욱 간소화시켜 줍니다.

"레이어" 고려 시 "스크립트 클래스"를 반드시 함께 고려

레이어를 스크립트의 클래스와 마찬가지라고 생각하면 이해하기 쉽습니다. 즉, 각 레이어는 특정한 뼈대에 영향을 미치는지 여부나 해당 레이어의 가산(additive) 레이어 여부 등과는 상관없이 다른 레이어가 오버라이드하는 동작을 제어하므로 레이어의 모든 요소가 동일한 논리 및 동작 함수를 실행하도록 해야 합니다.

unity-tidy-animators-states

헨리의 왼쪽 손에 관한 모든 상태입니다. 각 레이어에는 목적과 명백한 계층 구조가 있어 쉽게 제어할 수 있으며 상태를 찾기도 수월합니다.

패턴 재사용

상태 및 하위 상태 머신의 재사용 가능한 논리적 패턴을 통해 개발을 가속화하고, 여러 사람이 동일한 콘텐츠를 제작할 수 있으며, 더욱 쉽게 디버깅을 수행할뿐만 아니라 전체적으로 버그를 감소시킬 수 있습니다.

레이어 구조화에 효과적인 몇 가지 패턴:

  • 허브 앤 스포크(hub and spoke): 이 패턴을 사용하면 전환이 전송되었다가 빈 상태로 반환되는 것을 명확하게 확인할 수 있기 때문에 디버그가 쉬워집니다. 허브의 각 스포크는 접촉하는 모든 상태를 리셋합니다. 스포크는 아래의 패턴을 사용하여 하위 상태 머신으로 만들기 용이합니다.

    unity-tidy-animators-hub-and-spoke

    헨리의 오른쪽 팔을 애니메이션으로 구현하기 위해 사용된 허브 앤 스포크 패턴

  • 공유된 들어오기/공유된 나가기 패턴: 상태를 '인트로' - '실행' / 반복' - '아우트로' 패턴으로 그룹화함으로써 모든 애니메이션 이벤트와 상태 머신 동작을 '인트로' 및 '아우트로' 상태에 깔끔하게 연결할 수 있습니다. 그런 다음 블렌드 트리와 유사하게 게임을 분리할 필요 없이 내부의 '실행 / 반복' 상태를 반복하고 변경할 수 있습니다.

    unity-tidy-animators-entry-to-exit

    들어오기부터 나가기까지: 책을 들고 있는 헨리의 오른쪽 손에 관한 모든 상태. 더 많은 하위 상태에 세부 정보가 숨겨져 있습니다.

  • 중요 섹션 및 안정화 패턴: 특히 플레이어 입력 중심의 애니메이션 등 인터럽트 가능한 애니메이션의 경우, 모든 변경 사항, 효과, 데미지 등을 포함하며 항상 끝까지 플레이해야 하는 중요 섹션과, 대기 상태로 돌아올 때 표시되며 새로운 입력으로 인해 인터럽트 가능한 안정화 애니메이션의 두 부분으로 클립을 나누세요.

    unity-tidy-animators-critical-section-and-settle

    애니메이션이 원하는 형태로 구현되고 작동하면 애니메이터의 상태를 게임 상태에 반영해야 합니다. 다음은 그 과정에서 유의해야 할 몇 가지 사항입니다.

상태 머신 동작 내에 복잡한 코드 작성하지 않기

상태 머신 동작은 모든 애니메이션 상태에 연결할 수 있는 코드 조각으로, 동작을 애니메이터 상태 자체에 직접 연결하는 데 사용합니다.

상태 머신 동작 내에 복잡한 게임플레이 코드를 작성하지 마세요. 그러면 상태의 변경 출처를 추적하기 어려울 수 있습니다. 상태 머신 동작을 사용하여 게임플레이 코드를 실행하는 경우 메시징 시스템을 사용하세요. 즉, 관리자 클래스에 문의하거나 상위 수준의 파라미터에서 매개변수를 트리거하시기 바랍니다.

마지막으로 제가 가장 좋아하는 시스템 동작인 Debug.Break()에 대해 이야기해보겠습니다. 이 동작은 애니메이션 설정 어디에든 연결할 수 있으며 시각적 스크립팅 시스템과 유사하게 중단점을 설정할 수 있는 가장 유용한 상태 머신 동작입니다.

적절한 곳에 C# 코드 사용을 두려워하지 마세요. 여기저기서 수백 혹은 수천 개의 전환이나 AnyState 전환을 구현하는 대신 Animator.Play나 Animator.CrossFade를 사용하여 코드에서 직접 동적으로 전환하세요. 이것만으로 부족할 경우 유니티의 PlayablesAPI에서 코드를 통한 애니메이션 방법을 더 많이 살펴볼 수 있습니다. 예제는 https://docs.unity3d.com/Manual/Playables-Examples.html에서 확인할 수 있습니다.

상태 머신 동작을 사용하여 애니메이션 이벤트가 항상 실행되는지 확인

애니메이션 이벤트는 애니메이션 클립의 특정한 순간을 게임의 특정한 변경 상태에 연결하며, 시각 효과와 음향 효과 등의 요소를 실행하는 데 사용할 수 있습니다. 단, 클립이 실행되기 전에 전환하는 경우 애니메이션 이벤트는 실행되지 않습니다. 이러한 문제를 해결하는 방법은 게임에서 다른 이벤트의 발생 여부와는 상관없이 특정한 시점에 도달하면 이벤트가 항상 실행되도록 하는 상태 머신 동작을 추가하는 것입니다.

unity-tidy-animators-state-machine

리소스 더 보기