요약: 이 섹션에서는 대부분의 피드백, 아니면 모든 피드백에서 접하게 될 몇 가지 핵심 개념을 다룹니다.

테이블 내용
  • 핵심 개념  
  • 기본 제어  
  • 셰이커  
  • 채널  
        -  피드백과 셰이커에 채널 자산 설정하는 방법?  

  • 일시 중지  
        -   Pause 
        -   Holding Pause  
        -   스크립트 기반 일시 중지  

  • 루프  
  • 확률  
  • 타이밍  
        -   피드백을 역방향으로 재생하는 방법?  

  • 피드백 활성화 / 비활성화  
  • 트윈  
  • 리맵  
  • 상대 값  
  • 무작위화  
  • 자동 셰이커 설정  
  • 자동 대상 획득  
        -   참조 홀더 피드백을 사용하는 방법?  

  • 가산 재생  
  • 피드백을 재생하는 대체 방법  
        -   애니메이션 이벤트를 사용하여 MMF 플레이어를 애니메이션에서 재생하는 방법?  
        -   타임라인을 통해 MMF 플레이어를 트리거하는 방법  
        -   Playmaker로 MMF 플레이어를 트리거하는 방법?  

  • 특정 피드백 유형의 재생 방지  
  • 스크립트 기반 타임스케일  
  • 도움말 텍스트 비활성화

 

https://www.youtube.com/watch?v=pMOPgoTNYFk

 

핵심 개념

피드백 시스템은 강력하고 직관적이며 포괄적인 프레임워크로, 몇 번의 클릭만으로 모든 액션에 생동감 있는 피드백을 추가할 수 있도록 쉽게 통합할 수 있는 Unity 프로젝트용으로 설계되었습니다.

이를 사용하려면 두 가지 주요 구성 요소에 익숙해져야 합니다:

  • MMF_Player (More Mountains Feedbacks Player)는 원하는 만큼 개별 피드백을 담을 수 있는 컨테이너 역할을 하며, 피드백을 재생하고 순서를 정하는 책임을 집니다. 일반적으로 코드, Unity 이벤트 등을 통해 이 MMF_Player의 메서드를 호출하여 피드백 시퀀스를 재생/일시 중지/중지/역재생 등을 합니다.
  • 피드백은 MMF_Player에 추가하여 재생하도록 하는 요소입니다. 각각은 단일 액션(사운드 재생, 화면 깜빡임, 카메라 흔들기 등)을 담당합니다. 이러한 피드백은 150개 이상 있으며, 각 피드백마다 고유한 설정을 정의하여 독특하고 놀라운 효과를 만들 수 있습니다.

 

기본 제어

여기 MMF 플레이어를 제어할 수 있는 몇 가지 메서드가 있습니다. 물론 더 많은 메서드가 있지만, 이들로 시작할 수 있을 것입니다.

using UnityEngine;
using MoreMountains.Feedbacks;

public class Test : MonoBehaviour
{
	// 컴포넌트의 인스펙터를 통해 설정할 수 있는 플레이어를 선언합니다.
	// 여기서는 "new" MMF Player 클래스를 사용하고 있으며, 이는 지금부터 권장되는 옵션입니다.
	public MMF_Player MyPlayer;

	private void Something()
	{
		// 플레이어와 모든 피드백을 초기화하여,
		// 재생하기 전에 모든 설정이 올바르게 되어 있는지 확인합니다.
		MyPlayer.Initialization();
		// 플레이어에게 피드백 시퀀스를 재생하도록 요청합니다.
		MyPlayer.PlayFeedbacks();
		// 플레이어에게 피드백 시퀀스를 재생하도록 요청합니다.
		// 위치와 강도를 피드백에 전달합니다.
		Vector3 myPosition = new Vector3(1f, 2f, 0f);
		float myIntensity = 1f;
		MyPlayer.PlayFeedbacks(myPosition, myIntensity);
		// 플레이어를 중지하여 시퀀스의 모든 이후 피드백이 재생되지 않도록 합니다.
		MyPlayer.StopFeedbacks();
		// 시퀀스를 끝까지 건너뛰어 모든 피드백 타겟을 최종 상태로 만듭니다.
		// 이 작업은 완료하는 데 최대 3 프레임이 소요될 수 있습니다.
		MyPlayer.SkipToTheEnd();
		// SkipToTheEnd의 반대인 ForceInitialValues는 피드백이 전환의 시작 지점에 자신을 설정하도록 강제합니다.
		// 예를 들어, 객체의 스케일을 0에서 1로 설정하는 스케일 피드백에 대해 호출하면 스케일을 0으로 설정합니다
		// (이 메서드를 호출하기 전에 피드백을 초기화해야 합니다).
		MyPlayer.ForceInitialValues();
		// 모든 타겟을 초기 값으로 되돌립니다.
		MyPlayer.RestoreInitialValues();
	}
}

 

셰이커

일부 피드백은 객체와 직접 상호작용하지만, 다른 일부는 리스너에게 이벤트를 방송합니다. 예를 들어 Bloom 피드백, AudioSource 볼륨, 또는 Cinemachine 전환 피드백 모두 이러한 방식으로 작동합니다. 리스너는 수신자의 끝에서 대상 값을 "흔드는" 셰이커라고 합니다. 각 피드백의 인스펙터에서 일반적으로 셰이커가 필요하다는 언급이 있습니다. 이는 API 문서, 코드 주석 또는 피드백 목록에서 자세히 설명됩니다.

셰이커에 더 익숙해지기 위해 간단한 예제부터 복잡한 예제까지 몇 가지를 살펴보겠습니다. 대부분의 셰이커 기반 피드백은 정확히 이와 같이 작동하며, 셰이커와 피드백 양쪽 끝에서 사용할 수 있는 설정의 양이 다를 뿐입니다.

이것들을 시도해보려면 다음이 포함된 장면이 필요합니다:

  • 카메라와 그 앞에 있는 구체
  • PostProcess Volume을 추가한 빈 객체(또는 선호한다면 URP에 해당하는 것), IsGlobal로 설정하고 Vignette가 포함된 새 프로필 추가  
  • 카메라에 PostProcess Layer 추가, Layer에서 Everything 선택  
  • 장면에 MMF_Player 스크립트를 추가한 빈 객체  

포스트 프로세싱 피드백 추가

  • PostProcess Volume에 MMVignetteShaker 추가  
  • MMF_Player에서 Add > Post Process > Vignette 클릭  
  • Unity에서 재생을 누르고, MMF_Player를 재생

카메라 흔들림 피드백 추가

  • 카메라를 선택하고, MMCameraShaker를 추가합니다.
  • MMWiggle 인스펙터에서 Position을 체크합니다(선택적으로 회전 및 스케일을 조정할 수 있습니다). Position을 펼치고 WigglePermitted를 체크 해제한 후 WiggleType 드롭다운에서 Noise를 선택합니다.  
  • 장면의 루트에 빈 객체를 만들고, MMF_Player를 추가한 다음, Camera > Camera Shake 피드백을 추가합니다.  
  • Unity에서 재생을 누르고, MMF_Player 인스펙터 하단의 All Feedbacks Debug에서 피드백을 재생합니다.  
  • 카메라가 흔들리며, 카메라 흔들림 값을 조정하여 다양한 효과를 얻을 수 있습니다.

채널

거의 모든 셰이커가 있는 피드백에는 Channel 속성이 있습니다. 이를 통해 이 피드백을 방송할 고유한 채널을 지정할 수 있습니다. 셰이커도 Channel 속성을 가지고 있으며, 워키토키처럼 일치하는 채널을 가진 셰이커만 해당 피드백에 의해 제어됩니다. 이는 예를 들어, 분할 화면 설정에서 특정 화면의 Bloom만 흔들거나, 여러 오디오 소스의 볼륨을 한 번에 낮추면서 다른 소스에는 영향을 미치지 않도록 할 때 유용합니다.

모든 피드백(보통 Feedback Settings 펼침 메뉴 아래)과 셰이커에는 채널을 설정할 수 있는 옵션이 있습니다. 두 가지 주요 모드가 있습니다:

  • Int : 정수를 채널 식별자로 지정할 수 있습니다. 간단합니다. 피드백의 채널을 5로 설정하면 해당 유형의 모든 셰이커가 채널을 5로 설정하고 피드백이 재생될 때 흔들립니다.
  • MMChannel : 스크립터블 오브젝트 자산을 채널 식별자로 사용할 수 있습니다. 이는 단순한 정수를 사용하는 것보다 약간 더 많은 작업이 필요하지만, 읽기 쉽고, 디버그하기 쉽고(특정 자산이 사용된 모든 위치를 쉽게 확인할 수 있음), 시간이 지나도 유지 관리하기 쉽습니다(채널 자산의 이름을 변경하면 사용된 모든 위치에 영향을 줍니다). Feel은 사용하기 쉬운 MMChannel 자산을 많이 제공하지만, 물론 직접 생성할 수도 있고 생성해야 합니다. 다음은 그 방법입니다:

피드백과 셰이커에 채널 자산 설정하는 방법? 

이 예제에서는 스케일 셰이커를 설정하고 스케일 셰이커 피드백을 사용하여 이를 트리거합니다. 동일한 논리는 모든 셰이커와 이를 대상으로 하는 피드백에 적용됩니다.
  1. Unity 2022.3.23f1(또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)를 가져온 후 새 빈 장면을 만듭니다.
  2. 장면에 새 큐브를 만들고 위치를 (0,0,0)으로 설정한 다음, 큐브에 MMScaleShaker를 추가합니다.
  3. 재생을 누르고, 인스펙터의 Test 펼침 메뉴에서 StartShaking 버튼을 누르면 큐브가 0.5초 동안 스케일이 흔들리는 것을 확인한 후, 재생 모드를 종료합니다.
우리는 피드백에서 그 셰이커를 트리거하고자 하므로, 통신 채널을 설정하고 단순한 정수 대신 MMChannel 자산을 사용해 보겠습니다.
  1. 먼저 피드백이 셰이커와 통신할 수 있도록 채널 자산을 생성합니다(이미 가지고 있는 경우 이 단계를 건너뛸 수 있습니다). 프로젝트의 폴더에서 오른쪽 클릭하고 Create > More Mountains > MMChannel을 선택합니다. 이렇게 하면 새로운 MMChannel 자산이 생성되며, 이를 원하는 이름으로 변경할 수 있습니다. 이 자산의 이름을 MyFirstChannel로 변경합니다.  
  2. 큐브를 선택하고 MMScaleShaker에서 ChannelMode를 MMChannel로 설정한 다음, MyFirstChannel을 MMChannelDefinition 슬롯에 드래그합니다.
이제 다른 객체에서 이 동일한 흔들림을 트리거할 피드백을 설정하겠습니다.
  1. 새 빈 객체를 만들고, MMF Player 컴포넌트를 추가합니다.
  2. Transform > Scale Shake 피드백을 추가합니다.
  3. Feedback Settings 펼침 메뉴를 펼치고, Channel Mode를 MMChannel로 설정한 다음, MMChannelDefinition을 MyFirstChannel로 설정합니다.
  4. 에디터에서 재생을 누르고, MMF Player의 초록색 재생 버튼을 누르면 큐브의 스케일이 흔들립니다.

 

Pause

기본적으로 MMF_Player의 모든 피드백은 동시에 실행됩니다. 물론 각각의 피드백은 다른 내부 타이밍 설정, 초기 지연 시간 등을 가질 수 있지만, 모두 동시에 시작됩니다. 서로 다른 시간에 보이거나 활성화될 수 있지만, 모두 함께 시작됩니다.

하지만 하나 이상의 일시 정지를 도입하면 피드백이 이제 위에서 아래로 순차적으로 재생됩니다.

일시 정지에는 두 가지 유형이 있으며, 데모에서 비교할 수 있습니다:

 

Pause

일시 정지 피드백

이 MMF_Player에는 5개의 피드백, 그 다음 일시 정지, 그 다음 두 개의 피드백이 있습니다. 이 MMF_Player를 재생할 때, 상단에서 일시 정지까지(일시 정지를 포함하여) 모든 피드백이 동시에 재생됩니다. 나머지 두 개는 일시 정지 시간(이 경우 0.5초)이 지난 후 재생됩니다. 이는 실제로 마지막 두 피드백인 사운드와 스케일이 MMF_Player의 재생 후 0.5초 후에 시작된다는 것을 의미합니다.

 

Holding Pause

Holding Pause 피드백

이 MMF_Player는 위의 것과 동일한 설정을 가지고 있지만, 이번에는 일시 정지가 Holding Pause로 대체되었습니다. Holding Pause도 전체 지속 시간을 기다리지만, 시퀀스에서 그 위에 있는 모든 피드백이 완료될 때까지 기다립니다. 이 경우, 그 위에 있는 모든 피드백이 함께 시작되므로, 이 Holding Pause는 위의 가장 느린 피드백의 지속 시간(이 경우 2초)을 기다립니다. Holding Pause 자체의 지속 시간은 0.25초이므로, 마지막 두 피드백은 MMF_Player의 재생 후 2.25초 후에 실행됩니다.

이 두 가지 유형의 일시 정지는 매우 유용할 수 있으며, 둘 사이의 차이점을 이해하면 복잡한 패턴과 시퀀스를 매우 쉽게 만들 수 있습니다.

 

스크립트 기반 일시 중지

일시 정지를 스크립트를 통해 제어할 수도 있습니다. 일시 정지 및/또는 루프가 포함된 모든 MMF_Player에서 MMF_Player의 Pause() 메서드를 호출하면 실행이 일시 정지되고, MMF_Player의 Resume() 메서드를 호출할 때까지 일시 정지 상태가 유지됩니다. 이러한 기능은 MMF_Player의 인스펙터에서 사용할 수 있는 Pause 버튼을 통해 실험해볼 수도 있습니다. 스크립트 기반 일시 정지의 경우, 특정 시간(초 단위) 후에 자동으로 다시 시작되도록 설정할 수 있는 옵션이 있습니다. 이를 통해 X초 후에 자동으로 발생하거나, MMF_Player에서 Resume()을 호출하면 더 빨리 발생하는 흥미로운 설정을 만들 수 있습니다.

 

 

Loops
각 피드백의 타이밍 섹션에 있는 반복 옵션 외에도 시스템은 MMF_Player 레벨에서 "loops"를 정의할 수 있도록 합니다. 시퀀스에 "Loopers" 피드백을 추가하여 이를 수행할 수 있습니다. 루퍼를 만나면 재생 헤드가 마지막으로 만난 일시 정지 또는 마지막으로 만난 루프 시작으로 돌아갑니다.

루프 피드백

이 경우 AudioSource, Scale 및 Pause 피드백이 재생된 다음 Sound, Position 및 Scale이 재생됩니다. 그런 다음 루프가 있어서 Pause로 돌아간 다음 다시 Sound, Position 및 Scale이 재생됩니다. 이 루퍼는 2번의 루프를 재생하도록 지정되어 있으며, 그런 다음 종료됩니다.

루프 시작 피드백

이 설정은 상대적으로 유사하지만, 이제 일시 정지 앞에 루프 시작이 있습니다. 피드백은 루퍼와 루프 시작 사이에서 루프되어 지정된 횟수만큼 Sound 및 Scale 피드백을 재생합니다.

 

chance(확률)

모든 피드백에는 발생 확률을 정의할 수 있는 Chance 슬라이더가 있습니다. 0(절대 발생하지 않음)에서 100(항상 발생)까지 설정할 수 있습니다. 기본값은 항상 100입니다. 25%의 Chance 값을 가진 피드백은 통계적으로 4번 재생 중 한 번만 실행됩니다.

 

타이밍

모든 피드백의 인스펙터 상단 근처에는 Timing 펼침 메뉴가 있습니다. 이를 펼치면 다음 옵션에 접근할 수 있습니다:

  • TimeScale Mode: 스케일드 또는 언스케일드를 선택하여 피드백이 스케일드 시간 또는 언스케일드 시간에서 실행될지를 정의합니다. 이는 매우 상황에 따라 다르며, 모든 피드백에 적용되지는 않습니다.
  • Initial Delay: 이 피드백을 실행하기 전에 적용할 지연 시간(초 단위)
  • Cooldown Duration: 재생 후 피드백이 다시 실행될 수 없는 시간(초 단위). 사용자 제어 피드백의 스팸 방지를 위해 유용합니다.
  • ExcludeFromHoldingPauses: 이 설정을 통해 홀딩 일시 정지가 이 피드백을 무시하도록 합니다. 특히 긴 피드백을 다룰 때 유용하며, 시작은 하되 나머지 시퀀스를 지연시키지 않기를 원할 때 사용합니다.
  • ContributeToTotalDuration: 이 피드백을 부모 MMF_Player의 총 지속 시간에 포함할지 여부
  • Number of Repeats: 이 피드백이 반복되어야 하는 횟수(기본값 0)
  • Repeat Forever: 체크하면 피드백이 영원히 반복됩니다.
  • Delay Between Repeats: 반복 모드에서 피드백이 다시 실행되기 전에 지나야 하는 지연 시간(초 단위)
  • Play Direction: 이 섹션에서는 특정 피드백이 부모 MMF_Player가 특정 방향(기본값으로 위에서 아래 또는 역방향으로 아래에서 위로)으로 재생될 때 어떻게 반응해야 하는지를 정의할 수 있습니다.
  • MMFeedbacks Direction Condition: 이 피드백이 항상 재생될지, 아니면 부모 MMF_Player가 역방향 또는 순방향으로 재생될 때만 재생될지를 정의할 수 있습니다(기본값).
  • Play Direction: 이 피드백이 항상 정상 모드에서 재생될지, 역방향으로 재생될지, 호스트의 방향으로 재생될지, 호스트의 반대 방향으로 재생될지를 정의할 수 있습니다. 대부분의 피드백은 "역방향으로 재생"할 수 있습니다. 예를 들어, 객체를 지점 A에서 B로 이동시키는 위치 피드백은 역방향으로 재생될 때 B에서 A로 이동시킵니다.
  • Constant Intensity: 재생 시 MMF_Player는 자식 MMF_Feedback을 선택적 강도로 호출하며, 이는 피드백이 얼마나 강하게 재생되는지를 조절할 수 있는 배수입니다. Constant Intensity를 체크하면 이 피드백은 그 글로벌 수정자를 무시합니다.
  • Use Intensity Interval: 체크하면 이 피드백이 재생될 최소 및 최대 강도를 정의할 수 있습니다. 이 범위를 벗어난 강도는 이 피드백을 트리거하지 않습니다. 이는 하나의 MMF_Player가 강도에 따라 다른 결과를 가져와야 할 때 유용합니다. 예를 들어, 캐릭터가 피해를 입을 때 강하게 손상되면 빨간색으로 깜박이고, 약간 손상되면 노란색으로 깜박이게 하려는 게임을 상상해 보세요. "손상 받음" MMF_Player는 강도가 0에서 50 사이일 때 손상된 캐릭터를 노란색으로 칠하는 ShaderController 피드백과, 강도가 50에서 100 사이일 때 트리거되는 다른 ShaderController 피드백을 가질 수 있습니다.
  • Sequence: 이 피드백을 재생하는 데 사용할 시퀀스
  • Track ID: 시퀀스에서 사용할 ID
  • Quantized: 시퀀스가 양자화 모드에서 재생될지 여부

런타임에 SetInitialDelay, SetDelayBetweenRepeats 또는 SetSequence 메서드를 사용하여 타이밍 값을 변경할 수도 있습니다.

피드백을 역방향으로 재생하는 방법?

    1. MMF_Player를 선택하고, Settings 펼침 메뉴에서 Direction을 BottomToTop으로 설정합니다.  

    2. 코드를 통해 이를 강제할 수도 있습니다:
        MyPlayer.Direction = MMFeedbacks.Directions.BottomToTop;
        MyPlayer.PlayFeedbacks();

    3. 방향 옵션에 대한 자세한 내용은 문서의 전용 섹션에서 확인할 수 있습니다.

 

피드백 활성화 / 비활성화

피드백이 재생되지 않도록 하려면 여러 가지 방법이 있습니다:

  • 글로벌 레벨에서, MMFeedbacks.GlobalMMFeedbacksActive 정적 스위치를 대상으로 설정할 수 있으며, 이를 false로 설정하면 모든 피드백이 재생되지 않습니다.
  • MMF_Player 레벨에서는 피드백이 어떤 방식으로든 비활성화되어 있으면(모노, 게임 오브젝트 등) 재생되지 않습니다.
  • MMF_Feedback 레벨에서는 피드백 이름 옆의 체크박스를 선택하거나 선택 해제하여 피드백을 활성화하거나 비활성화할 수 있습니다. 또한 Active 체크박스를 확인할 수 있습니다.

 

Tweens

트윈 유형(Tween Type) 및 애니메이션 곡선 모드

여러 피드백에서 트윈 유형 필드를 접할 수 있습니다. 이는 일반적으로 값의 시간 경과에 따른 변화를 설명하는 데 사용됩니다. 일반적으로 회전 피드백(위 그림 참조)에서 AnimateX 불리언이 true인 경우 이러한 필드가 나타나는 것을 볼 수 있습니다. 피드백이 재생될 때, 지정된 트윈에 따라 대상의 x 회전을 일정 시간 동안(이 경우 1초) 0에서 360°로 애니메이트합니다. 왼쪽에는 사전 설정(Ease In Cubic)이 선택되어 있고, 오른쪽에는 애니메이션 곡선이 평가됩니다.

 

Remap

많은 피드백에서 "리맵된" 값을 접할 수 있습니다. 이는 애니메이션 곡선을 사용할 때 사용됩니다. Bloom 피드백을 예로 들어 보겠습니다. 이 피드백은 시간에 따라 블룸의 강도를 제어할 수 있게 합니다. 이 시간을 Shake Duration 필드를 통해 정의합니다. 그리고 이 기간 동안 강도가 어떻게 변해야 하는지를 정의하는 애니메이션 곡선을 가질 수 있습니다. 이 애니메이션 곡선은 x축에서 0에서 1까지 진행됩니다. 기술적으로는 y축에서 어떤 값도 설정할 수 있지만, 일반적으로 이를 0에서 1 사이로 정규화하는 것이 좋습니다. 여기서 리맵 필드가 등장합니다. Bloom 피드백에서는 RemapIntensityZero와 RemapIntensityOne 값을 정의할 수 있는데, 이는 각각 곡선의 y값 0과 y값 1에 해당하는 값입니다. 벨 곡선을 선택하고 이를 0과 1로 설정하면(기본값) 블룸이 0에서 1로, 다시 0으로 변합니다. 이를 1과 5로 리맵하면 블룸은 1에서 5로, 다시 1로 변하게 됩니다.

 

Relative Values(상대 값)

자산에 포함된 다양한 피드백 중 많은 것들이 시간 경과에 따라 값을 변화시킵니다. 블룸 강도, 오디오 소스 피치, 객체의 회전 등 다양한 경우에 이를 많이 접하게 될 것입니다. 대부분의 피드백은 "상대 값"을 사용하여 작업할 수 있도록 합니다(선택 사항). 상대 값을 사용하기로 결정하면, 피드백은 정의한 값을 대상의 초기 값에 더하게 됩니다.

 

Randomization(무작위화)

모든 MMF 피드백에는 Feedback Randomness 섹션이 있으며, 여기서 피드백의 출력을 랜덤화할지 선택할 수 있습니다. 이를 통해 피드백 출력에 랜덤한 강도 배율(두 개의 float 값 사이)을 적용할 수 있습니다. 이 수정자가 정확히 무엇을 하는지는 피드백에 따라 다르며, 세부 사항을 알고 싶다면 해당 코드에서 확인할 수 있지만, 일반적으로 피드백의 "강도"에 영향을 미칩니다. 예를 들어, 사운드 클립의 볼륨, 색수차 흔들림의 강도, 텍스처 오프셋의 거리 등이 이에 해당할 수 있습니다.

각 피드백의 랜덤 섹션에서 Random Duration Multiplier를 적용할지도 선택할 수 있습니다. 배율은 x와 y 값 사이에서 랜덤으로 선택되며, 피드백의 지속 시간에 직접적으로 영향을 미쳐 이를 증가시키거나 감소시킵니다. 유사한 지속 시간 수정자를 MMF Player 레벨에서도 적용할 수 있으며, 이 경우 모든 피드백에 동일하게 적용됩니다.

모든 수정자가 적용된 후 피드백의 최종 지속 시간은 다음 공식을 따릅니다:

Feedback Duration * Feedback's RandomDurationMultiplier * MMF Player's Duration Multiplier * MMF Player's RandomDurationMultiplier

 

Automatic Shaker Setup

많은 피드백이 셰이커에 의존합니다. 많은 경우에 수동으로 설정하는 것이 더 좋을 수 있지만, 피드백 시스템은 많은 피드백에 대해 자동 설정을 제공합니다.

Camera Shake 피드백의 Automatic Shaker Setup 버튼

이를 지원하는 피드백의 인스펙터에는 "Automatic Setup" 펼침 메뉴가 있습니다. 해당 버튼을 누르면 시스템이 해당 설정을 시도하도록 합니다. 이는 기존 볼륨에 MMVignetteShaker를 추가하는 것부터 피드백과 상황에 따라 메인 카메라를 이동시키고 전체 카메라 리그를 만드는 것까지 다양합니다. 이 버튼은 장면을 수정하며 최선을 다하지만, 모든 경우에 성공하지는 않을 수 있습니다. 그런 경우에는 지원 양식을 통해 상황을 보고해 주시면 시스템 개선과 더 많은 사용 사례를 다루는 데 도움이 됩니다. 어쨌든, 문제가 발생할 경우를 대비해 장면의 안전한 복사본을 보관해 두는 것이 좋습니다.

MMF Player의 설정 하단에서도 유사한 Automatic Shaker Setup 버튼을 찾을 수 있습니다. 이 버튼을 누르면 MMF Player의 개별 피드백에 있는 모든 자동 설정 버튼을 누르는 것과 동일한 효과를 얻을 수 있습니다.

이 비디오는 자동 셰이커 설정 사용 방법을 자세히 다룹니다:(동영상이 없어짐)

 

Automated Target Acquisition

일부 피드백은 단순히 메시지를 방송합니다(예: Vignette 피드백은 모든 일치하는 비네트 셰이커에게 "흔들림"을 알립니다). 그러나 일부는 특정 대상이 필요합니다. 예를 들어, Position 피드백은 이동할 트랜스폼이 필요하고, Light 피드백은 객체의 Light 컴포넌트가 필요합니다. 보통 그 대상은 피드백의 인스펙터에서 대상 슬롯에 끌어다 놓는 방식으로 설정됩니다. 물론 코드를 통해서도 대상을 설정할 수 있습니다. 때로는 대상 설정을 자동화하고 싶을 때가 있으며, 이때 자동 대상 획득(Auto Target Acquisition)을 사용합니다.

자동으로 설정할 수 있는 Target이 있는 피드백에서는 FeedbackSettings 펼침 메뉴(Timing 옆) 하단에 자동 대상 획득(Auto Target Acquisition)이라는 섹션을 찾을 수 있습니다. 여기에서 획득 모드(Acquisition Mode)를 선택할 수 있습니다:

 

  • None : 아무 일도 일어나지 않습니다.
  • Self : 대상은 MMF Player의 게임 오브젝트에서 선택됩니다.
  • AnyChild : 대상은 MMF Player의 자식 객체 중 하나에서 선택됩니다.
  • ChildAtIndex : 대상은 MMF Player의 자식 중 인덱스 X에 있는 자식에서 선택됩니다.
  • Parent : 대상은 일치하는 대상을 찾을 수 있는 첫 번째 부모에서 선택됩니다.
  • Various reference holders : 대상은 MMF Player의 피드백 목록에서 지정된 참조 홀더에서 선택됩니다(첫 번째 참조, 이 피드백 이전에 목록에서 처음 발견된 참조, 이 피드백에서 가장 가까운 참조, 다음으로 발견된 참조, 또는 목록에서 마지막 참조).

마지막 모드들은 Reference Holder 피드백을 사용합니다. 이를 다른 피드백과 마찬가지로 MMF Player에 추가할 수 있습니다. 재생될 때는 아무 것도 하지 않지만, 이 피드백에서 대상 게임 오브젝트를 정의할 수 있습니다. 참조 홀더 획득 모드에 있는 다른 피드백들이 참조 대상을 찾을 때, 이 참조 홀더가 해당 피드백의 설정과 일치하면 그 대상 게임 오브젝트에서 참조가 검색됩니다.

참조 홀더 피드백을 사용하는 방법?

  1. Unity 2022.3.23f1(또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)를 가져옵니다.
  2. 새 빈 장면을 만들고, 0,0,0 위치에 Cube를 추가합니다.
  3. 새 빈 객체를 만들고, 이름을 MyPlayer로 지정한 후 MMF Player를 추가합니다.
  4. Transform > Position 피드백을 추가하고, AnimatePositionTarget을 비워둔 채 AutomatedTargetAcquisition.Mode를 ClosestReferenceHolder로 설정합니다.
  5. Feedbacks > MMF Reference Holder 피드백을 추가하고, GameObjectReference를 Cube로 설정합니다.
  6. 에디터에서 재생을 누른 후 MyPlayer의 인스펙터에서 초록색 재생 버튼을 누르면, Position 피드백이 자동으로 가장 가까운 참조 홀더에서 대상을 가져와 Cube를 이동시킵니다. (여기서는 참조 홀더가 하나뿐이므로 선택이 쉽습니다.)

 

Additive Plays(가산재생)

많은 피드백에서 "AllowAdditivePlays" 옵션을 찾을 수 있습니다. 이 옵션이 true인 경우, 피드백이 진행 중이어도 호출 시 피드백이 트리거됩니다. 이 옵션이 false인 경우, 현재 피드백이 완료될 때까지 새로운 재생을 방지합니다.

 

 

Alternative ways to play a feedback(피드백을 재생하는 대체 방법)

대부분의 경우 코드로 피드백을 재생하고 싶겠지만, 다른 방법들도 있습니다. 다음 레시피는 그 중 일부를 다룹니다:

애니메이션 이벤트를 사용하여 MMF 플레이어를 애니메이션에서 재생하는 방법?

  1. Unity 2022.3.23f1(또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)를 가져옵니다.
  2. 새 장면을 만듭니다.
  3. 새 큐브를 만들고 위치를 0,0,0으로 설정합니다.
  4. 큐브에 MMF Player 컴포넌트를 추가하고, Sound 피드백을 추가한 후 Sfx 슬롯에 FeelDuckQuack 같은 오디오 클립을 설정합니다.
  5. 큐브에 새로운 Animator 컴포넌트를 추가합니다.
  6. 새 애니메이터 컨트롤러를 만들고 이름을 CubeAnimatorController로 지정한 후 이를 Animator 컴포넌트의 Controller 슬롯에 드래그합니다.
  7. Animation 패널을 열고, 새 애니메이션을 만들어 이름을 BouncyCube로 지정합니다.
  8. 애니메이션에 새로운 속성 Transform:Position을 추가하고, Record를 누릅니다.
  9. 프레임 0에 위치 0,0,0으로 키를 추가합니다.
  10. 프레임 20에 위치 0,1,0으로 키를 추가합니다.
  11. 프레임 0을 복사하여 프레임 60에 붙여넣으면, 이제 큐브가 위아래로 움직입니다.
  12. 프레임 25에 커서를 두고, AddEvent 아이콘(프레임 카운터 바로 아래)을 누른 다음, 인스펙터에서 Function 드롭다운에서 PlayFeedbacks()를 선택합니다.
  13. 에디터에서 재생을 누르면 큐브가 튀어오르며 애니메이션이 프레임 25를 지날 때마다 소리가 재생됩니다. 여기에서 더 많은 피드백을 추가하고 사용자 지정할 수 있습니다.

타임라인을 통해 MMF 플레이어를 트리거하는 방법

  1. Unity 2022.3.23f1(또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)를 가져옵니다.
  2. 이번 예제에서는 FeelDuck 데모 장면을 엽니다.
  3. 새 빈 객체를 만들고, 이름을 Director로 지정합니다.
  4. Timeline 패널을 엽니다(Window > Sequencing > Timeline).
  5. Timeline 패널에서 Create(디렉터 생성) 버튼을 눌러 새 자산을 TimelineDirector로 이름을 지정하고 프로젝트에 저장합니다.
  6. FeelDuckBackground를 타임라인으로 드래그하고 “Add activation track”을 선택합니다.
  7. Active 블록을 복사하여 오른쪽으로 이동시킵니다. 이제 두 개의 Active 블록이 있어야 하며, 그 사이에 약간의 간격이 있을 수 있습니다. 이것이 우리의 타임라인 애니메이션입니다(배경이 활성화/비활성화/활성화될 것입니다. 물론 자신의 타임라인에서 더 화려한 작업을 하고 싶을 것입니다).
  8. 프레임 카운트 아래의 작은 핀 아이콘을 눌러 마커 트랙을 표시합니다.
  9. 프레임 120 주변에서 마커 트랙을 오른쪽 클릭하고 “Add signal emitter”를 선택합니다.
  10. 인스펙터에서 Create Signal을 클릭하고 새 자산의 이름을 “TestMMFPlayer.signal”로 지정한 후 프로젝트에 저장합니다.
  11. 인스펙터에서 “Add signal receiver”를 클릭합니다.
  12. Director 객체를 선택하고, 인스펙터에서 SignalReceiver의 이벤트 반응 슬롯에 FeelDuckJumpStartFeedback을 드래그 하여 MMF Player > PlayFeedbacks() 메서드를 반응으로 선택합니다.
  13. 에디터에서 재생을 누르고, 타임라인에서 재생을 누르면 플레이 헤드가 마커를 지날 때마다 피드백이 재생됩니다.
  14. Timeline 및 Signals의 작동 방식에 대해 더 자세히 알고 싶다면 [여기](https://blog.unity.com/technology/how-to-use-timeline-signals)를 참조하세요.

Playmaker로 MMF 플레이어를 트리거하는 방법?

참고: 이를 수행하는 방법은 많으며, Bolt 및 기타 비주얼 스크립팅 도구에서도 (대부분의 경우) 동일한 일반 논리가 적용됩니다.

  1. Unity 2022.3.23f1(또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)를 가져옵니다.
  2. Playmaker를 설치합니다.
  3. 새 장면에서 빈 객체를 만들고, 이름을 MyFeedbacks로 지정한 후 MMF Player 컴포넌트를 추가합니다.
  4. Debug Log 피드백을 추가하고, Debug Message를 "Hello!"로 설정합니다.
  5. Playmaker 에디터를 열고, 오른쪽 클릭하여 FSM을 추가합니다.
  6. 첫 번째 상태의 이름을 "GettingInput"으로 바꾸고, Action Browser를 사용하여 GetKeyDown 액션을 추가하고, 키를 F2로 설정합니다.
  7. Send Event 드롭다운에서 New Event를 선택하고, 이름을 "F2Pressed"로 지정한 후 CreateEvent 버튼을 누릅니다. 그런 다음 빨간 레이블을 클릭하여 상태에 전환을 추가합니다.
  8. FSM을 오른쪽 클릭하여 새 상태를 추가하고, 이름을 "PlayingFeedbacks"로 지정합니다.
  9. 첫 번째 상태의 F2Pressed 이벤트를 오른쪽 클릭하여 전환 대상을 PlayingFeedbacks로 설정합니다.
  10. PlayingFeedbacks 상태를 오른쪽 클릭하여 전환 추가 > Finished를 선택한 후, Finished를 오른쪽 클릭하여 전환 대상을 GettingInput으로 설정합니다.
  11. PlayingFeedbacks 상태에서 Action Browser를 사용하여 CallMethod 액션을 추가하고, MyFeedbacks의 MMF Player 모노비헤이비어를 Behaviour 슬롯으로 드래그합니다. Method 드롭다운에서 "void PlayFeedbacks()"를 선택합니다.
  12. Unity 에디터에서 재생을 누르면, F2를 누를 때마다 피드백이 재생되고 콘솔에 "Hello!"가 나타납니다. MyFeedbacks MMF Player에 추가하는 다른 피드백도 물론 재생됩니다.

PlayingFeedbacks 상태

 

특정 피드백 유형의 재생 방지 

때때로 특정 유형의 피드백이 재생되지 않도록 하고 싶을 때가 있습니다. 모든 화면 흔들림을 한 번에 비활성화하거나 렌즈 왜곡 피드백이 재생되지 않도록 하고 싶을 때, 또는 옵션 메뉴의 설정에 연동되어 있을 수 있습니다. 이를 수행하는 것은 매우 간단하며 다음과 같이 할 수 있습니다:

// 이 코드는 모든 곳에서 모든 스케일 피드백이 재생되지 않도록 합니다
MMF_Scale.FeedbackTypeAuthorized = false;
// 물론, 스케일뿐만 아니라 모든 유형의 피드백에 대해 이 작업을 수행할 수 있습니다.

MMFeedbacksAuthorizations 컴포넌트를 사용할 수도 있습니다. 사용하기 매우 간단하며, 장면에 빈 객체를 만들고 인스펙터에서 재생하지 않기를 원하는 모든 피드백의 체크를 해제하면 됩니다. 또한, 토글 버튼을 눌러 피드백의 전체 섹션을 한 번에 체크 해제할 수도 있습니다.

 

스크립트 기반 타임스케일

피드백은 기본적으로 언스케일드 및 스케일드 타임스케일 모드를 지원합니다. 하지만 때때로 자신만의 타임스케일을 사용하고, 델타 타임과 시간을 직접 업데이트하고 싶을 수 있습니다. 이것도 지원됩니다! 이를 위해서는 대상 개별 피드백에서 Timing.UseScriptDrivenTimescale을 스크립트를 통해 true로 설정하고, Timing.ScriptDrivenDeltaTime과 Timing.ScriptDrivenTime을 수동으로 업데이트해야 합니다.

 

도움말 텍스트 비활성화

대부분의 피드백 인스펙터에서 피드백 사용 방법을 설명하는 도움말 텍스트 상자를 찾을 수 있습니다. 이를 비활성화하려면, MMFeedbacks/Editor/Resources에 있는 MMFeedbacksConfiguration 자산을 선택하고 "Show Inspector Tips"의 체크를 해제하면 됩니다.

'유니티 에셋 > Feel' 카테고리의 다른 글

Complete list of Feedbacks  (0) 2024.07.09
The MMF_Player component  (0) 2024.07.09
Getting started  (0) 2024.07.06
Demos  (0) 2024.07.06
에셋의 내용물  (0) 2024.07.06

+ Recent posts