무엇을 찾고 계신가요?
Engine & platform

'잠깐, 마음이 바뀌었어' - 상태 머신 전환 중단

CATHERINE PROULX Anonymous
Jul 13, 2016|5 분
'잠깐, 마음이 바뀌었어' - 상태 머신 전환 중단
이 웹페이지는 이해를 돕기 위해 기계 번역으로 제공됩니다. 기계 번역으로 제공되는 콘텐츠에 대한 정확도나 신뢰도는 보장되지 않습니다. 번역된 콘텐츠의 정확도에 관해 의문이 있는 경우 웹페이지의 공식 영어 원문을 참고해 주시기 바랍니다.
최근에 빈 상태, 재정의 레이어 및 전환 중단의 조합과 관련된 까다로운 버그를 사용자가 신고한 것을 조사했습니다. 자세히 살펴보던 중 애니메이션 시스템의 전환 중단에 대한 문서가 다소 간결하지 않다는 것을 알게 되었습니다. 나중에 저희 팀과 긴 대화를 나눈 끝에 블로그 포스팅이 필요하다는 결론을 내렸습니다.

이제 상태 머신 전환과 중단에 대한 복잡한 세부 사항을 자세히 알아보겠습니다!

애니메이션 시스템에서는 기본적으로 전환을 중단할 수 없으며, 한 상태에서 다른 상태로 이동하기 시작하면 빠져나갈 방법이 없습니다. 대서양 횡단 비행기의 승객처럼 목적지에 도착할 때까지 편안하게 좌석에 앉아 마음을 바꿀 수 없습니다. 대부분의 사용자에게는 이 정도면 괜찮습니다.

하지만 전환에 대한 더 많은 제어가 필요한 경우, 필요에 따라 다양한 방식으로 Mecanim을 구성할 수 있습니다. 현재 목적지가 마음에 들지 않으면 조종석에 탑승하여 비행 도중에 계획을 변경할 수 있습니다. 이는 애니메이션의 반응성이 높아진다는 의미이기도 하지만, 복잡성 속에서 길을 잃을 기회가 많다는 의미이기도 합니다.

몇 가지 예를 통해 이를 정리해 보겠습니다. A부터 D까지 4개의 상태와 상태 머신의 모든 전환에 연결된 트리거가 있는 매우 간단한 상태 머신으로 시작할 수 있습니다.

image05

기본적으로 A->B 전환을 트리거하면 상태 머신은 B로 전환되며, 그 어떤 것도 목적지에 도달하는 것을 막을 수 없습니다. 그러나 A->B 전환 검사기에서 중단 소스를 '없음'에서 '현재 상태'로 변경하면 상태 A의 일부 트리거에 의해 A에서 B로의 여정이 중단될 수 있습니다.

image01

왜 "일부"만인가요? '정렬된 중단' 확인란도 기본적으로 선택되어 있기 때문입니다. 즉, 현재 상태보다 우선 순위가 높은 상태 A의 전환만 허용됩니다. 상태 A의 인스펙터를 보면, 이는 A->C 전환에만 적용된다는 것을 알 수 있습니다.

image02

따라서 A->B 트리거를 활성화하면 A->D 트리거 직후에도 전환이 중단되지 않습니다. 그러나 대신 A->C 트리거를 누르면 전환이 즉시 중단되고 상태 머신이 C로 전환되기 시작합니다.





내부적으로 애니메이션 시스템은 중단 시점의 포즈를 기록하고, 이제 해당 정적 포즈(X)와 새 대상 애니메이션을 블렌딩합니다. 왜 현재와 새로운 전환을 더 매끄럽게 혼합하는 대신 정적인 포즈를 취해야 할까요? 간단히 말해서 성능입니다. 게임에서 연쇄적인 중단이 발생하는 경우, 여러 동적 전환을 동시에 추적하면 애니메이션 시스템을 확장할 수 없게 됩니다.

이제 '정렬된 중단' 확인란을 선택 취소하면 A->C와 A->D 모두 전환을 중단할 수 있습니다. 그러나 동일한 프레임에서 둘 다 트리거되는 경우 우선순위가 더 높은 A->C가 여전히 우선합니다.

중단 소스를 "다음 상태"로 변경하면 A->C 및 A->D는 순서에 관계없이 더 이상 전환을 중단할 수 없습니다. 그러나 B->D 트리거를 누르면 B로 전환을 완료하지 않고 즉시 A에서 D로 전환이 시작됩니다.

상태 B에서도 전환 순서가 중요합니다. '순서대로 중단' 확인란은 더 이상 사용할 수 없지만(B에서 트리거된 전환은 A->B에 비해 우선 순위가 없으므로 전환을 중단할 수 있음), 같은 프레임 내에서 두 전환이 모두 트리거된 경우 B의 전환 순서에 따라 어떤 전환이 승리하는지 결정됩니다. 이 경우 같은 프레임에서 B->D와 B->C가 트리거되면 B->D가 선택됩니다.

image03

마지막으로 완벽한 제어를 위해 인터럽트 소스를 "현재 상태 다음 상태" 또는 "다음 상태 다음 현재 상태"로 설정할 수 있습니다. 이 경우 전환은 한 상태에서 독립적으로 분석된 다음 다른 상태에서 분석됩니다.

따라서 다음과 같은 구성이 있다고 가정해 보겠습니다.

image00

A->B 전환 중에 매우 흥분한 플레이어는 같은 프레임 내에서 네 번의 전환을 트리거합니다: A->C, A->D, B->C 및 B->D. 어떻게 되나요?

먼저, '정렬된 중단'이 체크되어 있으므로 A->B보다 우선 순위가 낮은 A->D를 바로 무시할 수 있습니다. 현재 상태가 먼저 해결되므로 상태 B를 보지 않아도 전환 A->C가 승리한다는 것을 알 수 있습니다.

image02
image03