Interactive 요소 [실험적] - MRTK2

MRTK 입력 시스템에 대한 간소화된 중앙 집중식 진입점입니다. 핵심 상호 작용 상태에 대한 상태 관리 메서드, 이벤트 관리 및 상태 설정 논리를 포함합니다.

Interactive Element는 Unity 2019.3: Serialize Reference의 새로운 기능을 활용하기 때문에 Unity 2019.3 이상에서 지원되는 실험적 기능입니다.

Interactive 요소 검사기

재생 모드 중에 Interactive Element 검사기는 현재 상태가 활성 상태인지 여부를 나타내는 시각적 피드백을 제공합니다. 상태가 활성 상태이면 시안 색으로 강조 표시됩니다. 상태가 활성 상태가 아니면 색이 변경되지 않습니다. 검사기에서 상태 옆에 있는 숫자는 상태 값입니다. 상태가 활성 상태이면 값은 1이고, 상태가 활성 상태가 아니면 값은 0입니다.

가상 손 상호 작용이 있는 대화형 요소

핵심 상태

Interactive 요소는 핵심 상태를 포함하며 사용자 지정 상태의 추가를 지원합니다. 핵심 상태는 이미 에 정의된 상태 설정 논리가 있는 BaseInteractiveElement상태입니다. 다음은 현재 입력 기반 코어 상태 목록입니다.

현재 핵심 상태

근거리 및 원거리 상호 작용 핵심 상태:

근거리 상호 작용 핵심 상태:

원거리 상호 작용 핵심 상태:

기타 핵심 상태:

검사기를 통해 코어 상태를 추가하는 방법

  1. 대화형 요소에 대한 검사기에서 코어 상태 추가 로 이동합니다.

    검사기에서 핵심 상태 추가

  2. 상태 선택 단추를 선택하여 추가할 코어 상태를 선택합니다. 메뉴의 상태는 상호 작용 유형별로 정렬됩니다.

    상태가 선택된 검사기에서 핵심 상태 추가

  3. 이벤트 구성 폴드아웃을 열어 상태와 연결된 이벤트 및 속성을 확인합니다.

    이벤트 구성을 사용하여 Inspector를 통해 코어 상태 추가

스크립트를 통해 코어 상태를 추가하는 방법

메서드를 AddNewState(stateName) 사용하여 코어 상태를 추가합니다. 사용 가능한 코어 상태 이름 목록은 열거형을 CoreInteractionState 사용합니다.

// Add by name or add by CoreInteractionState enum to string

interactiveElement.AddNewState("SelectFar");

interactiveElement.AddNewState(CoreInteractionState.SelectFar.ToString());

상태 내부 구조

Interactive 요소의 상태는 형식 InteractionState입니다. InteractionState 에는 다음 속성이 포함됩니다.

  • 이름: 상태의 이름입니다.
  • : 상태 값입니다. 상태가 켜져 있으면 상태 값은 1입니다. 상태가 꺼져 있으면 상태 값은 0입니다.
  • 활성: 상태가 현재 활성 상태인지 여부입니다. Active 속성의 값은 상태가 켜진 경우 true이고, 상태가 꺼져 있으면 false입니다.
  • 상호 작용 유형: 상태의 상호 작용 유형은 상태가 의도한 상호 작용 유형입니다.
    • None: 어떤 형식의 입력 상호 작용도 지원하지 않습니다.
    • Near: 근거리 상호 작용 지원. 입력은 굴절된 손이 다른 게임 개체와 직접 접촉할 때, 즉 관절이 있는 손이 세계 공간에서 게임 개체의 위치에 가까운 위치에 있을 때 상호 작용에 가까운 것으로 간주됩니다.
    • Far: 극한 상호 작용 지원. 입력은 게임 개체와의 직접 접촉이 필요하지 않은 경우 먼 상호 작용으로 간주됩니다. 예를 들어 컨트롤러 광선 또는 응시를 통한 입력은 먼 상호 작용 입력으로 간주됩니다.
    • NearAndFar: 근거리 및 먼 상호 작용 지원을 모두 포함합니다.
    • Other: 포인터 독립적 상호 작용 지원.
  • 이벤트 구성: 상태에 대한 이벤트 구성은 직렬화된 이벤트 프로필 진입점입니다.

이러한 모든 속성은 Interactive 요소에 포함된 에서 State Manager 내부적으로 설정됩니다. 상태를 수정하려면 다음 도우미 메서드를 사용합니다.

상태 설정 도우미 메서드

// Get the InteractionState
interactiveElement.GetState("StateName");

// Set a state value to 1/on
interactiveElement.SetStateOn("StateName");

// Set a state value to 0/off
interactiveElement.SetStateOff("StateName");

// Check if a state is present in the state list
interactiveElement.IsStatePresent("StateName");

// Check whether or not a state is active
interactiveElement.IsStateActive("StateName");

// Add a new state to the state list
interactiveElement.AddNewState("StateName");

// Remove a state from the state list
interactiveElement.RemoveState("StateName");

상태의 이벤트 구성을 가져오는 것은 상태 자체와 관련이 있습니다. 각 코어 상태에는 각 코어 상태를 설명하는 섹션 아래에 설명된 특정 이벤트 구성 유형이 있습니다.

다음은 상태의 이벤트 구성을 가져오는 일반화된 예제입니다.

// T varies depending on the core state - the specific T's are specified under each of the core state sections
T stateNameEvents = interactiveElement.GetStateEvents<T>("StateName");

기본 상태

기본 상태는 항상 Interactive 요소에 있습니다. 이 상태는 다른 모든 상태가 활성화되지 않은 경우에만 활성화됩니다. 다른 상태가 활성화되면 기본 상태가 내부적으로 꺼짐으로 설정됩니다.

대화형 요소는 상태 목록에 있는 기본 및 포커스 상태로 초기화됩니다. 기본 상태는 항상 상태 목록에 있어야 합니다.

기본 상태 이벤트 가져오기

기본 상태에 대한 이벤트 구성 유형: StateEvents

StateEvents defaultEvents = interactiveElement.GetStateEvents<StateEvents>("Default");

defaultEvents.OnStateOn.AddListener(() =>
{
    Debug.Log($"{gameObject.name} Default State On");
});

defaultEvents.OnStateOff.AddListener(() =>
{
    Debug.Log($"{gameObject.name} Default State Off");
});

포커스 상태

포커스 상태는 가리키기와 동일한 혼합 현실로 간주될 수 있는 근거리 및 먼 상호 작용 상태입니다. 포커스 상태에 대한 근거리 및 먼 상호 작용 간의 구분 요소는 현재 활성 포인터 유형입니다. 포커스 상태의 포인터 형식이 Poke 포인터인 경우 상호 작용은 상호 작용에 가까운 것으로 간주됩니다. 기본 포인터가 Poke 포인터가 아닌 경우 상호 작용은 먼 상호 작용으로 간주됩니다. 포커스 상태는 기본적으로 Interactive 요소에 있습니다.

가상 손 상호 작용을 사용하여 포커스 상태 동작 포커스 상태

Inpsector의 포커스 상태 검사기 포커스 상태

포커스 상태 이벤트 가져오기

포커스 상태에 대한 이벤트 구성 유형: FocusEvents

FocusEvents focusEvents = interactiveElement.GetStateEvents<FocusEvents>("Focus");

focusEvents.OnFocusOn.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Focus On");
});

focusEvents.OnFocusOff.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Focus Off");
});

포커스 근거리 및 포커스 멀리 동작

가상 손 상호 작용을 통해 근거리 및 멀리 포커스

포커스 근거리 상태

포커스 근처 상태는 포커스 이벤트가 발생하고 기본 포인터가 가까운 상호 작용을 나타내는 Poke 포인터일 때 설정됩니다.

가상 손 상호 작용을 사용하여 상태 근처 포커스 근거리 상태 동작 포커스

검사기에서 구성 요소 근처 포커스 근처 상태검사기 포커스

FocusNear 상태 이벤트 가져오기

FocusNear 상태의 이벤트 구성 유형: FocusEvents

FocusEvents focusNearEvents = interactiveElement.GetStateEvents<FocusEvents>("FocusNear");

focusNearEvents.OnFocusOn.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Near Interaction Focus On");
});

focusNearEvents.OnFocusOff.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Near Interaction Focus Off");
});

포커스 멀리 상태

포커스 원거리 상태는 기본 포인터가 Poke 포인터가 아닌 경우 설정됩니다. 예를 들어 기본 컨트롤러 광선 포인터 및 GGV(응시, 제스처, 음성) 포인터는 먼 상호 작용 포인터로 간주됩니다.

가상 손 상호 작용을 통해 멀리 떨어진 포커스 상태 동작 포커스 상태

검사기에서 멀리 떨어진 상태 검사기 포커스 멀리 구성 요소

포커스 멀리 상태 이벤트 가져오기

FocusFar 상태에 대한 이벤트 구성 유형: FocusEvents

FocusEvents focusFarEvents = interactiveElement.GetStateEvents<FocusEvents>("FocusFar");

focusFarEvents.OnFocusOn.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Far Interaction Focus On");
});

focusFarEvents.OnFocusOff.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Far Interaction Focus Off");
});

터치 상태

터치 상태는 관절형 손이 개체에 직접 닿을 때 설정되는 거의 상호 작용 상태입니다. 직접 터치는 관절 손의 검지 손가락이 개체의 세계 위치에 매우 가깝다는 것을 의미합니다. 기본적으로 NearInteractionTouchableVolume 터치 상태가 상태 목록에 추가되면 구성 요소가 개체에 연결됩니다. NearInteractionTouchableVolume 터치 이벤트를 검색하려면 또는 NearInteractionTouchable 구성 요소가 필요합니다. 와 NearInteractionTouchableNearInteractionTouchableVolume 의 차이점은 NearInteractionTouchableVolume 개체의 충돌체를 기반으로 터치를 감지하고 NearInteractionTouchable평면의 정의된 영역 내에서 터치를 감지한다는 것입니다.

가상 손 조작을 사용하여 터치 상태 동작 터치 상태

검사기에서 터치 상태 검사기 터치 상태 구성 요소

터치 상태 이벤트 가져오기

터치 상태에 대한 이벤트 구성 유형: TouchEvents

TouchEvents touchEvents = interactiveElement.GetStateEvents<TouchEvents>("Touch");

touchEvents.OnTouchStarted.AddListener((touchData) =>
{
    Debug.Log($"{gameObject.name} Touch Started");
});

touchEvents.OnTouchCompleted.AddListener((touchData) =>
{
    Debug.Log($"{gameObject.name} Touch Completed");
});

touchEvents.OnTouchUpdated.AddListener((touchData) =>
{
    Debug.Log($"{gameObject.name} Touch Updated");
});

Far State 선택

멀리 선택 상태가 IMixedRealityPointerHandler 표시됩니다. 이 상태는 먼 상호 작용 클릭(에어 탭)을 감지하고 기본 컨트롤러 광선 포인터 또는 GGV 포인터와 같은 먼 상호 작용 포인터를 사용하여 보유하는 먼 상호 작용 상태입니다. Far 선택 상태에는 라는 Global이벤트 구성 폴드아웃 아래에 옵션이 있습니다. 가 true이면 GlobalIMixedRealityPointerHandler 전역 입력 처리기로 등록됩니다. 처리기가 전역으로 등록된 경우 입력 시스템 이벤트를 트리거하기 위해 개체에 포커스를 두지 않아도 됩니다. 예를 들어 사용자가 포커스에 있는 개체에 관계없이 에어 탭/선택 제스처가 수행될 때마다 알고 싶다면 를 true로 설정합니다 Global .

멀리 상태 동작선택 가상 손 상호 작용을 사용하여 멀리 선택

검사기에서 멀리 상태 검사기선택 멀리 구성 요소 선택

멀리 상태 이벤트 선택 가져오기

SelectFar 상태에 대한 이벤트 구성 유형: SelectFarEvents

SelectFarEvents selectFarEvents = interactiveElement.GetStateEvents<SelectFarEvents>("SelectFar");

selectFarEvents.OnSelectUp.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Far Interaction Pointer Up");
});

selectFarEvents.OnSelectDown.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Far Interaction Pointer Down");
});

selectFarEvents.OnSelectHold.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Far Interaction Pointer Hold");
});

selectFarEvents.OnSelectClicked.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Far Interaction Pointer Clicked");
});

클릭한 상태

클릭됨 상태는 기본적으로 먼 상호 작용 클릭(멀리 상태 선택)에 의해 트리거됩니다. 이 상태는 내부적으로 켜기로 전환되고 OnClicked 이벤트를 호출한 다음 즉시 꺼져 있습니다.

참고

상태 작업을 기반으로 하는 검사기에서 시각적 피드백은 켜진 후 즉시 꺼져 있으므로 Clicked 상태에 대해 존재하지 않습니다.

가상 손 상호 작용을 사용하여 클릭된 상태 동작 클릭 상태

검사기에서 상태 검사기클릭 상태 구성 요소를 클릭합니다.

근거리 및 먼 클릭 상태 예제
메서드를 사용하여 interactiveElement.TriggerClickedState() 추가 진입점을 통해 클릭된 상태를 트리거할 수 있습니다. 예를 들어 사용자가 거의 상호 작용 터치를 통해 개체에 대한 클릭을 트리거하려는 경우 터치 상태에서 메서드를 수신기로 추가 TriggerClickedState() 합니다.

가상 손 상호 작용을 사용하는 근거리 및 먼 상태

클릭된 상태 이벤트 가져오기

클릭된 상태에 대한 이벤트 구성 유형: ClickedEvents

ClickedEvents clickedEvent = interactiveElement.GetStateEvents<ClickedEvents>("Clicked");

clickedEvent.OnClicked.AddListener(() =>
{
    Debug.Log($"{gameObject.name} Clicked");
});

켜기 및 해제 해제 설정/해제

토글 켜기 및 해제 해제 상태는 쌍이며 토글 동작을 위해 둘 다 있어야 합니다. 기본적으로 토글 켜기 및 해제 해제 상태는 먼 상호 작용 클릭(멀리 상태 선택)을 통해 트리거됩니다. 기본적으로 해제 설정/해제 상태는 시작 시 활성화됩니다. 즉, 토글이 해제로 초기화됩니다. 사용자가 시작 시 토글 켜기 상태를 활성화하려면 켜기 설정/해제 상태에서 true로 설정합니다 IsSelectedOnStart .

가상 손 조작을 사용하여 토글온 및 상태 동작 해제 토글 설정/해제

검사기에서 토글온 및 상태 검사기 해제 토글 구성 요소

근거리 및 파 토글 상태 예제
클릭된 상태와 마찬가지로 토글 상태 설정은 메서드를 사용하여 interactiveElement.SetToggleStates() 여러 진입점을 가질 수 있습니다. 예를 들어 사용자가 터치를 추가 진입점으로 설정하여 토글 상태를 설정하려는 경우 터치 상태의 이벤트 중 하나에 메서드를 추가 SetToggleStates() 합니다.

가상 손 상호 작용을 사용하여 근거리 및 먼 토글

상태 이벤트 켜기 및 해제 설정/해제

ToggleOn 상태에 대한 이벤트 구성 유형: ToggleOnEvents
ToggleOff 상태에 대한 이벤트 구성 유형: ToggleOffEvents

// Toggle On Events
ToggleOnEvents toggleOnEvent = interactiveElement.GetStateEvents<ToggleOnEvents>("ToggleOn");

toggleOnEvent.OnToggleOn.AddListener(() =>
{
    Debug.Log($"{gameObject.name} Toggled On");
});

// Toggle Off Events
ToggleOffEvents toggleOffEvent = interactiveElement.GetStateEvents<ToggleOffEvents>("ToggleOff");

toggleOffEvent.OnToggleOff.AddListener(() =>
{
    Debug.Log($"{gameObject.name} Toggled Off");
});

음성 키워드 상태

Speech 키워드 상태는 Mixed Reality Speech Profile에 정의된 키워드를 수신 대기합니다. 모든 새 키워드(keyword) 런타임 전에 음성 명령 프로필에 등록해야 합니다(아래 단계).

음성 키워드 상태 동작음성 키워드(keyword) 가상 상호 작용

검사기에서 Speech 키워드 상태 검사기음성 키워드(keyword) 구성 요소

참고

Speech 키워드 상태는 위의 gif에서 F5 키를 눌러 편집기에서 트리거되었습니다. 음성에 대한 편집기 테스트의 설정은 아래 단계에 설명되어 있습니다.

음성 명령/키워드를 등록하는 방법

  1. MixedRealityToolkit 게임 개체 선택

  2. 현재 프로필 복사 및 사용자 지정 을 선택합니다.

  3. 입력 섹션으로 이동하고 복제 를 선택하여 입력 프로필을 수정할 수 있습니다.

  4. 입력 프로필에서 Speech 섹션까지 아래로 스크롤하여 음성 프로필을 복제합니다.

    MRTK 게임 개체의 음성 키워드(keyword) 프로필

  5. 새 음성 추가 명령을 선택합니다.

    MRTK 프로필에 새 음성 키워드(keyword) 추가

  6. 새 키워드(keyword) 입력합니다. 선택 사항: 편집기에서 테스트를 허용하도록 KeyCode를 F5(또는 다른 KeyCode)로 변경합니다.

    MRTK 프로필에서 음성 키워드(keyword) 구성

  7. Interactive Element Speech 키워드 상태 검사기로 돌아가기 키워드 추가를 선택합니다.

    대화형 요소 구성 요소에 키워드(keyword) 추가

    키워드 유효성 검사 및 등록

  8. 음성 프로필에 방금 등록된 새 키워드(keyword) 입력합니다.

    새 음성 키워드(keyword) 입력

편집기에서 Speech 키워드 상태를 테스트하려면 6단계(F5)에 정의된 KeyCode를 눌러 음성 키워드(keyword) 인식된 이벤트를 시뮬레이션합니다.

Speech 키워드 상태 이벤트 가져오기

SpeechKeyword 상태에 대한 이벤트 구성 유형: SpeechKeywordEvents

SpeechKeywordEvents speechKeywordEvents = interactiveElement.GetStateEvents<SpeechKeywordEvents>("SpeechKeyword");

speechKeywordEvents.OnAnySpeechKeywordRecognized.AddListener((speechEventData) =>
{
    Debug.Log($"{speechEventData.Command.Keyword} recognized");
});

// Get the "Change" Keyword event specifically
KeywordEvent keywordEvent = speechKeywordEvents.Keywords.Find((keyword) => keyword.Keyword == "Change");

keywordEvent.OnKeywordRecognized.AddListener(() =>
{ 
    Debug.Log("Change Keyword Recognized"); 
});

사용자 지정 상태

검사기를 통해 사용자 지정 상태를 만드는 방법

검사기를 통해 만든 사용자 지정 상태는 기본 상태 이벤트 구성으로 초기화됩니다. 사용자 지정 상태에 대한 기본 이벤트 구성은 형식 StateEvents 이며 OnStateOn 및 OnStateOff 이벤트를 포함합니다.

  1. 대화형 요소에 대한 검사기에서 사용자 지정 상태 만들기 로 이동합니다.

    사용자 지정 상태 만들기

  2. 새 상태의 이름을 입력합니다. 이 이름은 고유해야 하며 기존 코어 상태와 같을 수 없습니다.

    새 사용자 지정 상태의 이름 입력

  3. 상태 이름 설정을 선택하여 상태 목록에 추가합니다.

    상태 목록에 사용자 지정 상태 추가

    이 사용자 지정 상태는 및 OnStateOff 이벤트를 포함하는 기본 StateEvents 이벤트 구성으로 OnStateOn 초기화됩니다. 새 상태에 대한 사용자 지정 이벤트 구성을 만들려면 사용자 지정 이벤트 구성을 사용하여 사용자 지정 상태 만들기를 참조하세요.

    대화형 요소 구성 요소에 표시되는 새 상태

스크립트를 통해 사용자 지정 상태를 만드는 방법

interactiveElement.AddNewState("MyNewState");

// A new state by default is initialized with a the default StateEvents configuration which contains the 
// OnStateOn and OnStateOff events

StateEvents myNewStateEvents = interactiveElement.GetStateEvents<StateEvents>("MyNewState");

myNewStateEvents.OnStateOn.AddListener(() =>
{
    Debug.Log($"MyNewState is On");
});

사용자 지정 이벤트 구성을 사용하여 사용자 지정 상태 만들기

키보드라는 사용자 지정 상태에 대한 예제 파일은 MRTK\SDK\Experimental\InteractiveElement\Examples\Scripts\CustomStateExample에 있습니다.

다음 단계에서는 사용자 지정 상태 이벤트 구성 및 수신기 파일을 만드는 기존 예제를 안내합니다.

  1. 상태 이름을 생각해 보세요. 이 이름은 고유해야 하며 기존 코어 상태와 같을 수 없습니다. 이 예제에서는 상태 이름이 키보드로 설정됩니다.

  2. state name + "Receiver" 및 state name + "Events"라는 두 개의 .cs 파일을 만듭니다. 이러한 파일의 이름은 내부적으로 고려되며 상태 이름 + 이벤트/수신기 규칙을 따라야 합니다.

    키보드 상태 스크립트

  3. 파일 내용에 대한 자세한 내용은 KeyboardEvents.cs 및 KeyboardReceiver.cs 파일을 참조하세요. 새 이벤트 구성 클래스는 에서 BaseInteractionEventConfiguration 상속해야 하며 새 이벤트 수신기 클래스는 에서 BaseEventReceiver상속되어야 합니다. 키보드 상태에 대한 상태 설정의 예는 파일에 있습니다 CustomStateSettingExample.cs .

  4. 상태 이름을 사용하여 Interactive 요소에 상태를 추가하면 이벤트 구성 및 이벤트 수신기 파일이 있는 경우 상태 이름이 인식됩니다. 사용자 지정 이벤트 구성 파일의 속성은 검사기에서 표시되어야 합니다.

    대화형 요소에 사용자 지정 상태 추가대화형 요소에서 인식되는 사용자 지정 상태

  5. 이벤트 구성 및 이벤트 수신기 파일의 더 많은 예제는 다음 경로의 파일을 참조하세요.

  • MRTK\SDK\Experimental\InteractiveElement\InteractiveElement\Events\EventConfigurations
  • MRTK\SDK\Experimental\InteractiveElement\InteractiveElement\Events\EventReceivers

예제 장면

Interactive 요소 + 상태 시각화 도우미의 예제 장면은 MRTK\SDK\Experimental\InteractiveElement\Examples\InteractiveElementExampleScene.unity에 있습니다.

Interactive 요소 및 상태 시각화 도우미가 있는 예제 장면

압축 가능한 단추

예제 장면에는 및 라는 CompressableButton 프리팹이 포함되어 있으며CompressableButtonToggle, 이러한 프리팹은 대화형 요소 및 상태 시각화 도우미를 사용하여 생성된 단추의 PressableButtonHoloLens2 동작을 미러. CompressableButton 구성 요소는 현재 와 를PressableButtonHoloLens2PressableButton + BaseInteractiveElement기본 클래스로 조합한 것입니다.

상태 시각화 도우미 [실험적]

상태 시각화 도우미 구성 요소는 연결된 Interactive Element 구성 요소에 정의된 상태에 따라 개체에 애니메이션을 추가합니다. 이 구성 요소는 애니메이션 자산을 만들고 MixedRealityToolkit.Generated 폴더에 배치하며 애니메이션 가능 속성을 대상 게임 개체에 추가하여 간소화된 애니메이션 키 프레임 설정을 사용하도록 설정합니다. 상태 간에 애니메이션 전환을 사용하도록 설정하려면 Animator 컨트롤러 자산이 만들어지고 연결된 매개 변수 및 모든 상태 전환을 사용하여 기본 상태 머신이 생성됩니다. 상태 컴퓨터는 Unity의 Animator 창에서 볼 수 있습니다.

상태 시각화 도우미 및 Unity 애니메이션 시스템

상태 시각화 도우미는 현재 Unity 애니메이션 시스템을 활용합니다.

상태 시각화 도우미의 새 애니메이션 클립 생성 단추를 누르면 Interactive Element의 상태 이름을 기반으로 새 애니메이션 클립 자산이 생성되고 MixedRealityToolkit.Generated 폴더에 배치됩니다. 각 상태 컨테이너의 애니메이션 클립 속성은 연결된 애니메이션 클립으로 설정됩니다.

상태 시각화 도우미 구성 요소의 애니메이션 클립

애니메이션 클립 간의 원활한 전환을 관리하기 위해 Animator State Machine 도 생성됩니다. 기본적으로 상태 컴퓨터는 Any State 를 활용하여 Interactive Element의 모든 상태 간 전환을 허용합니다.

애니메이터에서 트리거되는 상태 시각화 도우미 도 각 상태에 대해 생성되며, 트리거 매개 변수는 상태 시각화 도우미에서 애니메이션을 트리거하는 데 사용됩니다.

Unity 상태 컴퓨터

런타임 제한 사항

상태 시각화 도우미는 Inspector를 통해 개체에 추가해야 하며 스크립트를 통해 추가할 수 없습니다. AnimatorStateMachine/AnimationController를 수정하는 속성은 앱을 빌드할 때 제거되는 편집기 네임스페이스(UnityEditor.Animations)에 포함됩니다.

상태 시각화 도우미를 사용하는 방법

  1. 큐브 만들기

  2. 대화형 요소 연결

  3. 상태 시각화 도우미 연결

  4. 새 애니메이션 클립 생성을 선택합니다.

    새 애니메이션 클립 생성

    시각화 도우미 및 대화형 요소 구성 요소에서 생성된 애니메이션 클립 표시

  5. 포커스 상태 컨테이너에서 대상 추가를 선택합니다.

    상태 시각화 도우미 대상 추가

  6. 현재 게임 개체를 대상 필드로 끌어옵니다.

    상태 시각화 도우미 대상 설정

  7. 큐브 애니메이션 가능 속성 폴드아웃 열기

  8. 애니메이션 가능 속성 드롭다운 메뉴를 선택하고 을 선택합니다.

    상태 시각화 도우미 색 설정

  9. 색 애니메이션 가능 속성 추가를 선택합니다.

    시각화 도우미 색 애니메이션 가능 속성 선택

  10. 색 선택

    색 휠에서 시각화 도우미 색 선택

  11. 재생을 누르고 전환 색 변경 관찰

    가상 손 상호 작용을 사용하여 전환 색 변경 예제

애니메이션 가능 속성

애니메이션 가능 속성의 주요 목적은 애니메이션 클립 키 프레임 설정을 간소화하는 것입니다. 사용자가 Unity 애니메이션 시스템에 익숙하고 생성된 애니메이션 클립에서 키 프레임을 직접 설정하려는 경우 애니메이션 가능 속성을 대상 개체에 추가하고 Unity의 애니메이션 창(Windows > 애니메이션 > 애니메이션)에서 클립을 열 수 없습니다.

애니메이션에 애니메이션 가능 속성을 사용하는 경우 곡선 형식은 EaseInOut으로 설정됩니다.

현재 애니메이션 가능 속성:

배율 오프셋

Scale Offset Animatable 속성은 개체의 현재 배율을 사용하고 정의된 오프셋을 추가합니다.

가상 손 상호 작용을 사용하여 오프셋 크기 조정

위치 오프셋

Position Offset Animatable 속성은 개체의 현재 위치를 사용하고 정의된 오프셋을 추가합니다.

가상 손 상호 작용을 사용하여 위치 오프셋

색상

색 애니메이션 가능 속성은 재질에 기본 색 속성이 있는 경우 재질의 기본 색을 나타냅니다. 이 속성은 속성에 애니메이션 효과를 시킵 material._Color 니다.

가상 손 조작을 사용하여 포커스 색 변경

셰이더 색

셰이더 색 애니메이션 가능 속성은 색 형식의 셰이더 속성을 나타냅니다. 모든 셰이더 속성에는 속성 이름이 필요합니다. 아래 GIF는 기본 재질 색이 아닌 Fill_Color 라는 셰이더 색 속성에 애니메이션 효과를 주는 방법을 보여 줍니다. 재질 검사기에서 변경 값을 관찰합니다.

가상 손 상호 작용을 사용하여 음영 색

셰이더 부동 소수

셰이더 Float 애니메이션 가능 속성은 float 형식의 셰이더 속성을 나타냅니다. 모든 셰이더 속성에는 속성 이름이 필요합니다. 아래 GIF에서 금속 속성에 대한 재질 검사기에서 변경되는 값을 관찰합니다.

가상 손 상호 작용을 사용하여 셰이더 부동 소수

셰이더 벡터

셰이더 벡터 애니메이션 가능 속성은 Vector4 형식의 셰이더 속성을 나타냅니다. 모든 셰이더 속성에는 속성 이름이 필요합니다. 아래 gif에서 Tiling(Main Tex_ST) 속성에 대한 재질 검사기에서 변경되는 값을 확인합니다.

가상 손 조작을 사용하여 셰이더 벡터

애니메이션 효과를 주는 셰이더 속성 이름을 찾는 방법

  1. 창 > 애니메이션 애니메이션 > 으로 이동합니다.

  2. 상태 시각화 도우미가 있는 개체가 계층 구조에서 선택되어 있는지 확인합니다.

  3. 애니메이션 창에서 애니메이션 클립 선택

  4. 속성 추가를 선택하고 메시 렌더러 폴드아웃을 엽니다.

    Animator 창에 애니메이션 속성 추가

  5. 이 목록에는 모든 애니메이션 가능 속성 이름의 이름이 포함됩니다.

    Animator 창의 메시 렌더러 애니메이션 속성

추가 정보