요약: 이 페이지는 MMTools가 무엇인지 그리고 그것을 어떻게 사용하는지 설명합니다.

테이블 내용
  • MMTools란 무엇인가요?
  • MMTools 레시피
        -  씬에서 객체를 흔들리게 하는 방법은?

        -   MMHealthBar 컴포넌트를 사용하여 자동으로 체력 바를 그리는 방법은?

        -   MMBlink 컴포넌트를 설정하는 방법

 

MMTools란 무엇인가요?

MMTools는 대부분, 또는 모든 MoreMountains 에셋에서 사용되는 헬퍼와 시스템 모음입니다.

이들은 Feel에 포함되어 있으며, 원하는 프로젝트에서 자유롭게 사용할 수 있습니다. 주저하지 말고 탐색하고 실험해보세요. 모든 도구는 API 문서에 자세히 주석과 설명이 포함되어 있습니다.

MMTools에 대한 추가 문서가 곧 제공될 예정이지만, 이 비디오는 그 내용 중 일부에 대한 첫 번째 소개를 제공할 것입니다:

 

 

 

MMTools 레시피

씬에서 객체를 흔들리게 하는 방법은?

  1. Unity 2022.3.23f1 (또는 그 이상)에서 새 프로젝트를 생성하고 패키지 관리자에서 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. 새 씬에서 큐브를 생성합니다.
  3. 큐브에 MMWiggle 컴포넌트를 추가합니다.
  4. Position 체크박스를 체크하고, Wiggle Type을 Noise로 설정한 후, 플레이를 누르면 이제 흔들리는 큐브를 볼 수 있습니다.
  5. 이제 주파수, 진폭을 증가시키거나 쉬프트를 추가하여 (여러 개의 이러한 요소가 있는 경우 유용) 다른 옵션들을 가지고 놀 수 있습니다

 

 

 

 

MMHealthBar 컴포넌트를 사용하여 자동으로 체력 바를 그리는 방법은?

  1. Unity 2022.3.23f1 (또는 그 이상)에서 새 프로젝트를 생성하고 패키지 관리자에서 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. 새 빈 씬을 만듭니다.
  3. 큐브를 생성하고 위치를 0,0,0으로 설정합니다.
  4. 큐브에 MMHealthBar 컴포넌트를 추가합니다.
  5. 플레이를 누르면, 큐브 위에 체력 바가 그려지는 것을 볼 수 있습니다. 이제 MMHealthBar와 상호작용하고 업데이트하려면, 데이터를 전달하여 업데이트해야 합니다. 이를 위해 스크립트를 사용합니다.
  6. 새 C# 클래스를 생성하고, 이름을 TestMMHealthBar로 설정한 후 다음 코드를 붙여넣습니다:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MoreMountains.Tools;

/// <summary>
/// MMHealthBar 컴포넌트와 상호작용하고 테스트하기 위한 간단한 클래스
/// 사용하려면, MMHealthBar가 있는 객체에 추가하고, 런타임에 CurrentHealth 슬라이더를 이동시키고, Test 버튼을 눌러 바를 업데이트합니다.
/// </summary>
public class TestMMHealthBar : MonoBehaviour
{
    [Range(0f, 100f)]
    public float CurrentHealth = 50f;

    protected float _minimumHealth = 0f;
    protected float _maximumHealth = 100f;
    protected MMHealthBar _targetHealthBar;

    [MMInspectorButton("Test")] public bool TestButton;

    protected virtual void Awake()
    {
        _targetHealthBar = this.gameObject.GetComponent<MMHealthBar>();
    }

    public virtual void Test()
    {
        if (_targetHealthBar != null)
        {
            _targetHealthBar.UpdateBar(CurrentHealth, _minimumHealth, _maximumHealth, true);    
        }
    }
}
  1. 이 컴포넌트를 큐브에 추가하고, 플레이를 누른 후, 런타임에 인스펙터에서 CurrentHealth 슬라이더를 이동시킵니다. 매번 Test 버튼을 누를 때마다 체력 바가 업데이트됩니다.

 

 

MMBlink 컴포넌트를 설정하는 방법

 

MMBlink 컴포넌트를 사용하면 객체에 깜박이는 시퀀스를 정의할 수 있으며, MMBlink 피드백을 사용하여 이를 트리거할 수 있습니다. 설정하는 방법은 다음과 같습니다:

  1. Unity 2022.3.23f1 (또는 그 이상)에서 새 프로젝트를 생성하고 패키지 관리자에서 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. 새 씬에서 새 스프라이트 렌더러를 생성하고, 스프라이트를 "button-A"(또는 원하는 스프라이트)로 설정합니다.
  3. 스프라이트에 MMBlink 컴포넌트를 추가하고, Method를 Material Alpha로 설정한 다음, 스프라이트 렌더러를 MMBlink의 TargetRenderer 슬롯에 드래그합니다.
  4. 깜박임 시퀀스를 정의하기 위해 Phases 배열의 크기를 2로 설정합니다.
  5. 배열의 Element 0에서 PhaseDuration을 1로, OffDuration을 0.3으로, OnDuration을 0.7로 설정합니다.
  6. 배열의 Element 1에서 PhaseDuration을 0.5로, OffDuration을 0.2로, OnDuration을 0.3으로 설정합니다.
  7. Repeat Count를 -1로 설정하여 영원히 반복되도록 합니다.
  8. 플레이를 누르면 스프라이트가 반복적인 패턴으로 깜박입니다.

MMF Player로 이를 트리거하려면:

  1. MMBlink의 Blinking을 체크 해제하고, RepeatCount를 5로 설정합니다.
  2. 새 빈 게임 오브젝트를 생성하고, 이름을 MyTestFeedbacks로 설정한 다음, MMF Player를 추가합니다.
  3. MMBlink 피드백(renderer > MMBlink)을 추가하고, MMBlink 객체를 TargetBlink 슬롯에 드래그합니다.
  4. 에디터에서 플레이를 누른 다음, MyTestFeedbacks의 인스펙터에서 테스트 버튼을 누르면 스프라이트가 5번의 시퀀스 동안 깜박입니다.

MMBlink 컴포넌트는 객체를 활성화/비활성화하거나, 알파, 방출, 또는 재질 셰이더의 모든 float 값을 재생하여 객체를 깜박이게 하는 다양한 옵션을 제공합니다. 또한 이러한 값을 lerp할 수도 있습니다(이를 테스트하려면 Element0과 Element1의 On/Off Lerp Durations을 0.5로 설정).

 

 

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

MMAudioAnalyzer  (1) 2024.07.14
MMSoundManager  (0) 2024.07.14
Tweens and events  (0) 2024.07.13
Nice Vibrations  (0) 2024.07.13
Recipes  (0) 2024.07.11

요약: 이 페이지에서는 MMF를 사용하지 않고도 이벤트와 트윈을 사용하여 객체를 제어하는 방법을 설명합니다.

테이블 내용
  • 왜 트윈과 이벤트를 사용해야 하나요?
  • Feel에서의 이벤트
  • 트윈

 

왜 트윈과 이벤트를 사용해야 하나요?

Feel은 MMF Player와 150개 이상의 피드백을 통해 에디터에서만 많은 작업을 수행할 수 있게 해주지만, 코드를 통해 직접 거의 모든 작업을 수행할 수도 있습니다.

예를 들어, 코드를 통해 직접 MMF Player를 생성하고 원하는 피드백을 추가한 후 MMF Player를 재생할 수 있습니다. 또한, 플레이어의 모든 값을 매우 쉽게 수정할 수도 있습니다.

하지만 때로는 복잡한 마이크로 상호작용을 설정하고 싶지 않고, 한 줄의 코드로 간단하게 효과를 추가하고 싶을 때가 있습니다. 원하는 것이 단순할 때, MMF Player를 사용하는 것은 과도할 수 있으며, 피하고 싶을 수도 있습니다. 괜찮습니다. Feel은 매우 독립적인 아키텍처를 제공하여 이벤트와 트윈을 통해 거의 모든 작업을 수행할 수 있게 합니다.

 

Feel에서의 이벤트

많은 피드백과 시스템은 다른 클래스 및 컴포넌트와 통신하기 위해 이벤트를 사용합니다. 그 좋은 예로, 고급이지만 매우 간단한 사운드 관리자 MMSoundManager가 있습니다. 이는 피드백을 통해 제어하거나 한 줄짜리 이벤트를 사용하여 코드로 제어할 수 있습니다.

예를 들어, 이벤트를 사용하여 UI 사운드 트랙을 일시 정지하는 방법은 다음과 같습니다:

MMSoundManagerTrackEvent.Trigger(MMSoundManagerTrackEventTypes.PauseTrack,MMSoundManager.MMSoundManagerTracks.UI);

 

대부분의 셰이커(shaker)도 이벤트를 통해 제어할 수 있습니다. 셰이커에 대해 더 알고 싶다면, 셰이커 클래스 자체를 열어보세요. 해당 클래스는 일반적으로 관련된 이벤트도 정의하고 있습니다. 또는 해당 이벤트를 호출하는 피드백 클래스를 살펴볼 수도 있습니다.

다음은 몇 가지 예입니다:

// 간단한 카메라 흔들림 트리거, 이 이벤트는 MMCameraShaker 또는 MMCinemachineCameraShaker에 의해 처리됩니다
MMCameraShakeEvent.Trigger(duration: 1f, amplitude: 5f, frequency: 20f, amplitudeX: 5f, amplitudeY: 5f, amplitudeZ: 5f, infinite: false, channelData: new MMChannelData(MMChannelModes.Int, 0, null), false);

// 0.5초 동안 페이드 아웃 트리거, Ease-In Overhead 곡선을 따라, 이 이벤트는 MMFader에 의해 처리됩니다
MMFadeEvent.Trigger(0.5f, 0f, MMTween.MMTweenCurve.EaseInOverhead, 0, false, Vector3.zero);

// 리버브 흔들림 이벤트 트리거, 지정된 애니메이션 곡선을 따라 0에서 1까지 0.5초 동안 리버브 값을 흔들림
MMAudioFilterReverbShakeEvent.Trigger(someAnimationCurve, 0.5f, 0f, 1f);

 

관심 있는 셰이커를 확인하여 코드 어디에서나 이벤트를 통해 어떻게 해당 셰이커를 타겟팅할 수 있는지 알아보세요.

 

 

트윈

객체를 이동시키거나 값을 원점에서 목적지로 보간해야 할 때 MMF Player를 사용하고 싶지 않다면, MMTween 라이브러리를 간단히 사용할 수 있습니다.

예를 들어, 아래 코드는 대상 객체를 1초 동안 이징-인 엘라스틱 곡선을 따라 위로 이동시킵니다:

MMTween.MoveTransform(this, TargetTransform, new Vector3(0, 0, 0), new Vector3(0, 5, 0), null, 0f, 1f, MMTween.MMTweenCurve.EaseInElastic);

 

MoveTransform은 코루틴이므로, 완료되면 어떤 작업을 수행하도록 yield할 수도 있습니다.

또한 MMTween.MoveRectTransform 또는 MMTween.RotateTransformAround와 같은 다른 트윈 메서드에도 관심이 있을 수 있습니다.

같은 트윈 라이브러리를 사용하여 시간 경과에 따라 값을 단순히 보간할 수도 있습니다. Lerp와 유사하지만 더 많은 제어가 가능합니다. 대부분의 일반적인 유형을 지원하므로 도구 상자에 추가하기 좋은 도구입니다.

예를 들어, 이징-아웃 바운스 곡선을 따라 0과 5 사이의 중간 값으로 float 값을 트윈하는 방법은 다음과 같습니다:

 

float someValue = MMTween.Tween(currentTime: 0.5f, initialTime: 0f, endTime: 1f, startValue:0f, endValue:5f, MMTween.MMTweenCurve.EaseOutBounce);

 

동일한 MMTween.Tween 메서드는 Vector2, Vector3 및 Quaternion도 지원합니다. 이에 대해 더 알고 싶다면 MMTween 클래스를 확인해보세요.

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

MMSoundManager  (0) 2024.07.14
MMTools  (0) 2024.07.13
Nice Vibrations  (0) 2024.07.13
Recipes  (0) 2024.07.11
Add juice to your game using springs  (0) 2024.07.10

요약: 이 페이지는 Nice Vibrations가 무엇인지 및 그에 대한 정보를 찾는 방법을 설명합니다.

테이블 내용
  • Nice Vibrations란 무엇인가요?
  • 지원 플랫폼
  • 애셋의 내용물
        -    애셋에는 무엇이 포함되어 있나요?

        - 
  햅틱 샘플

        - 
 데모

        - 
 Nice Vibrations를 게임에 추가하기

  • 이것을 게임에 어떻게 추가하나요?
        -   내 장치가 지원되는지 어떻게 알 수 있나요?

        - 
 어떤 종류의 햅틱 기능을 지원하나요?

        - 
 내 장치가 모든 햅틱 기능을 갖추지 못하면 어떻게 되나요?

        - 
 진동을 어떻게 트리거하나요?

        - 
 햅틱 프리셋 재생

        - 
 햅틱 클립 재생

        -   햅틱 프리셋으로 대체

  • 햅틱 제어
        -   재생 제어

        -   실시간 변조

        -   햅틱 재생이 완료되었는지 알기

        -   글로벌 제어

        -   햅틱 컴포넌트

        -   햅틱 클립에 변형 추가

  • 플랫폼 고려 사항
        -   iOS

        -   안드로이드

        -   게임패드

  • 문제 해결
        -   iOS에서 시작 후 처음 30초 동안 진동이 작동하지 않습니다

        -   AdMob을 사용 중이며 광고를 닫은 후 iOS에서 소리가 나지 않습니다

        -   클라우드 빌드로 빌드하는 데 문제가 있습니다

 

Nice Vibrations란 무엇인가요?

Nice Vibrations는 iOS, 안드로이드, PC 및 콘솔 게임에 고해상도(HD) 햅틱 피드백을 추가하기 위한 간단하면서도 강력한 솔루션입니다. Lofelt와 More Mountains의 파트너십을 통해 개발되었으며, Lofelt Studio SDK를 기반으로 구현되었습니다. Nice Vibrations는 iOS 및 안드로이드 장치와 게임패드를 동시에 쉽게 타겟팅할 수 있는 범용 인터페이스를 제공합니다.

이 솔루션은 검증되고 실전 테스트를 거친 것으로, 작업을 확실히 수행합니다.

Feel 내에 선물로 포함되어 있으며, 모든 햅틱 및 럼블 요구를 충족할 수 있습니다.

 

지원 플랫폼

Nice Vibrations는 각 플랫폼의 햅틱 API를 통합된 방식으로 최적의 성능을 발휘할 수 있게 해줍니다. 물론, 더 나은 햅틱을 제공하도록 설계된 하드웨어에서는 더 높은 품질의 햅틱을 경험할 수 있습니다. 일반적으로 iOS 폰은 안드로이드 폰보다 성능이 훨씬 뛰어나고 더 많은 제어를 제공하므로, 사용자들은 아이폰에서 더 만족스러운 경험을 하게 됩니다. 게임패드의 경우, 진동을 미세 조정할 수 있는 정도가 크게 다릅니다.

모바일 기기: 아이폰과 안드로이드 폰이 지원됩니다.

콘솔: Nice Vibrations는 PS4, Xbox 및 스위치 컨트롤러를 각 콘솔에 연결했을 때 완전히 지원합니다. 프로젝트에 콘솔 전용 입력 패키지를 추가로 설치해야 할 수도 있습니다. 자세한 내용은 게임패드 요구 사항을 확인하세요.

PC: PS4 및 Xbox 컨트롤러가 지원됩니다.

Mac: 현재는 PS4 컨트롤러만 지원됩니다.

이 플러그인은 Unity 2019.4.16 LTS 버전 및 최신 안정 버전에서 작동합니다.

지원되는 빌드 환경: 안드로이드 기기, PC 또는 콘솔을 타겟팅하는 경우 어디서나 빌드할 수 있습니다. iOS용으로 빌드하려면 Mac에서 빌드해야 합니다. 대부분의 상황에서는 Windows에서 빌드할 수 있지만, 상황에 따라 더 복잡할 수 있습니다. 현재로서는 Unity가 네이티브 API와의 연결 방식을 변경했기 때문에 Unity Cloud Build에서 빌드하는 것은 거의 불가능합니다.


애셋의 내용물

애셋에는 무엇이 포함되어 있나요?

Unity 2019.4.16f 또는 최신 버전을 실행 중이라면, 애셋을 가져온 후 다섯 개의 폴더를 볼 수 있습니다.

만약 다섯 개의 폴더 구조를 보지 못한다면, 아마도 이전 버전의 Nice Vibrations를 사용 중일 것입니다. 이 경우, Unity를 최신 버전으로 업데이트해야 합니다(2019.2.9 이상에서는 v2.0, 2019.3 이상에서는 v3.0, 2019.4.16f 이상에서는 v4.0 사용 가능).

애셋의 내용을 삭제하지 않는 것을 권장합니다. 하지만 어떤 이유로 삭제해야 한다면, 각 폴더에 무엇이 들어있는지 아래를 참조하세요:

  • Scripts: 햅틱 재생을 트리거하는 데 필요한 모든 스크립트가 포함되어 있습니다. 이 폴더의 내용을 삭제하지 않는 것을 강력히 권장합니다.
  • HapticSamples: Lofelt에서 디자인한 80개 이상의 로열티 프리 햅틱 클립이 포함되어 있습니다. 이 클립들은 다양한 사용 사례를 다루며, 몇 초 만에 시작할 수 있습니다.
  • Demo: 애셋의 잠재력을 보여주는 데모 씬이 포함되어 있습니다. Demo 폴더의 "Common" 폴더에는 UI 및 기타 공통 기능을 처리하는 대부분의 데모에 사용되는 스크립트가 있습니다. 데모 폴더가 필요하지 않다고 느낀다면 전체 데모 폴더를 삭제할 수 있으며, 이는 완전히 선택 사항입니다.
  • Plug-ins: iOS 및 안드로이드를 위한 Lofelt Studio SDK 라이브러리로, Nice Vibrations의 핵심 기능을 제공합니다.
  • OlderVersions: 최신 버전으로 전환하는 것이 프로젝트에 맞지 않을 경우를 대비해 이전 버전의 Nice Vibrations가 포함되어 있습니다. 이 폴더에는 .unitypackage 파일이 포함되어 있으며, 이를 프로젝트에 간단히 풀어 넣을 수 있습니다. 이 작업을 수행하기로 결정했다면 최신 버전을 먼저 제거해야 합니다. 현재로서는 AHAP 지원을 원할 경우에도 이 작업이 필요합니다.


햅틱 샘플

80개 이상의 로열티 프리 햅틱 샘플 중에서 선택할 수 있으며, 애플리케이션 UX, 사운드 효과, 음악 등 다양한 사용 사례를 다룹니다. 이러한 샘플은 게임을 더 빠르게 몰입감 있게 만드는 데 도움이 됩니다.

샘플에는 Studio로 햅틱 클립을 만드는 데 사용된 오디오 파일도 포함되어 있습니다.

 

데모

 

Nice Vibrations 4는 플러그인이 제공하는 다양한 햅틱 피드백 옵션을 보여주는 7개의 데모를 제공합니다. 또한 이러한 데모의 전체 코드를 제공하여 애셋의 메서드를 실제로 볼 수 있습니다:

  • Wobble: 작은 워블 패드가 터치될 때 GameObject 컴포넌트 HapticSource를 트리거합니다. 각 패드는 다른 피치의 사운드와 햅틱을 재생합니다.
  • Ball: 튀어 오르는 공이 낙하 높이에 따라 다양한 진폭과 주파수의 강조 햅틱을 트리거합니다.
  • Continuous: 이 데모는 선택한 진폭, 주파수 및 지속 시간으로 연속적인 햅틱을 트리거할 수 있게 합니다. 연속적인 햅틱 효과가 재생되는 동안 진폭과 주파수를 변경할 수 있습니다.
  • HapticClips: 9가지의 사전에 디자인된 햅틱 클립을 탐색할 수 있습니다. 이 클립들은 Haptics Studio를 사용하여 관련 사운드에 맞추어 설계되었습니다.
  • Emphasis: 짧고 제어된 햅틱 피드백을 제공하는 강조 햅틱을 실험할 수 있습니다.
  • Car: 노브를 좌우로 돌리면 자동차의 엔진이 가속되는 것을 느낄 수 있습니다. 연료가 떨어지지 않도록 주의하세요!
  • Base presets: 기본 프리셋 데모를 사용하여 9가지의 다른 기본 햅틱 패턴을 경험할 수 있습니다(현재 Nice Vibrations 3.9에서만 사용 가능).

 

Nice Vibrations를 게임에 추가하기

이것을 게임에 어떻게 추가하나요?

Nice Vibrations를 사용하려면, 애셋 패키지를 가져와 프로젝트에 NiceVibrations 폴더를 추가하기만 하면 됩니다. 그게 전부입니다.

코드 전용 API를 사용하려면, 씬에 아무 것도 추가하거나 컴포넌트를 추가할 필요가 없습니다. 스크립트 어디에서나 Nice Vibrations의 메서드를 호출할 수 있습니다.

진동을 호출하는 스크립트 상단에 Nice Vibrations 네임스페이스를 추가해야 한다는 점을 유의하세요. 대부분의 IDE는 이를 자동으로 추가해 줍니다.

using Lofelt.NiceVibrations;

MonoBehaviours를 사용하고자 한다면, 코드를 작성하지 않고도 씬의 GameObject에 컴포넌트를 추가하여 햅틱을 트리거할 수 있습니다. 이는 오디오를 통합하는 방식과 유사합니다. 자세한 내용은 아래의 햅틱 컴포넌트 섹션을 참조하세요.

코드 전용 API와 MonoBehaviour API에 대한 자세한 내용은 API 문서를 참조하세요.


내 장치가 지원되는지 어떻게 알 수 있나요?

모든 기기가 햅틱 피드백을 지원하는 것은 아니며, 모든 기기가 동일하게 햅틱을 지원하는 것도 아닙니다.

Nice Vibrations로 햅틱을 재생하기 위한 요구 사항은 다음 기준에 따라 다릅니다:

기기에 액추에이터가 있어야 합니다, 기기 플랫폼이 필요한 네이티브 햅틱 API를 지원해야 합니다. 기기가 햅틱을 재생하기 위한 최소 요구 사항을 확인할 수 있습니다.

Nice Vibrations로 햅틱을 재생하기 위한 기기의 최소 요구 사항은 다음과 같습니다:

  • iPhone: iPhone 7 이상 / iOS 11 이상
  • Android: Android API 레벨 17 (Jelly Bean) / 액추에이터가 있어야 함
  • Gamepad: 새로운 Unity Input System을 사용하여 Rumble을 지원하는 게임패드

 

어떤 종류의 햅틱 기능을 지원하나요?

기기와 플랫폼에 따라 Nice Vibrations는 여러 종류의 햅틱 기능을 지원합니다.

기본 햅틱 기능

기본 기능으로는 미리 정의된 햅틱을 트리거할 수 있습니다. 안드로이드와 같은 일부 플랫폼에서는 진동의 강도가 아닌 일부 진동의 지속 시간을 제어할 수도 있습니다. 기기가 이 기능만 있는 경우, Haptics Studio로 작성된 햅틱 클립을 재생할 수 없습니다.

기기가 기본 햅틱 기능을 가지고 있는지 확인하려면 이 속성을 확인하세요:

bool hapticsSupported = DeviceCapabilities.isVersionSupported;

이 값이 false인 경우, 기기가 Nice Vibrations를 사용한 햅틱 재생을 지원하지 않는다는 의미입니다.

 

고급 햅틱 기능

 

고급 기능은 진동 강도를 제어하고 햅틱 클립을 재생할 수 있게 합니다.

기기가 고급 햅틱 기능을 가지고 있는지 확인하려면 다음 조건을 충족하는지 확인해야 합니다:

if (DeviceCapabilities.meetsAdvancedRequirements == true)

고급 햅틱 기능을 가진 기기에 대한 정보는 기술 요구 사항 섹션을 확인하세요.

 

실시간 햅틱 기능

 

이 기능은 고급 기능을 가지고 있는지 여부에 따라 달라집니다. 실시간으로 진폭 또는 주파수를 제어할 수 있으며, 햅틱 재생을 중지할 필요가 없습니다.

기기가 진폭 또는 주파수의 실시간 제어(변조)를 허용하는지 확인하려면 다음을 확인하세요:

bool amplitudeModulationSupported = DeviceCapabilities.hasAmplitudeModulation;
bool frequencyModulationSupported = DeviceCapabilities.hasFrequencyModulation;

 

 

내 장치가 모든 햅틱 기능을 갖추지 못하면 어떻게 되나요?

이상적으로는 모든 기기가 고급 및 실시간 제어 기능을 갖추기를 원하지만, 안타깝게도 게임패드와 안드로이드의 경우에는 그렇지 않습니다.

Nice Vibrations는 특정 플랫폼에서 지원되지 않는 기능에 대해서는 아무 것도 하지 않거나, 구형 기기를 위한 대체 지원을 활성화할 수 있습니다. 코드에 가드 체크를 추가할 필요는 없습니다.

예를 들어, HapticController.clipFrequencyShift는 현재 안드로이드 기기에서는 아무런 영향을 미치지 않지만, 기기가 이를 지원하는지 확인하는 가드 체크를 추가할 필요가 없습니다. 오류, 경고 또는 예외가 발생하지 않으며, 안드로이드에서는 단순히 아무 일도 일어나지 않습니다.

또 다른 예로, DeviceCapabilities.meetsAdvancedRequirements가 false인 경우가 있습니다. 이는 기기가 Haptics Studio로 작성된 햅틱 클립을 재생할 수 없음을 의미합니다. 하지만 다음 섹션에서 볼 수 있듯이, 햅틱 프리셋으로 대체할 수 있습니다.

그러나 런타임에 일부 기능이 없는 경우 어떻게 할지 결정할 수도 있습니다. 이를 확인하려면 DeviceCapabilities 클래스를 사용하면 됩니다. 자세한 내용은 API 문서에서 확인할 수 있습니다.

 

 

진동을 어떻게 트리거하나요?

Nice Vibrations는 다양한 종류의 진동을 트리거할 수 있는 많은 메서드를 제공합니다. 우선 강조 햅틱을 트리거하는 것부터 시작할 수 있습니다. 강조 햅틱은 짧지만 강렬한 진동으로, iOS 및 안드로이드 기기에서 모두 재생할 수 있습니다. 다음과 같이 어디서든 호출할 수 있습니다:

HapticPatterns.PlayEmphasis(1.0f, 0.0f);

 

매개변수는 진동의 진폭과 주파수를 나타냅니다. 진폭은 진동의 강도를 의미하고, 주파수는 햅틱 효과의 피치 또는 톤을 나타냅니다. 값이 증가할수록 주파수는 높아집니다. 이러한 값을 조정하여 경험을 더 잘 파악할 수 있습니다.

지정된 시간 동안 일정한 진동을 트리거하는 또 다른 간단한 방법은 다음과 같습니다:

HapticPatterns.PlayConstant(1.0f, 0.0f, 1.0f);

 

이는 진폭 1.0과 주파수 0.0으로 1초 동안 일정한 진동을 재생합니다. 물론, 더 오랜 시간 동안 재생할 수도 있습니다.

아마도 눈치채셨겠지만, 위의 두 메서드에 사용된 정적 클래스는 HapticPatterns라고 합니다. 이 클래스는 플러그인에 내장된 미리 정의된 간단한 진동 패턴을 재생할 수 있게 하며, 이를 통해 쉽게 게임에 햅틱을 추가할 수 있습니다.

 

 

햅틱 프리셋 재생

HapticPatterns 클래스를 사용하면, 세부적인 햅틱 클립 없이 간단하고 짧은 햅틱 패턴이 필요할 경우 햅틱 프리셋을 재생할 수 있습니다.

이 클래스에는 씬에 미묘한 햅틱을 쉽게 추가할 수 있는 9개의 미리 정의된 햅틱 패턴이 포함되어 있습니다.

진동 모터가 있는 안드로이드 기기의 Unity 지원 버전과 iPhone 7 / iOS 11 이상 버전의 iOS 기기에서도 이를 트리거할 수 있습니다.

예를 들어, 단일 코드 줄로 "Warning" 햅틱 프리셋을 트리거할 수 있습니다:

HapticPatterns.PlayPreset(HapticPatterns.PresetType.Warning)

 

 

햅틱 클립 재생

HapticPatterns를 재생하는 것 외에도 HapticClip을 재생할 수도 있습니다. 햅틱 클립은 HD 품질의, 기기 비종속적(haptic data)을 포함하고 있으며, Nice Vibrations는 이를 사용하여 재생 기기에서 최적의 햅틱 효과를 생성합니다.

 

Unity 애플리케이션에서 사용하고자 하는 모든 햅틱 클립은 먼저 프로젝트에 추가해야 합니다. 구체적으로, 햅틱 클립(확장자가 .haptic로 끝나는 파일)은 프로젝트의 Assets 폴더(또는 원하는 하위 폴더)에 추가해야 합니다. Finder/Explorer에서 이 폴더로 직접 햅틱 클립을 드래그하거나, Unity Project Explorer에 드래그할 수 있습니다.

HapticSamples 폴더에 있는 햅틱 클립을 즉시 사용할 수 있습니다. 또는 오디오에서 직접 만들고 싶다면 Haptics Studio를 사용할 수 있습니다.

using UnityEngine;
using Lofelt.NiceVibrations;

public class PlayerCharacter : MonoBehaviour
{
    // Inspector 창에서 점프 햅틱을 선택할 수 있는 GUI 요소를 표시합니다
    public HapticClip jumpHaptic;

    public void Jump()
    {
        // jumpHaptic을 재생합니다
        HapticController.Play(jumpHaptic);
    }
}

 

위의 스크립트와 유사한 코드를 사용하는 경우, 다음으로 Unity Editor로 이동하여 HapticSamples 폴더에서 HapticClip을 선택한 후, 이를 스크립트의 Inspector 속성에 드래그 앤 드롭해야 합니다. 이 경우 "Jump Haptic" 속성에 해당됩니다.

 

HapticPatterns.PlayConstant(..) 또는 HapticController.Play(..)가 호출된 후, 햅틱이 끝나기 전에 중지하고 싶다면, 다음을 호출하기만 하면 됩니다:

HapticController.Stop()

그게 전부입니다.

 

햅틱 프리셋으로 대체

기기가 햅틱 클립을 재생할 수 없는 경우(DeviceCapabilities.meetsAdvancedRequirement가 false를 반환하는 경우), 대신 다음 예제와 같이 대체 햅틱 프리셋을 트리거할 수 있습니다:

HapticController.fallbackPreset = HapticPatterns.PresetType.Selection;
HapticController.Play(jumpClip);

이 예제는 jumpClip 햅틱 클립 또는 대체 햅틱 프리셋 HapticPatterns.PresetType.Selection을 재생합니다. 이는 HapticController.Play(HapticClip clip)에 의해 자동으로 수행되며, DeviceCapabilities.meetsAdvancedRequirement를 확인하고 햅틱 클립이나 햅틱 프리셋을 재생할지 결정합니다.

 

 

햅틱 제어

Nice Vibrations를 사용하여 게임에 햅틱을 추가하는 것 외에도 할 수 있는 일이 많습니다. 예를 들어, 햅틱 클립에서 특정 시간으로 이동하거나, 원하는 때에 햅틱의 진폭과 주파수를 제어하거나, GameObject에 햅틱 컴포넌트를 추가하는 등의 작업이 가능합니다.

 

재생 제어

Nice Vibrations를 사용하면 햅틱 클립 내에서 특정 시간으로 앞뒤로 이동할 수 있습니다:

HapticController.Load(jumpHaptic);
HapticController.Seek(0.2);
HapticController.Play();

Seek(float time)은 호출되기 전에 햅틱 클립이 로드되어 있어야 하며, 재생 후에만 적용됩니다. 이 경우, 햅틱 클립에서 0.2초로 이동합니다.

또한 하나의 햅틱 클립만으로도 다양한 종류의 햅틱 효과를 얻기 위해 클립을 반복 재생할 수도 있습니다.

HapticController.Load(loopHaptic);
HapticController.Loop(true);
HapticController.Play();

이렇게 하면 haptic 클립 loopHaptic이 HapticController.Stop()이 호출될 때까지 반복 재생됩니다.

 

 

실시간 변조

Nice Vibrations를 사용하면 런타임에 햅틱을 제어할 수 있습니다. 구체적으로, 다음과 같이 진폭과 주파수 분기점을 변경하여 햅틱 클립을 조절할 수 있습니다:

// 모든 진폭 엔벨로프 분기점을 0.7로 곱합니다
HapticController.clipLevel = 0.7;

// 모든 주파수 엔벨로프 분기점을 0.2로 이동시킵니다
HapticController.clipFrequencyShift = 0.2;

 

clipLevel은 오디오의 "볼륨 조절"과 동일합니다. 이 경우 1.0 이하의 값으로 감쇠시키고, 1.0 이상의 값으로는 이득을 추가할 수 있습니다. 1.0 이상의 값은 1.0으로 클리핑됩니다.

clipFrequencyShift를 사용하면 -1.0과 1.0 사이의 원하는 값을 추가하여 햅틱 클립의 "피치" 또는 "톤"을 설정할 수 있으며, 이 값도 1.0으로 클리핑됩니다.

이 기능을 어떻게 사용할 수 있는지 보려면 Demo/NiceVibrationsDemo.unity 씬의 Car 데모 탭을 확인하세요. CarDemoManager.cs 스크립트의 HandlePower() 메서드는 노브를 돌려 자동차 속도를 증가/감소시키는 것이 사용자 상호 작용에 따라 실시간으로 변경되는 햅틱을 생성하는 방법을 보여줍니다.

먼저, Knob 클래스에서 제공한 값으로 HapticPatterns.PlayConstant(..)이 호출됩니다. 이를 통해 일정한 진동을 트리거하는 초기 값이 설정됩니다.

protected virtual void HandlePower()
{
   _knobValue = Knob.Active ? Knob.Value : 0f;
   if (!_carStarted)
   {
      ...
      HapticPatterns.PlayConstant(_knobValue, _knobValue, MaximumPowerDuration);
      CarEngineAudioSource.Play();
      ...
   }
   ...
}

 

사용자가 노브와 상호작용할 때, 일정한 진동의 진폭과 주파수를 사용자의 상호작용에 맞게 업데이트해야 합니다. HapticController.SetAmplitudeMultiplication(float factor) 및 HapticController.ShiftFrequency(float shift)를 사용하여 진폭과 주파수의 실시간 변조를 생성할 수 있습니다.

 

이를 위해 HapticController.clipLevel 및 HapticController.clipShiftFrequency를 사용하여 진폭과 주파수의 실시간 변조를 생성합니다.

clipLevel은 햅틱의 진폭을 증가 또는 감소시키고, clipFrequencyShift는 진동의 피치를 이동시킵니다. 이러한 조합으로 가속 페달을 밟을 때와 유사한 효과를 얻을 수 있습니다. 페달을 밟으면 모터 소음과 진동이 강도와 피치 모두에서 증가하는 것을 느낄 수 있습니다.

if (_knobValue > MinimumKnobValue)
{
   Power -= Time.deltaTime;
   Power = Mathf.Clamp(Power, 0f, MaximumPowerDuration);

   HapticController.clipLevel = _knobValue;
   HapticController.clipFrequencyShift = _knobValue;
   ...
}

 

대안으로, HapticPatterns 대신 HapticClip을 사용할 수 있습니다. Haptics Studio를 사용하여 자동차 소리를 이용해 자동차 엔진 햅틱 클립을 설계할 수 있습니다. 이 경우, 다음을 사용하지 않게 됩니다:

HapticPatterns.PlayConstant(_knobValue, _knobValue,
MaximumPowerDuration);

CarEngineAudioSource.Play();

 

대신, 다음으로 재생을 초기화하게 됩니다:

HapticController.Play(carEngineHaptic); // carEngineHaptic은 HapticClip carEngineHaptic으로 정의됩니다

HapticController.clipLevel = _knobValue;
HapticController.clipFrequencyShift = _knobValue;

CarEngineAudioSource.Play();

 

노브 상호작용을 기반으로 한 진폭과 주파수의 실시간 변조를 위한 코드는 동일하게 유지됩니다.

 

햅틱 재생이 완료되었는지 알기

Nice Vibrations를 사용하면 햅틱 효과가 재생이 완료될 때 콜백을 받을 수 있습니다. 이러한 콜백을 생성하려면, 클래스 중 하나에 다음 코드를 작성하면 됩니다:

protected void OnHapticsStopped()
{
    // 햅틱이 중지되었을 때 수행할 작업 - 일반적으로 재생이 완료되었기 때문
}

protected virtual void OnEnable()
{
    HapticController.PlaybackStopped += OnHapticsStopped;
}

protected virtual void OnDisable()
{
    HapticController.PlaybackStopped -= OnHapticsStopped;
}

이것을 연속 데모 탭에서 실제로 확인할 수 있습니다.

 

글로벌 제어

Nice Vibrations는 글로벌 출력 레벨 및 햅틱 활성화와 같은 글로벌 제어 기능을 제공합니다. 햅틱 효과는 놀랍지만 때로는 이를 끄거나 레벨을 낮추고 싶을 때가 있습니다. 햅틱을 켜고 끄려면 다음을 호출할 수 있습니다:

// 모든 햅틱을 끕니다
HapticController.hapticsEnabled = false;

// 모든 햅틱을 켭니다
HapticController.hapticsEnabled = true;

 

그리고 햅틱의 "메인 볼륨"과 유사하게 글로벌 출력 레벨을 조정하려면 다음을 호출할 수 있습니다:

// 진동 강도를 0.5로 조정합니다
HapticController.outputLevel = 0.5;

 

 

햅틱 컴포넌트

지금까지 Nice Vibrations 4의 코드 전용 API를 다뤘습니다. 또한 코드 작성 없이 또는 스크립트에 아주 적은 코드만 작성하여 햅틱 클립을 재생하기 위해 컴포넌트를 씬에 추가할 수도 있습니다.

Unity에서 오디오 시스템은 오디오 에셋을 다양한 GameObject에 할당하여 작동합니다. 최종 오디오 믹스는 플레이어나 카메라 주위의 GameObject 위치에 따라 결정됩니다. 카메라에는 Audio Listener 컴포넌트가 장착되고, 플레이어에는 Audio Source 컴포넌트가 있습니다.

Nice Vibrations 컴포넌트는 이와 유사한 원리로 작동합니다. HapticSource를 다양한 GameObject에 할당할 수 있으며, 이벤트 발생 시 또는 스크립트를 통해 재생을 트리거할 수 있습니다.

Haptic Receiver

첫 번째로 GameObject에 추가해야 할 컴포넌트는 HapticReceiver입니다. 이 컴포넌트는 전체 애플리케이션 동안 하나의 GameObject에만 추가해야 합니다. 대부분의 경우, AudioListener를 추가하는 것과 유사하게 MainCamera GameObject에 이를 추가해야 합니다. 프로젝트에 하나의 HapticReceiver 컴포넌트만 있는지 확인하세요.

 

이것이 어떻게 작동하는지 데모 씬에서 확인할 수 있습니다. 데모 씬의 오른쪽 하단에 MainCamera에 HapticReceiver가 사용되고 있습니다.

HapticReceiver를 통해 글로벌 출력 레벨을 설정하거나 햅틱을 켜거나 끌 수 있습니다.

아래는 데모 씬의 HapticSwitch와 유사하게, 코드를 작성하지 않고 HapticReceiver 속성을 사용하는 예입니다.

 

Haptic Source

HapticSource 컴포넌트는 AudioSource와 유사합니다. HapticSource는 HapticClip을 재생하는 역할을 담당합니다.

 

HapticSource에서는 루프, 우선 재생, 진폭 곱셈 및 주파수 이동과 같은 다양한 속성을 설정할 수 있습니다. HapticSource는 각 HapticClip을 재생하기 전에 이러한 속성을 지정해야 하는 HapticController보다 더 큰 유연성을 제공합니다.

GameObject에서 코드를 사용하지 않고도 지정된 HapticSource와 연관된 이벤트를 트리거하도록 결정할 수 있습니다.

 

 

하지만 아래의 Wobble 데모 예제와 같이 스크립트를 작성하여 사용할 수도 있습니다.

...
public virtual void OnPointerExit(PointerEventData data)
{
   ...
   SpringAudioSource.Play();
   SpringHapticSource.Play();
}
...
public virtual void SetPitch(float newPitch)
{
   SpringAudioSource.pitch = newPitch;
   SpringHapticSource.frequencyShift = NiceVibrationsDemoHelpers.Remap(newPitch, 0.3f, 1f, -1.0f, 1.0f);
}

 

이 경우, AudioSource가 트리거되면 HapticSource도 동일하게 트리거됩니다. 이는 오디오와 햅틱 간의 동기화를 시도하는 것입니다. Wobble 데모에서 각 버튼이 눌리면 오디오와 햅틱 모두에 대해 새로운 주파수 이동이 설정됩니다.

원한다면 HapticSource에 대한 속성을 코드에서 더 설정할 수도 있습니다:

// 햅틱 클립 재생을 루프로 설정
SpringHapticSource.loop = true;

// 햅틱 클립의 진폭 수준 설정, 예: 진동 "강도"
SpringHapticSource.level = 1.1;

// HapticSource의 재생 우선순위 설정;
// 가장 높은 우선순위는 0에 해당하며, 가장 낮은 우선순위는 255에 해당
SpringHapticSource.priority = 0;

 

여러 HapticSource 컴포넌트를 다룰 때 우선순위를 설정하는 것이 중요합니다. Nice Vibrations는 한 번에 하나의 HapticClip만 재생할 수 있습니다. 플레이어의 발소리와 관련된 HapticSource는 폭발과 관련된 HapticSource보다 낮은 우선순위를 가질 수 있습니다.

// 가장 낮은 우선순위
stepsHapticSource.priority = 255;

// 가장 높은 우선순위
explosionHapticSource.priority = 0;

 

만약 우선순위가 동일하다면, stepsHapticSource가 explosionHapticSource의 재생을 중단시킬 수 있습니다.

이 모든 예제는 코드로 작성되었지만, Unity Editor를 사용하여 동일한 작업을 수행할 수도 있습니다. 이는 Unity를 사용하는 방식에 따라 다릅니다.

 

햅틱 클립에 변형 추가

반복 피로를 줄이고 햅틱을 더욱 흥미롭게 만들기 위해, 실시간 진폭 또는 주파수 변조를 사용하여 햅틱 클립에 변화를 줄 수 있습니다.

예를 들어, 반복적인 발소리를 매번 약간 다르게 느껴지게 할 수 있습니다. 또는 플레이어와의 거리 기반으로 먼 폭발을 덜 강렬하게 느끼게 할 수 있습니다.

// 발소리 변동
footstepHapticSource.frequencyShift = Random.Range(0.0f, 0.4f);
footstepHapticSource.Play();

 

플랫폼 고려 사항

Nice Vibrations 4는 햅틱을 재생할 수 있는 범용 인터페이스를 제공하지만, 플랫폼마다 일부 기능 및 요구 사항에 차이가 있습니다.

 

iOS

iPhone에서는 기본 햅틱 기능을 위해 iPhone 7 또는 최신 모델과 iOS 11 또는 최신 버전이 필요합니다. 고급 기능을 위해서는 iPhone 8 또는 최신 모델과 iOS 13 또는 최신 버전이 필요합니다. 기본 기능은 강조와 프리셋만 재생할 수 있습니다. 일반적으로 iPhone이 고급 햅틱 기능을 갖추고 있는 경우에는 제한이 없습니다. 그러나 기기가 기본 햅틱 기능만 있는 경우, HapticPatterns.PlayConstant() 메서드는 대체 햅틱 프리셋이 제공될 때만 작동합니다.

 

안드로이드

안드로이드에서는 기본 햅틱 기능을 위해 Android API 레벨 17과 액추에이터가 필요합니다. 고급 기능을 위해서는 API 레벨 26과 진폭 제어가 가능한 액추에이터가 필요합니다.

현재 안드로이드는 iOS에 비해 몇 가지 재생 제한이 있습니다:
HapticController.SetFrequencyShift(), HapticSource.frequencyShift 및 주파수 엔벨로프가 있는 HapticClip은 안드로이드 폰에서 아무런 작동을 하지 않습니다. 현재 안드로이드 API는 전화기의 액추에이터가 얼마나 빨리 진동해야 하는지를 조작할 수 있는 방법을 제공하지 않습니다.
HapticPatterns.PlayEmphasis() 및 강조 포인트가 있는 HapticClip: iOS 13+에서는 CoreHaptics API에서 제공하는 "transient"라는 특별한 유형의 햅틱을 사용하여 강조 햅틱을 구현합니다. 현재 안드로이드는 이러한 유형의 햅틱을 지원하지 않으므로 연속적인 햅틱 출력 내에서 강조된 햅틱을 에뮬레이트합니다.
HapticController.Loop, HapticSource.loop: 안드로이드에서는 루핑에 문제가 있어 이를 안드로이드 팀에 보고했습니다. 이 문제는 안드로이드 12에서 수정되었습니다. 그러나 이전 버전에서는 여전히 루핑에 제한이 있습니다. 긴 햅틱 클립에서는 효과가 고르지 않게 느껴질 수 있지만, 짧은 클립에서는 충분히 괜찮을 수 있습니다.

 

게임패드

요구 사항

게임패드에서 햅틱을 재생하기 위해 Nice Vibrations 4는 Unity의 최신 Input System 패키지에 의존합니다. Nice Vibrations 4가 게임패드와 함께 작동하도록 하려면 프로젝트에 다음 작업을 수행해야 합니다:

  • Input System 패키지를 설치하고 가져오기
  • 프로젝트 플레이어 설정에서 "Active Input Handling"을 활성화하기. 아래 이미지에서 볼 수 있듯이 "Both"를 선택하는 것이 좋습니다.

 

이것이 Nice Vibrations 4가 필요로 하는 전부이며, 이를 통해 Windows 및 Mac에서 Unity의 Input System을 통해 럼블을 지원하는 게임패드에 햅틱을 재생할 수 있습니다. 지원되는 기기에 대한 자세한 내용은 Input System의 문서 Rumble 섹션을 참조하세요.

콘솔의 경우, 프로젝트에 콘솔 전용 Input System 패키지를 설치해야 합니다.

Unity의 Input System이 럼블을 지원하는 게임패드는 기본적으로 제한된 모든 햅틱 기능을 지원합니다. 대부분의 게임패드 액추에이터 기술은 HD 햅틱을 생성할 수 없는 ERM 액추에이터를 기반으로 합니다. 자세한 내용은 제한 사항 섹션을 참조하세요.

iOS 또는 안드로이드 기기에 연결된 게임패드 컨트롤러는 햅틱 재생을 지원하지 않습니다.

게임패드 지원을 비활성화하고 HapticClip 객체의 크기를 줄이려면, 플레이어 설정의 "Scripting Define Symbols"에서 플랫폼 커스텀 정의 NICE_VIBRATIONS_DISABLE_GAMEPAD_SUPPORT를 설정할 수 있습니다.

 

변경 후 모든 햅틱 클립 에셋을 다시 가져와야 합니다.

특정 API

HapticSource, HapticController 및 HapticPatterns와 같은 Nice Vibrations 4의 API는 게임패드가 연결되면 자동으로 게임패드에서 햅틱을 재생합니다. 그러나 게임에 여러 개의 게임패드가 연결된 경우, 어떤 게임패드에서 햅틱이 재생될지를 설정해야 할 수 있습니다. 이를 위해서는 GamepadRumbler 클래스에서 게임패드 전용 메서드를 호출해야 합니다.

GamepadRumbler.SetCurrentGamepad(2);

 

이 경우, 메서드는 세 번째 게임패드에 진동을 트리거하게 됩니다.

제한 사항

일반적으로, 대부분의 시장에 있는 게임패드의 액추에이터 기술로 인해 게임패드 햅틱의 품질은 최상이 아닙니다. 또한, Input System API 호출은 메인 스레드에서 이루어져야 하므로 햅틱 클립을 재생하기 위한 타이머 해상도는 최대 1/60 FPS입니다.

이로 인해 세부 사항이 많은 햅틱 클립은 게임패드에서 최상의 느낌을 제공하지 못합니다. 예를 들어, iOS에서 훌륭하게 느껴진다면, 게임패드에서의 느낌에 대한 기대를 관리해야 합니다.

우리는 향후 릴리스에서 Input System이 재생할 수 있는 분기점 수를 자동으로 조정하여 게임패드에서 햅틱 클립 재생의 품질을 개선할 계획입니다.

이 외에도 현재 게임패드에 대한 몇 가지 기능에는 제한이 있습니다:

HapticController.clipFrequencyShift와 HapticSource.frequencyShift는 게임패드에서 아무런 작동을 하지 않습니다.
HapticController.PlayConstant(): 현재 이 메서드의 주파수 매개변수를 변경해도 아무런 효과가 없습니다. 이는 사용 가능한 HapticController.clipFrequencyShift에 의존합니다.
Linux, 다중 게임패드 병렬 햅틱 재생 또는 모바일 전화에 연결된 게임패드 컨트롤러는 지원되지 않습니다.

 

문제 해결

iOS에서 시작 후 처음 30초 동안 진동이 작동하지 않습니다

iOS에서는 첫 번째 진동을 트리거한 후 처음 30초 동안 강조 진동 이외의 진동이 작동하지 않을 때가 있습니다. 이는 알려진 iOS 문제로, CoreHaptics가 초기화 직후 진동을 트리거하지 못할 때가 있습니다. 이 문제를 해결하기 위해, 초기화와 첫 진동 사이에 충분한 시간을 두어 CoreHaptics가 제대로 작동할 수 있도록 애플리케이션 시작 시 Nice Vibrations를 초기화해야 합니다. 이를 수행하는 두 가지 방법이 있습니다:

씬에 HapticReceiver를 배치합니다. 이는 씬이 로드될 때 Nice Vibrations를 초기화하는 작업을 처리합니다.
씬에 HapticReceiver를 배치하고 싶지 않은 경우, 씬의 GameObject의 MonoBehaviour의 Awake() 또는 Start() 메서드에서 직접 HapticController.Init()을 호출할 수 있습니다.

 

AdMob을 사용 중이며 광고를 닫은 후 iOS에서 소리가 나지 않습니다.

이 문제를 해결하기 위한 해결 방법은 광고를 표시하는 함수를 호출하기 전에 네이티브 바인딩을 해제하고, 호출한 후에 네이티브 바인딩을 초기화하는 것입니다:

// 햅틱 바인딩 해제
LofeltHaptics.Release();

// 광고가 닫힐 때까지 대기
await ShowRewardedAd();

// 햅틱 바인딩 초기화
LofeltHaptics.Initialize();

 

클라우드 빌드로 빌드하는 데 문제가 있습니다

현재로서는, Cloud Build를 바로 사용하여 우리의 플러그인을 사용할 수 없습니다. 기술적으로는 가능하지만, 경로를 수동으로 조정해야 하므로 번거로울 수 있습니다. 그동안에는 로컬에서 빌드하는 것을 권장합니다.

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

MMTools  (0) 2024.07.13
Tweens and events  (0) 2024.07.13
Recipes  (0) 2024.07.11
Add juice to your game using springs  (0) 2024.07.10
Screen Shakes  (0) 2024.07.10

요약: 이 페이지에는 Feel을 사용하여 일반적인 작업을 몇 가지 단계로 수행하는 방법을 가르쳐주는 '레시피'가 나와 있습니다.

테이블 내용
  • 소개  
        -  프로젝트에 Feel을 설치하는 방법?  

        -   MMF Player를 사용하여 파티클 시스템을 트리거하는 방법?  

        -   시네머신 카메라 흔들림을 설정하는 방법 (카메라 흔들림을 설정하는 권장 방법)  

        -   일반 카메라 흔들림을 설정하는 방법  

        -   시네머신 임펄스 소스 피드백을 설정하는 방법  

        -   일반 카메라 흔들림을 설정하지만 여전히 가상 카메라를 타겟팅하는 방법  

        -   Feel을 URP와 함께 사용하는 방법?  

        -   그럼 MMF Player를 URP 볼륨과 함께 사용하는 방법?  

        -   실행 시간에 스크립트를 통해 피드백의 속성을 변경하는 방법?  

        -   피드백을 역재생하는 방법?  

        -   피드백이 재생 중일 때 되돌리는 방법?  

        -   Playmaker로 MMF Player를 트리거하는 방법?  

        -   카메라 줌 피드백을 설정하는 방법?  

        -   시네머신을 사용하여 카메라 줌 피드백을 설정하는 방법?  

        -   타임라인을 통해 MMF Player를 트리거하는 방법?  

        -   MMFader 및 페이드 피드백을 설정하는 방법?  

        -   간단한 위치 피드백을 설정하는 방법?  

        -   목적지로 스케일 피드백을 설정하는 방법?  

        -   MMHealthBar 컴포넌트를 사용하여 자동으로 체력 바를 그리는 방법?  

        -   플로팅 텍스트를 설정하여 피드백을 통해 재생하는 방법?  

        -   씬에서 객체를 흔드는 방법?  

        -   MMBlink 컴포넌트를 설정하는 방법  

        -   피드백을 사용하여 스프링 컴포넌트를 조종하는 방법?  

        -   랜덤 볼륨으로 무작위 소리를 재생하는 방법?  

        -   깜빡임 피드백을 설정하는 방법?  

        -   셰이더 컨트롤러를 설정하고 피드백으로 조종하는 방법?  

        -   간단한 스프링 컴포넌트를 설정하는 방법?  

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

        -   모든 소리를 음소거하는 버튼을 추가하는 방법?  

        -   3D 소리를 재생하는 방법?  

        -   플래시 피드백을 트리거하는 방법?  

        -   스크립트로 구동되는 일시 중지를 설정하는 방법?  

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

        -   후처리 이동 필터 설정 방법  

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

        -   빌보딩 및 고스트 카메라 설정 방법?  

        -   위치 셰이커 설정 방법  

        -   MM Progress Bar 설정 방법?  

  • 스크립트를 통해 막대 값 제어  
        -   객체에 스쿼시 및 스트레치 동작을 추가하는 방법?  

        -   UI 요소 호버 효과 설정 방법?  

        -   코루틴의 나머지 부분을 실행하기 전에 MMF Player가 완료되기를 기다리는 방법?  

        -   특정 유형의 피드백을 비활성화하는 방법?  

        -   피드백을 사용하여 씬을 추가로 로드하는 방법?  

        -   스쿼시 및 스트레치 피드백을 설정하는 방법?  

 

 

소개

빠르게 Feel을 시작하고 싶으신가요? 이 페이지에는 여러 기본 상황에 따라 따라할 수 있는 간단한 단계가 포함되어 있습니다. 설명 없이 빠른 단계만 제공됩니다. 엔진이 어떻게 작동하는지 더 알고 싶다면 나머지 문서를 확인해보세요. 무엇을 달성하고 싶은지 궁금하거나 이 페이지에 특정 레시피를 보고 싶다면 주저하지 말고 제안해 주세요!

이 중 대부분은 Feel / Unity 버전을 제공하지만, 이는 처음 작성된 컨텍스트를 제공하기 위한 것일 뿐입니다. 하지만 더 높은 버전의 Unity와 Feel에서도 작동할 것으로 보장할 수 있습니다.

 


프로젝트에 Feel을 설치하는 방법?

프로젝트에 Feel을 추가하려면 아래 간단한 단계를 따르세요:
  1. Unity 2022.3.23f1 또는 그 이상의 버전(각 Feel 버전에 필요한 Unity 최소 버전은 릴리스 노트를 참조)을 사용하여 새 프로젝트를 생성하고, "3D" 템플릿을 선택합니다.
  2. 패키지 매니저를 통해 Feel 페이지로 이동하여 다운로드 버튼을 클릭한 다음 가져오기(import) 버튼을 클릭합니다.
  3. "Unity 패키지 가져오기" 팝업이 나타날 때까지 기다리고, 모든 항목이 선택되어 있는지 확인한 후(기본적으로 선택되어 있을 것입니다) "가져오기(import)"를 클릭합니다.
  4. Unity의 패키지 매니저를 열고, 최신 버전의 Post Processing 패키지를 설치합니다.
  5. 패키지 매니저에서 최신 버전의 Cinemachine 패키지를 설치합니다.
  6. 패키지 매니저에서 최신 버전의 TextMesh Pro 패키지를 설치합니다.
  7. 패키지 매니저에서 최신 버전의 Animation 2D 패키지를 설치합니다(이것은 Letters 데모에만 유용합니다).
  8. MMFPlayerDemo 씬(또는 다른 데모)을 열고, 재생 버튼을 누르고, 즐기세요.

 


MMF Player를 사용하여 파티클 시스템을 트리거하는 방법?

  1. Unity 2022.3.23f1(또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)를 가져옵니다.
  2. 새 씬을 생성합니다.
  3. 새 빈 객체를 생성하고 파티클 시스템 컴포넌트를 추가합니다.
  4. 렌더러(Renderer) 패널에서 Material 필드 오른쪽의 점을 클릭하고 FeelSnakeEatParticlesMaterial을 선택하여 파티클 시스템을 조금 더 예쁘게 만듭니다.
  5. Emission 펼침 항목에서 RateOverTime을 0으로 설정하고, Bursts 아래의 작은 “+”를 눌러 버스트를 추가합니다(기본 설정으로 충분합니다).
  6. 인스펙터 상단에서 StartLifetime을 0.5로 설정합니다.
  7. 목록의 펼침 항목에서 SizeOverLifetime을 체크하고, 크기 곡선을 기본 하향 곡선 중 하나로 설정합니다.
  8. 파티클 시스템을 재생하면 빠르게 줄어드는 여러 개의 거품이 보일 것입니다.
  9. 새 빈 객체를 생성하고 이름을 MyTestFeedbacks로 설정한 다음, MMF Player 컴포넌트를 추가합니다.
  10. ParticlesPlay 피드백을 추가하고, 생성한 파티클 시스템을 BoundParticleSystem 슬롯에 드래그합니다.
  11. 에디터에서 재생 버튼을 누르고, MyTestFeedbacks 객체를 선택한 다음, MMF Player의 인스펙터에서 녹색 Play 버튼을 누릅니다.
  12. 이제 MMF Player를 통해 파티클 시스템을 트리거하는 방법을 알게 되었습니다. 다른 방법으로는 파티클 시스템을 프리팹으로 만들어 ParticleInstantiation 피드백을 사용하는 방법도 있습니다.

 


시네머신 카메라 흔들림을 설정하는 방법 (카메라 흔들림을 설정하는 권장 방법)

  1. Unity 2022.3.23f1(또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)를 가져옵니다.
  2. 패키지 매니저에서 Cinemachine을 가져옵니다.
  3. 새 빈 씬을 생성합니다.
  4. 큐브를 추가하고 위치를 0,0,0으로 설정합니다.
옵션 1: 자동 셰이커 설정

  1. 빈 게임 오브젝트를 생성하고 이름을 MyTestFeedbacks로 설정한 후, MMF Player 컴포넌트를 추가하고 위치를 0,0,0으로 설정합니다.
  2. "Add new feedback" 드롭다운을 통해 새 Cinemachine Impulse 피드백을 추가합니다.
  3. Automatic Setup 펼침 항목을 펼치고 Automatic Shaker Setup 버튼을 누릅니다. 필요한 경우 MainCamera를 선택하고 CinemachineBrain이 추가되어 있는지 확인합니다. 없다면 하나 추가합니다.
  4. 에디터에서 재생 버튼을 누르고 MyTestFeedbacks 객체를 선택한 다음, MMF Player의 인스펙터에서 녹색 Play 버튼을 누릅니다.
  5. 카메라 흔들림을 확인합니다!
옵션 2: 수동 설정

  1. 상단 메뉴의 Cinemachine 메뉴를 통해 새로운 가상 카메라를 생성합니다.
  2. 가상 카메라를 선택하고 AddExtensions 드롭다운을 통해 Impulse Listener를 추가합니다.
  3. 빈 게임 오브젝트를 생성하고 이름을 MyTestFeedbacks로 설정한 후, MMF Player 컴포넌트를 추가하고 위치를 0,0,0으로 설정합니다.
  4. "Add new feedback" 드롭다운을 통해 새 Cinemachine Impulse 피드백을 추가합니다.
  5. 인스펙터에서 RawSignal 필드 끝에 있는 작은 톱니바퀴를 클릭하고 Presets > 6D Shake를 선택합니다. (톱니바퀴 아이콘이 작동하지 않으면 - 알려진 Cinemachine 버그입니다 - Packages/Cinemachine/Presets/Noise/에서 동일한 프리셋을 찾아 임펄스 피드백 인스펙터에 드래그할 수 있습니다.)
  6. 인스펙터 하단에서 Velocity를 5,5,5로 설정합니다.
  7. 에디터에서 재생 버튼을 누르고 MyTestFeedbacks 객체를 선택한 다음, MMF Player의 인스펙터에서 녹색 Play 버튼을 누릅니다.
  8. 카메라 흔들림을 확인합니다!

 


일반 카메라 흔들림을 설정하는 방법(시네머신 없이)

  1. Unity 2022.3.23f1(또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)을 가져옵니다.
  2. 새 빈 씬을 생성합니다.
  3. 큐브를 추가하고 위치를 0,0,0으로 설정합니다.

옵션 1: 자동 셰이커 설정

  1. 빈 게임 오브젝트를 생성하고 이름을 MyTestFeedbacks로 설정한 후, MMF Player 컴포넌트를 추가합니다.
  2. "Add new feedback" > "Camera" > "Camera Shake" 피드백을 추가합니다.
  3. Automatic Setup 펼침 항목을 펼치고 Automatic Shaker Setup 버튼을 누릅니다.
  4. 에디터에서 재생 버튼을 누르고, MyTestFeedbacks 인스펙터에서 Play 버튼을 누르면 카메라가 흔들립니다.

옵션 2: 수동 설정

  1. 카메라 위치에 빈 게임 오브젝트를 생성하고 이름을 CameraRig로 설정합니다.
  2. 카메라 위치에 빈 게임 오브젝트를 하나 더 생성하고 이름을 CameraShaker로 설정한 후, 이를 CameraRig 아래에 둡니다.
  3. 카메라를 CameraShaker 아래에 둡니다 (CameraRig > CameraShaker > MainCamera 구조가 되어야 합니다).
  4. CameraShaker 노드에 MMCameraShaker 컴포넌트를 추가합니다.
  5. MMCameraShaker의 MMWiggle 설정에서 Position을 체크하고, wiggle 타입으로 Noise를 선택하고, wiggle permitted를 체크 해제합니다.
  6. 빈 게임 오브젝트를 생성하고 이름을 MyTestFeedbacks로 설정한 후, MMF Player 컴포넌트를 추가합니다.
  7. "Add new feedback" > "Camera" > "Camera Shake" 피드백을 추가합니다.
  8. 에디터에서 재생 버튼을 누르고, MyTestFeedbacks 인스펙터에서 Play 버튼을 누르면 카메라가 흔들립니다.

 


시네머신 임펄스 소스 피드백을 설정하는 방법

  1. Unity 2022.3.23f1(또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)을 가져옵니다.
  2. 패키지 매니저에서 Cinemachine을 가져옵니다.
  3. 새 빈 씬을 생성합니다.
  4. 큐브를 추가하고 위치를 0,0,0으로 설정합니다.
  5. 상단 메뉴의 Cinemachine 메뉴를 통해 새로운 가상 카메라를 생성합니다.
  6. 가상 카메라를 선택하고 AddExtensions 드롭다운을 통해 Impulse Listener를 추가합니다.
  7. 빈 게임 오브젝트를 생성하고 이름을 MyTestFeedbacks로 설정한 후, MMF Player 컴포넌트를 추가하고 위치를 0,0,0으로 설정합니다.
  8. MyTestFeedbacks 오브젝트에 CinemachineImpulseSource 피드백을 추가합니다.
  9. AddComponent 버튼을 통해 Cinemachine Impulse Source를 추가하고, 해당 컴포넌트를 피드백의 ImpulseSource 필드에 드래그합니다.
  10. 에디터에서 재생 버튼을 누르고, MyTestFeedbacks 인스펙터에서 Play 버튼을 누르면 카메라가 흔들립니다.

 


일반 카메라 흔들림을 설정하지만 여전히 가상 카메라를 타겟팅하는 방법

  1. Unity 2022.3.23f1(또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)을 가져옵니다.
  2. 패키지 매니저에서 Cinemachine을 가져옵니다.
  3. 새 빈 씬을 생성하고 큐브를 추가한 후 위치를 0,0,0으로 설정합니다.
  4. 새로운 Cinemachine 가상 카메라를 생성하고 큐브를 볼 수 있는 위치로 설정합니다.
  5. 가상 카메라에서 Noise를 BasicMultiChannelPerlin으로 설정하고, NoiseProfile을 6D Shake로 설정합니다. AmplitudeGain을 0으로, FrequencyGain을 0으로 설정합니다.
  6. 가상 카메라에 MMCinemachineCameraShaker를 추가합니다.
  7. 새 빈 게임 오브젝트를 생성하고 MMF Player를 추가합니다. "Camera > Camera Shake" 피드백을 추가한 후 CameraShakeProperties를 펼치고 Duration을 0.3, Amplitude를 2, Frequency를 40으로 설정합니다.
  8. 에디터에서 재생 버튼을 누르고, MMF Player에서 Play 버튼을 누릅니다.

 

 

 


Feel을 URP와 함께 사용하는 방법?

  1. Unity에서 URP 템플릿을 사용하여 새 프로젝트를 생성합니다.
  2. 패키지 매니저를 통해 최신 버전의 Feel을 가져옵니다.
  3. 이제 URP 프로젝트에서 Feel을 사용할 수 있습니다.

 

 

 


그럼 MMF Player를 URP 볼륨과 함께 사용하는 방법?

  1. 위의 단계에 따라 프로젝트를 설정한 후:
  2. 새 씬을 생성합니다.
  3. 큐브를 추가하고 위치를 0,0,0으로 설정합니다.

옵션 1: 자동 셰이커 설정

  1. 빈 게임 오브젝트를 생성하고 이름을 MyTestFeedbacks로 설정한 후 MMF Player 컴포넌트를 추가합니다. "add new feedback" 드롭다운을 클릭하고 PostProcess > Vignette URP를 선택합니다.
  2. Automatic Setup 펼침 항목을 펼치고 Automatic Shaker Setup 버튼을 누릅니다.
  3. 에디터에서 재생 버튼을 누르고, MMF Player의 녹색 Play 버튼을 누르면 비네트의 강도가 보간됩니다.

옵션 2: 수동 설정

  1. 새로운 Global Volume을 생성합니다 (Hierarchy 패널에서 오른쪽 클릭, volume > global volume).
  2. 인스펙터에서 Profile 옆에 있는 New 버튼을 누릅니다.
  3. Vignette를 오버라이드로 추가하고, Vignette의 강도를 0.5로 설정합니다.
  4. 글로벌 볼륨에 새로운 컴포넌트를 추가하고, MMVignetteShaker_URP를 입력하여 추가합니다.
  5. MainCamera를 선택하고, 인스펙터의 Rendering 섹션에서 PostProcessing을 체크합니다.
  6. 이제 게임 뷰에서 비네트를 볼 수 있어야 합니다.
  7. 빈 게임 오브젝트를 생성하고 이름을 MyTestFeedbacks로 설정한 후 MMF Player 컴포넌트를 추가합니다.
  8. "add new feedback" 드롭다운을 클릭하고 PostProcess > Vignette URP를 선택합니다.
  9. 인스펙터에서 Remap Intensity Zero를 0.5로 설정합니다.
  10. 에디터에서 재생 버튼을 누르고, MyTestFeedbacks 객체를 선택한 다음 MMF Player의 녹색 Play 버튼을 누릅니다.
  11. 이제 볼륨 피드백을 트리거하는 방법을 알게 되었습니다. 다른 후처리 필터를 타겟팅하려면 해당 볼륨에 해당 Shaker를 추가하면 됩니다.

 


실행 시간에 스크립트를 통해 피드백의 속성을 변경하는 방법?

런타임에 피드백의 속성을 변경해야 하는 경우가 많습니다. 물론 가능합니다. 이 예제에서는 Duck 데모에서 Chromatic Aberration 피드백의 강도를 변경하는 방법을 알아보겠습니다. 다른 피드백의 다른 속성에 대해서도 동일한 논리가 적용됩니다.
  1. Unity 2022.3.23f1(또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)을 가져옵니다.
  2. FeelDuck 데모 씬을 엽니다.
  3. 새 빈 게임 오브젝트를 생성하고 이름을 RuntimeTest로 설정합니다.
  4. Feel 폴더 외부에 새 C# 스크립트를 생성하고 이름을 RuntimeTest로 설정한 다음, 다음 코드를 붙여넣습니다:
using MoreMountains.Feedbacks;
using MoreMountains.FeedbacksForThirdParty;
using MoreMountains.Tools;
using UnityEngine;

public class RuntimeTest : MonoBehaviour
{
    public MMF_Player TargetFeedback;
    [Range(-100f, 100f)]
    public float Intensity = 0f;
    [MMInspectorButton("TestFeedback")]
    public bool PlayFeedbackBtn;

    private MMF_LensDistortion _lensDistortion;

    private void Start()
    {
        // 시작할 때 렌즈 왜곡 피드백 컴포넌트를 저장하여 나중에 이를 타겟으로 할 수 있도록 합니다.
        _lensDistortion = TargetFeedback.GetFeedbackOfType<MMF_LensDistortion>();
    }

    public void TestFeedback()
    {
        // 피드백을 재생하기 전에 RemapIntensityOne 값을 수정합니다.
        // 이것은 Unity의 다른 컴포넌트의 공개 속성을 수정하는 것과 동일하게 수행됩니다.
        if (_lensDistortion != null)
        {
            _lensDistortion.RemapIntensityOne = Intensity;
        }
        // 그런 다음 MMF_Player를 재생합니다.
        TargetFeedback?.PlayFeedbacks();
    }
}
  1. 그럼 이 스크립트를 RuntimeTest 게임 오브젝트에 추가하세요.
  2. Hierarchy 패널에서 FeelDuckLandingFeedback 오브젝트를 선택하고, 그것을 RuntimeTest 오브젝트의 Inspector에서 TargetFeedback 슬롯에 드래그하세요.
  3. 에디터에서 재생을 누르고, RuntimeTest 오브젝트를 선택한 후 인스펙터에서 강도 값을 변경하고 TestFeedback 버튼을 누르세요. 매번 재생할 때, 인스펙터에서 변경한 값이 재생되기 전에 피드백으로 전송됩니다.
런타임에서 값이 변경될 때 중요한 점은 성능 이유로 일부 값이 캐시될 수 있다는 것입니다. 따라서 언제나 값이 캐시되지 않았는지, 올바른 속성을 타겟으로 하고 있는지, 필요할 경우 캐시를 재설정하는지 반드시 확인하세요.

 

 

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

  1. MMF_Player를 선택하고, 그 Settings 폴더를 열어 Direction을 BottomToTop으로 설정하세요.
  2. 또는 코드를 통해 강제로 설정할 수도 있습니다:
MyPlayer.Direction = MMFeedbacks.Directions.BottomToTop;
MyPlayer.PlayFeedbacks();
   3. 전용 섹션에서 방향 옵션에 대해 더 자세히 알아볼 수 있습니다.

 


피드백이 재생 중일 때 되돌리는 방법?

  1. Unity 2022.3.23f1 (또는 그 이상 버전)에서 새 프로젝트를 생성하고 Package Manager를 통해 Feel v4.1.2 (또는 그 이상 버전)을 가져옵니다.
  2. 새 빈 씬을 만들고, 거기에 큐브를 추가하여 위치를 0,0,0으로 설정합니다.
  3. 그리고 빈 오브젝트를 하나 더 추가하고, 그 안에 MMF Player를 추가합니다. 이 MMF Player에 Position 피드백을 추가하고, 타겟을 앞서 추가한 큐브로 설정하고, 지속 시간을 5초로 하고, 목적지 위치를 0,5,0으로 설정합니다.
  4. 에디터에서 재생 버튼을 누른 후, MMF Player의 녹색 재생 버튼을 클릭하여 피드백을 시작하고, 2초 후에는 MMF Player의 Revert 버튼을 클릭하여 피드백을 되돌릴 수 있습니다.
  5. 또한 코드를 통해서도 MMF Player의 Revert() 메서드를 호출하여 간단히 되돌릴 수 있습니다.

 


Playmaker로 MMF Player를 트리거하는 방법?

  1. Unity 2022.3.23f1 (또는 그 이상 버전)에서 새 프로젝트를 생성하고 Package Manager를 통해 Feel v4.1.2 (또는 그 이상 버전)을 가져옵니다.
  2. 그리고 Playmaker를 설치합니다.
  3. 새로운 씬을 만들고, 빈 GameObject를 생성하여 MyFeedbacks라고 이름을 지정하고, 그 안에 MMF Player 컴포넌트를 추가합니다.
  4. MMF Player에 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 상태에서 오른쪽 클릭하고, transition > Finished를 선택한 후, Finished에 다시 오른쪽 클릭하여 그의 전환 대상을 GettingInput으로 설정합니다.
  11. PlayingFeedbacks 상태에서 Action Browser를 사용하여 CallMethod 액션을 추가합니다. MyFeedbacks의 MMF Player MonoBehaviour를 Behaviour 슬롯에 끌어다 놓고, Method 드롭다운에서 "void PlayFeedbacks()"를 선택합니다.
  12. Unity 에디터에서 재생 버튼을 누르면, 이제 매번 F2를 누를 때마다 피드백이 재생되고 콘솔에 "Hello!"가 표시됩니다. MyFeedbacks MMF Player에 추가한 다른 피드백들도 물론 재생됩니다.

 


카메라 줌 피드백을 설정하는 방법?

  1. Unity 2022.3.23f1 (또는 그 이상)에서 새로운 프로젝트를 생성하고 Package Manager를 통해 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. 새 빈 장면을 만듭니다.
  3. 큐브를 추가하고, 위치를 (0,0,0)으로 설정합니다.
  4. MainCamera를 선택하고, MMCameraZoom 컴포넌트를 추가합니다.
  5. 빈 게임 오브젝트를 생성하고, 이름을 'MyTestFeedbacks'로 설정한 뒤, MMF Player 컴포넌트를 추가합니다.
  6. 'Add new feedback' 드롭다운을 통해 Camera > Camera Zoom 피드백을 추가합니다.
  7. 에디터에서 플레이 버튼을 누른 후, 'MyTestFeedbacks' 오브젝트를 선택하고, MMF Player 인스펙터에서 녹색 Play 버튼을 누릅니다.

 


시네머신을 사용하여 카메라 줌 피드백을 설정하는 방법?

  1. Unity 2022.3.23f1 (또는 그 이상)에서 새로운 프로젝트를 생성하고 Package Manager를 통해 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. Package Manager에서 Cinemachine을 가져옵니다.
  3. 새 빈 장면을 만듭니다.
  4. 큐브를 추가하고, 위치를 (0,0,0)으로 설정합니다.
  5. GameObject 메뉴를 통해 Cinemachine > Virtual Camera를 추가합니다.
  6. 새로 생성된 Virtual Camera를 선택하고, 위치를 (0,0,-10)으로 설정한 뒤, MMCinemachineZoom 컴포넌트를 추가합니다.
  7. 빈 게임 오브젝트를 생성하고, 이름을 'MyTestFeedbacks'로 설정한 뒤, MMF Player 컴포넌트를 추가합니다.
  8. 'Add new feedback' 드롭다운을 통해 Camera > Camera Zoom 피드백을 추가합니다.
  9. 에디터에서 플레이 버튼을 누른 후, 'MyTestFeedbacks' 오브젝트를 선택하고, MMF Player 인스펙터에서 녹색 Play 버튼을 누릅니다.

 

 

 


타임라인을 통해 MMF Player를 트리거하는 방법?

  1. Unity 2022.3.23f1 (또는 그 이상)에서 새로운 프로젝트를 생성하고 Package Manager를 통해 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. 예제에서는 FeelDuck 데모 장면을 엽니다.
  3. 새 빈 오브젝트를 생성하고, 이름을 'Director'로 설정합니다.
  4. 타임라인 패널을 엽니다 (Window > Sequencing > Timeline).
  5. 타임라인 패널에서 '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 오브젝트를 선택하고, 인스펙터에서 FeelDuckJumpStartFeedback을 SignalReceiver의 이벤트 반응 슬롯에 드래그한 후, MMF Player > PlayFeedbacks() 메서드를 반응으로 선택합니다.
  13. 에디터에서 플레이 버튼을 누른 후, 타임라인에서도 플레이 버튼을 누르면 피드백이 재생될 때마다 타임라인의 재생 헤드가 마커를 통과할 때마다 피드백이 재생됩니다.
  14. 타임라인과 신호에 대해 더 자세히 알고 싶다면 Unity 블로그를 확인하세요.

 


MMFader 및 페이드 피드백을 설정하는 방법?

  1. Unity 2022.3.23f1 (또는 그 이상)에서 새로운 프로젝트를 생성하고 Package Manager를 통해 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. 새 빈 장면을 만듭니다.
옵션 1: 자동 셰이커 설정
  1. 장면에서 새로운 빈 오브젝트를 생성하고, MMF Player를 추가합니다, Camera > Fade 피드백을 추가합니다.
  2. Automatic Setup 폴드아웃을 펼치고, Automatic Shaker Setup 버튼을 누릅니다.
  3. 에디터에서 재생 버튼을 누른 후, MMF Player에서 녹색 Play 버튼을 누릅니다.
옵션 2: 수동 설정
  1. 장면에 UI Image를 추가하고, RectTransform을 설정하여 화면 전체를 덮도록 합니다 (보통 전체 스트레치 및 왼쪽/오른쪽/위/아래 모두 0으로 설정), Image 색상을 검정색으로 설정합니다.
  2. MMFader 컴포넌트를 추가합니다. 이 작업은 CanvasGroup을 추가하며, Alpha를 0으로 설정합니다.
  3. 장면에서 새로운 빈 오브젝트를 생성하고, MMF Player를 추가합니다, Camera > Fade 피드백을 추가합니다.
  4. 재생 버튼을 누르고, Feedback을 재생하면 페이더가 페이드 인됩니다 (화면이 검정색으로 페이드). FadeType을 Fade Out으로 변경하면 화면이 다시 정상으로 돌아옵니다, Fade 피드백의 인스펙터에서 설정(지속 시간, 곡선 등)을 원하는 대로 조정할 수 있습니다. 여러 개의 페이더가 있는 경우, 페이더와 피드백의 Channel ID가 일치하는지 확인합니다.
 


간단한 위치 피드백을 설정하는 방법?

  1. Unity 2022.3.23f1 (또는 그 이상)에서 새로운 프로젝트를 생성하고 Package Manager를 통해 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. 새로운 빈 장면을 만듭니다, 큐브를 추가하고 위치를 (0,0,0)으로 설정합니다.
  3. 새로운 빈 게임 오브젝트를 생성하고, MMF Player 컴포넌트를 추가합니다.
  4. Transform > Position 피드백을 추가합니다.
  5. 큐브를 AnimatePositionTarget 슬롯에 드래그합니다.
  6. Transition Mode를 Along Curve로 설정합니다.
  7. AnimatePositionDuration을 1로 설정합니다, AnimateX를 true로 설정합니다.
  8. 플레이 버튼을 누르고 피드백을 재생합니다.

 

 

 


목적지로 스케일 피드백을 설정하는 방법?

  1. Unity 2022.3.23f1 (또는 그 이상)에서 새로운 프로젝트를 생성하고 Package Manager를 통해 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. 새로운 빈 장면을 만듭니다, 큐브를 추가합니다.
  3. 새로운 빈 오브젝트를 추가하고, MMF Player 컴포넌트를 추가합니다.
  4. Transform > Scale 피드백을 추가하고, AnimateScaleTarget에 큐브를 설정합니다.
  5. 다음과 같이 피드백 설정을 구성합니다:
    • Mode: ToDestination
    • RemapCurveZero: 0
    • RemapCurveOne: 1
    • AnimateXYZ 모든 체크박스 체크
    • 모든 곡선을 (0,0)에서 (1,1)로 오르는 곡선으로 설정
  6. 에디터에서 플레이 버튼을 누르고, DestinationScale을 (0.5, 0.5, 0.5)로 설정한 후, 해당 피드백의 Play 버튼을 누릅니다. 큐브가 줄어듭니다.
  7. DestinationScale을 (0, 0, 0)로 설정하고, 해당 피드백의 Play 버튼을 누릅니다. 큐브가 더 작아집니다.
  8. DestinationScale을 (1, 1, 1)로 설정하고, 해당 피드백의 Play 버튼을 누릅니다. 큐브가 원래 크기로 돌아갑니다.

 

 

MMHealthBar 컴포넌트를 사용하여 자동으로 체력 바를 그리는 방법?

  1. Unity 2022.3.23f1 (또는 그 이상)에서 새로운 프로젝트를 생성하고 Package Manager를 통해 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. 새로운 빈 장면을 만듭니다.
  3. 큐브를 생성하고 위치를 (0,0,0)으로 설정합니다.
  4. 큐브에 MMHealthBar 컴포넌트를 추가합니다.
  5. 재생 버튼을 누르면, 큐브 위에 체력 바가 그려지는 것을 확인할 수 있습니다.
  6. 이제 MMHealthBar와 상호작용하여 업데이트하려면 데이터를 전달해야 합니다. 이를 위해 스크립트를 사용하겠습니다.
  7. 새로운 C# 클래스를 생성하고, 이름을 TestMMHealthBar로 설정한 후 다음 내용을 붙여넣습니다

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MoreMountains.Tools;

/// <summary>
/// MMHealthBar 컴포넌트와 상호작용하고 테스트하기 위해 사용되는 간단한 클래스입니다.
/// 사용하려면 MMHealthBar가 있는 오브젝트에 이 클래스를 추가하고, 런타임 시 CurrentHealth 슬라이더를 이동한 후 Test 버튼을 눌러 바를 업데이트합니다.
/// </summary>
public class TestMMHealthBar : MonoBehaviour
{
    [Range(0f, 100f)]
    public float CurrentHealth = 50f;

    protected float _minimumHealth = 0f;
    protected float _maximumHealth = 100f;
    protected MMHealthBar _targetHealthBar;

    [MMInspectorButton("Test")] public bool TestButton;

    protected virtual void Awake()
    {
        _targetHealthBar = this.gameObject.GetComponent<MMHealthBar>();
    }

    public virtual void Test()
    {
        if (_targetHealthBar != null)
        {
            _targetHealthBar.UpdateBar(CurrentHealth, _minimumHealth, _maximumHealth, true);    
        }
    }
}
  1. 이 컴포넌트를 큐브에 추가하고, 재생 버튼을 누른 후, 런타임 시 인스펙터에서 CurrentHealth 슬라이더를 이동합니다. Test 버튼을 누를 때마다 체력 바가 업데이트됩니다.

 


플로팅 텍스트를 설정하여 피드백을 통해 재생하는 방법?

  1. Unity 2022.3.23f1 (또는 그 이상)에서 새로운 프로젝트를 생성하고 Package Manager를 통해 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. 빈 장면(또는 자신의 장면)에서 새로운 빈 게임 오브젝트를 생성하고, 이름을 "FloatingTextSpawner"로 설정한 뒤, MMFloatingTextSpawner 컴포넌트를 추가합니다.
  3. 프로젝트 패널에서 MMFloatingText 프리팹을 검색한 후, 새로 생성한 스포너의 Pooler 설정 내 PooledSimpleMMFloatingText 슬롯에 드래그합니다.
  4. 새로운 빈 오브젝트를 생성하고, 이름을 "TestPlayer"로 설정한 뒤, 위치를 (0,0,0)으로 설정하고, MMF Player 컴포넌트를 추가합니다.
  5. 새로운 UI > Floating Text 피드백을 추가합니다.
  6. 에디터에서 플레이 버튼을 누른 후, MMF Player의 녹색 Play 버튼을 누르면 "100" 텍스트가 매번 생성됩니다.
추가 기능: 강도 제어 추가
  • 강도 제어를 추가하려면, 다음 클래스처럼 "use intensity as value"를 체크하여 MMF Player의 강도를 피드백에 적용할 수 있습니다. 이를 테스트하려면, 프로젝트에서 다음 코드를 포함한 새 클래스를 생성한 후, 위의 단계를 완료한 후 TestIntensityAsValue 컴포넌트를 MMF Player에 추가합니다. 에디터에서 플레이 버튼을 누른 후, TriggerFeedback 버튼을 누르면 매번 랜덤 값이 표시됩니다. 물론, 실제로는 랜덤 값 대신 데미지 값을 전달하는 것이 더 적합할 것입니다! 값이 반올림되지 않은 것을 알 수 있는데, 이를 변경하고 싶다면 Floating Text 피드백에서 반올림 방법을 선택할 수 있습니다.
using MoreMountains.Feedbacks;
using UnityEngine;

public class TestIntensityAsValue : MonoBehaviour
{
	[MMFInspectorButton("TriggerFeedback")]
	public bool TriggerFeedbackButton;
	private MMF_Player _myPlayer;

	private void Start()
	{
		// 시작할 때 MMF Player 컴포넌트를 가져옵니다
		_myPlayer = this.gameObject.GetComponent<MMF_Player>();
	}

	private void TriggerFeedback()
	{
		float randomIntensity = Random.Range(0f, 100f);
		_myPlayer.PlayFeedbacks(this.transform.position, randomIntensity);
	}
}
더 나아가 : 런타임에서 값 변경
  • MMF_FloatingText의 Value 속성을 동적으로 원하는 값으로 변경할 수 있으며, 다른 모든 속성도 변경할 수 있습니다. 아래 예제에서는 값을 랜덤 float로 설정하고, 색상을 멋진 그라데이션으로 설정합니다.
using MoreMountains.Feedbacks;
using UnityEngine;

public class TestModifyAtRuntime : MonoBehaviour
{
	[MMFInspectorButton("TriggerFeedback")]
	public bool TriggerFeedbackButton;

	private MMF_Player _myPlayer;
	private Gradient gradient;
	private GradientColorKey[] colorKey;
	private GradientAlphaKey[] alphaKey;

	private void Start()
	{
		// 시작할 때 MMF Player 컴포넌트를 가져옵니다
		_myPlayer = this.gameObject.GetComponent<MMF_Player>();
	}

	private void TriggerFeedback()
	{
		float randomValue = Mathf.Round(Random.Range(0f, 100f));
		MMF_FloatingText floatingText = _myPlayer.GetFeedbackOfType<MMF_FloatingText>(); // 참고: 이는 플레이어에 하나의 floating text 피드백만 있는 경우를 가정합니다. 더 고급 방법은 문서를 참조하세요.

		// 랜덤 값을 디스플레이 값으로 적용합니다
		floatingText.Value = randomValue.ToString();

		// 멋진 색상을 설정합니다
		gradient = new Gradient();
		// 상대 시간 0과 1 (0%와 100%)에서 색상 키를 채웁니다
		colorKey = new GradientColorKey[2];
		colorKey[0].color = Color.red;
		colorKey[0].time = 0.0f;
		colorKey[1].color = Color.blue;
		colorKey[1].time = 1.0f;
		// 상대 시간 0과 1 (0%와 100%)에서 알파 키를 채웁니다
		alphaKey = new GradientAlphaKey[2];
		alphaKey[0].alpha = 1.0f;
		alphaKey[0].time = 0.0f;
		alphaKey[1].alpha = 0.0f;
		alphaKey[1].time = 1.0f;
		gradient.SetKeys(colorKey, alphaKey);

		floatingText.ForceColor = true;
		floatingText.AnimateColorGradient = gradient;

		_myPlayer.PlayFeedbacks(this.transform.position);
	}
}

 

 

씬에서 객체를 흔드는 방법?

  1. Unity 2022.3.23f1 (또는 그 이상)에서 새로운 프로젝트를 생성하고 Package Manager를 통해 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. 새로운 장면에서 큐브를 생성합니다.
  3. 큐브에 MMWiggle 컴포넌트를 추가합니다.
  4. Position 체크박스를 선택하고, Wiggle Type을 Noise로 설정합니다.
  5. 플레이 버튼을 누르면 이제 큐브가 흔들리는 것을 볼 수 있습니다, 주파수(Frequency), 진폭(Amplitude)을 증가시키거나, 시프트(Shift)를 추가하는 등 다른 옵션을 조정할 수 있습니다. (여러 개의 객체가 있는 경우 유용합니다)

 

 

 

 

MMBlink 컴포넌트를 설정하는 방법

MMBlink 컴포넌트를 사용하면 객체에 깜박임 시퀀스를 정의할 수 있으며, 이를 MMBlink 피드백으로 트리거할 수 있습니다. 다음은 설정 방법입니다:
  1. Unity 2022.3.23f1 (또는 그 이상)에서 새로운 프로젝트를 생성합니다, Package Manager를 통해 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. 새 장면에서 스프라이트 렌더러를 생성하고, 스프라이트를 "button-A" (또는 원하는 스프라이트)로 설정합니다.
  3. MMBlink 컴포넌트를 추가하고, Method를 Material Alpha로 설정한 뒤, 스프라이트 렌더러를 MMBlink의 TargetRenderer 슬롯에 드래그합니다.
  4. 깜박임 시퀀스를 정의합니다, Phases 배열의 크기를 2로 설정합니다.
  5. 배열의 Element 0에서 PhaseDuration을 1로, OffDuration을 0.3으로, OnDuration을 0.7로 설정합니다.
  6. 배열의 Element 1에서 PhaseDuration을 0.5로, OffDuration을 0.2로, OnDuration을 0.3으로 설정합니다.
  7. Repeat Count를 -1로 설정하여 무한 반복하게 합니다.
  8. 플레이 버튼을 누르면 스프라이트가 반복적인 패턴으로 깜박이는 것을 확인할 수 있습니다.
MMF Player로 트리거 설정:
  1. MMBlink에서 Blinking을 체크 해제하고 RepeatCount를 5로 설정합니다.
  2. 새 빈 게임 오브젝트를 생성하고 이름을 MyTestFeedbacks로 설정한 뒤, MMF Player를 추가합니다.
  3. MMBlink 피드백을 추가하고 (Renderer > MMBlink), MMBlink 오브젝트를 TargetBlink 슬롯에 드래그합니다.
  4. 에디터에서 플레이 버튼을 누른 후, MyTestFeedbacks의 인스펙터에서 테스트 버튼을 눌러 스프라이트가 5번의 시퀀스 동안 깜박이는 것을 확인합니다.
MMBlink 컴포넌트는 여러 옵션을 제공합니다. 객체를 활성화/비활성화하여 깜박이거나, 알파, 방출 또는 머티리얼 셰이더의 모든 플롯 값을 사용하여 깜박일 수 있습니다. 또한 이러한 값들을 보간할 수 있습니다. Element0과 Element1의 On/Off Lerp Durations을 0.5로 설정하여 이를 테스트해보세요.

 

 

피드백을 사용하여 스프링 컴포넌트를 조종하는 방법?

  1. Unity 2022.3.23f1 (또는 그 이상)에서 새로운 프로젝트를 생성하고 Package Manager를 통해 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. 새 장면에서 (0,0,0)에 큐브를 추가합니다.
  3. MainCamera를 선택하고 MMSpringCameraFieldOfView 컴포넌트를 추가합니다.
  4. 새로운 빈 오브젝트를 생성하고 MMF Player를 추가합니다, Springs > SpringFloat 피드백을 추가하고 (field of view는 float 값입니다), MainCamera를 TargetSpring 슬롯에 드래그합니다, BumpAmount를 1000으로 설정합니다.
  5. 에디터에서 플레이 버튼을 누른 후, MMF Player의 녹색 Play 버튼을 누릅니다.

 

 

 

 

랜덤 볼륨으로 무작위 소리를 재생하는 방법?

  1. Unity 2022.3.23f1 (또는 그 이상)에서 새로운 프로젝트를 생성하고 Package Manager를 통해 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. 새 장면을 만들고 엽니다.
  3. 빈 오브젝트를 생성하고 MMSoundManager를 추가합니다.
  4. 또 다른 빈 오브젝트를 생성하고 MMF Player를 추가합니다.
  5. MMSoundManager Sound 피드백을 추가합니다.
  6. 랜덤 sfx 배열 크기를 2로 설정하고, 첫 번째 요소를 FeelBlobNote1로, 두 번째 요소를 FeelBlobNote2로 설정합니다.
  7. 최소 볼륨을 0.2로, 최대 볼륨을 0.5로 설정합니다.
  8. 에디터에서 플레이 버튼을 누른 후, MMF Player 하단의 녹색 Play 버튼을 누릅니다. 매번 새로운 볼륨으로 재생됩니다.

 

 

 

 

깜빡임 피드백을 설정하는 방법?

  1. Unity 2022.3.23f1 (또는 그 이상)에서 새로운 프로젝트를 생성하고 Package Manager를 통해 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. 새 빈 장면을 만들고, 큐브를 추가합니다.
  3. 새 빈 오브젝트를 생성하고, 이름을 Player로 설정한 후 MMF Player를 추가합니다.
  4. Flicker 피드백을 추가하고, 큐브를 BoundRenderer 슬롯에 드래그합니다.
  5. 에디터에서 플레이 버튼을 누른 후, MMF Player 인스펙터에서 녹색 Play 버튼을 누르면 큐브가 깜박이고 0.2초 후 원래 색상으로 돌아옵니다.

 

 

 

셰이더 컨트롤러를 설정하고 피드백으로 조종하는 방법?

이 단계는 BiRP의 PostProcessing 스택을 사용합니다. URP 또는 HDRP를 사용하는 경우, Volumes를 사용하도록 단계를 조정하세요.
발광 효과가 보이도록 씬 설정
  1. Unity 2022.3.23f1 (또는 그 이상)에서 새로운 프로젝트를 생성하고 Package Manager를 통해 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. 새로운 빈 장면을 만들고, 큐브를 추가한 뒤 위치를 (0,0,0)으로 설정합니다.
  3. 새로운 빈 오브젝트를 생성하고 이름을 Volume으로 설정합니다, PostProcessVolume을 추가하고, IsGlobal을 true로 설정합니다, 새로운 프로파일을 추가하고 Bloom 효과 오버라이드를 추가합니다. Intensity를 1로 설정합니다.
  4. 씬의 메인 카메라에 PostProcessLayer를 추가하고 Layer를 Everything으로 설정합니다.
  5. 큐브의 MeshRenderer를 FeedbacksDemoBurger로 설정합니다. 이 머티리얼의 셰이더는 _EmissionForce float 속성을 노출하며, 이는 발광의 강도를 제어합니다.
셰이더 컨트롤러 추가
  1. 큐브에 ShaderController 컴포넌트를 추가합니다, MeshRenderer를 TargetRenderer 슬롯에 드래그하고, TargetPropertyName을 _EmissionForce로 설정합니다.
  2. 에디터에서 플레이 버튼을 눌러 큐브의 발광이 기본적으로 PingPong 모드에서 펄스하는 것을 확인합니다.
피드백을 통해 셰이더 컨트롤러 제어
  1. 플레이 모드를 종료하고, ShaderController의 ControlMode를 OneTime으로 설정합니다.
  2. 새로운 빈 오브젝트를 생성하고 MMF Player를 추가합니다, Renderer > ShaderController 피드백을 추가하고, 큐브를 TargetShaderController 슬롯에 드래그합니다. OneTimeRemapMax를 10으로 설정합니다.
  3. 에디터에서 플레이 버튼을 누른 후, MMF Player의 녹색 Play 버튼을 눌러 큐브가 1초 동안 발광하고 다시 원래의 발광 상태로 돌아오는 것을 확인합니다.

 

 

간단한 스프링 컴포넌트를 설정하는 방법?

  1. Unity 2022.3.23f1 (또는 그 이상)에서 새로운 프로젝트를 생성하고 Package Manager를 통해 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. 새 장면에서 (0,0,0)에 큐브와 UI>버튼을 추가합니다.
  3. 큐브의 인스펙터에서 AddComponent 버튼을 눌러 MMSpringSquashAndStretch 컴포넌트를 추가합니다.
  4. 버튼의 인스펙터에서 OnClick 이벤트에 아이템을 추가하고, 큐브를 드래그하여 MMSpringSquashAndStretch>BumpRandom을 선택합니다.
  5. 에디터에서 플레이 버튼을 누른 후, 버튼을 누릅니다(반복해서!).
  6. 런타임 상태에서 큐브를 선택한 후, 인스펙터에서 Damping, Frequency, BumpAmountRandomValue 설정을 조정하여 버튼을 누를 때 객체에 어떤 영향을 미치는지 확인합니다.

 

 

 

 

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

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

 

 

 

모든 소리를 음소거하는 버튼을 추가하는 방법?

  1. Unity 2022.3.23f1(또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)을 가져옵니다.
  2. MMSoundManager가 포함된 장면을 엽니다.
  3. UI 버튼을 생성합니다, 버튼의 OnClick 이벤트에 새로운 항목을 추가하려면 "+" 버튼을 누릅니다, MMSoundManager를 그 슬롯에 드래그하고, MuteMaster 메서드를 선택합니다.
  4. 재생 버튼을 누르면, UI 버튼을 누를 때 MMSoundManager를 통해 재생되는 모든 소리가 음소거됩니다.
  5. 참고로 피드백을 통해서도 같은 작업을 수행할 수 있습니다(MMSoundManager Track Control 또는 MMSoundManager All Sounds Control 사용). 이 설정을 피드백을 통해 저장할 수도 있습니다. 자세한 내용은 Feel 문서를 참조하세요.

 

 

3D 소리를 재생하는 방법?

  1. Unity 2022.3.23f1(또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)을 가져옵니다.
  2. 새로운 빈 장면을 만듭니다.
  3. 새 빈 게임 오브젝트를 생성하고, MMSoundManager 컴포넌트를 추가합니다.
  4. 또 다른 새 빈 게임 오브젝트를 생성하고, MMF Player 컴포넌트를 추가하고, 위치를 (0,0,0)으로 설정합니다.
  5. MMF Player에 MMSoundManager Sound 피드백을 추가합니다.
  6. 피드백의 Sound/SFx를 Beep1로 설정하고, SpatialBlend를 1로 설정합니다.
  7. 에디터에서 재생 버튼을 누른 다음, MMF Player를 재생하면 '삐' 소리를 들을 수 있습니다.
  8. MMF Player를 (1000,0,0)으로 이동시키고 MMF Player를 재생하면 소리가 들리지 않습니다.
  9. MMF Player를 (25,0,0)으로 이동시키고 MMF Player를 재생하면 소리가 줄어든 볼륨으로 들립니다.

 

 

 

 

플래시 피드백을 트리거하는 방법?

  1. Unity 2022.3.23f1(또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)을 가져옵니다.
  2. 새 빈 장면을 만들고 Canvas를 추가합니다.
옵션 1: 자동 셰이커 설정
  1. 새 빈 오브젝트를 생성하고 MMF Player를 추가합니다, Camera > Flash 피드백을 추가합니다.
  2. Automatic Setup 항목을 펼치고 Automatic Shaker Setup 버튼을 누릅니다.
  3. 에디터에서 재생 버튼을 누른 다음, MMF Player의 초록색 Play 버튼을 누르면 화면이 흰색으로 깜박입니다.
옵션 2: 수동 설정
  1. 빈 자식을 추가하고 MyFlash라고 이름을 지정합니다, MMFlash 컴포넌트를 추가하고 화면을 덮도록 확장합니다, 이를 수행하는 한 가지 방법은 앵커를 stretch로 설정하고 RectTransform에서 Left/Top/Right/Bottom을 0으로 설정하는 것입니다. 하지만 최종적으로는 Canvas 및 UI 설정 방식에 따라 달라질 수 있습니다, CanvasGroup 컴포넌트의 Alpha를 0으로 설정합니다.
  2. 새 빈 오브젝트를 생성하고 MMF Player를 추가합니다, Camera > Flash 피드백을 추가합니다.
  3. 에디터에서 재생 버튼을 누른 다음, MMF Player의 초록색 Play 버튼을 눌러 설정을 조정합니다.

 

 

스크립트로 구동되는 일시 중지를 설정하는 방법?

  1. Unity 2022.3.23f1(또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)을 가져옵니다, 빈 장면을 만들고 큐브(Cube)를 추가합니다.
  2. 새 빈 오브젝트를 생성하고 MMF Player를 추가합니다, Position 피드백을 추가하고 타겟을 큐브로 설정합니다, Position 피드백을 복제합니다.
  3. 두 개의 Position 피드백 사이에 Pause 피드백을 추가하고 다음과 같이 설정합니다, ScriptDriven: true,  AutoResumeAfter: 3, PauseDuration: 0
  4. 에디터에서 재생 버튼을 누르고, MMF Player의 초록색 플레이 버튼을 누릅니다. 첫 번째 Position 피드백이 실행된 후 3초 후에 Pause가 해제되고 두 번째 Position 피드백이 실행됩니다.
  5. 초록색 플레이 버튼을 다시 누른 다음 즉시 Resume 버튼을 누릅니다. Pause가 즉시 멈추고 두 번째 Position 피드백이 실행되는 것을 확인할 수 있습니다.

 

 

 

 

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

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

 

 

 

 

후처리 이동 필터 설정 방법

카메라 필터, 이동 필터의 개념에 익숙하실 것입니다. 이는 실제 카메라 앞에 이동할 수 있는 필터로 효과, 확산 등을 추가할 수 있습니다. Feel은 이를 설정하는 도구를 제공합니다. 이는 작업이 조금 필요하지만 완료되면 카메라 위로 포스트 프로세싱 볼륨(또는 그 이상)을 이동할 수 있는 많은 기능을 제공합니다. 이는 포스트 프로세싱 효과 간의 부드러운 전환을 위한 쉬운 방법입니다. 다른 피드백과 마찬가지로 MMF_PlayerDemo 장면에서 그 예를 찾을 수 있으며, 다음 단계를 따를 수도 있습니다(이 예제는 BiRP의 포스트 프로세싱 스택 v2를 사용합니다. 다른 렌더링 파이프라인을 사용하는 경우 해당 레이어/볼륨을 적응시키십시오. 필터는 모든 파이프라인에서 작동합니다).
  1. Unity 2022.3.23f1(또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)을 가져옵니다.
  2. 빈 장면에서 MainCamera에 PostProcessLayer 컴포넌트를 추가하고 VolumeBlending.Layer를 Everything으로 설정합니다.
  3. 카메라에 (0,0,0) 위치에 빈 자식 오브젝트를 추가하고 이를 MovingFilter라고 이름 짓습니다.
  4. BoxCollider를 추가하고 IsTrigger를 true로 설정한 후, PostProcessVolume 컴포넌트를 추가하고 BlendDistance를 0.2로 설정합니다. 프로필로 FeelBarbariansPostProcessingProfile을 선택합니다(이 프로필은 빨간색 비네트가 있으므로 선택 시 차이를 확인할 수 있습니다). 그런 다음 해당 오브젝트를 (0,3,0) 위치로 이동시켜 카메라를 덮지 않도록 합니다.
  5. MovingFilter를 복제하고 이름을 BaseFilter로 설정합니다. MainCamera의 자식으로 유지하고 (0,0,0) 위치로 이동시켜 카메라 위에 있도록 합니다. 프로필로 FeelBlobPostProcessingProfile을 선택합니다(이 프로필은 보라색 비네트가 있습니다).
  6. MovingFilter를 다시 선택하고 MMPostProcessingMovingFilter를 추가합니다. FilterOffset을 (0,3)으로 설정하고, AddToInitialPosition은 false로 설정합니다. PostProcessVolume 컴포넌트에서 Priority를 1로 설정합니다.
  7. 장면에 새 빈 오브젝트를 생성하고 MMF Player를 추가합니다. PPMovingFilter 피드백을 추가합니다.
  8. 에디터에서 재생 버튼을 누른 다음 MMF Player의 초록색 Play 버튼을 누릅니다. 기본 포스트 프로세싱에서 이동 필터로의 전환을 확인할 수 있습니다. Scene 뷰에서 장면을 관찰하면 피드백을 재생할 때 이동 필터가 카메라와 겹치도록 아래로 이동하여 우선순위를 가지는 것을 확인할 수 있습니다.

 

 

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

  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의 인스펙터에서 초록색 Play 버튼을 누릅니다. 그러면 Position 피드백이 가장 가까운 참조 홀더(현재는 하나뿐이므로 선택하기 쉬움)에서 타겟을 자동으로 가져와 Cube를 이동시킵니다.

 

 

 

 

빌보딩 및 고스트 카메라 설정 방법?

빌보딩은 객체가 항상 카메라를 향하도록 합니다. 다음 단계에서는 이를 간단히 설정하고, 이동이 쉬운 고스트 카메라를 설정하여 이를 시도해보겠습니다.
  1. Unity 2022.3.23f1(또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)을 가져옵니다.
  2. 새 빈 장면을 만듭니다.
  3. 스프라이트 렌더러(Sprite Renderer)를 추가하고 위치를 (0,0,0)으로 설정합니다. 스프라이트는 button-A로 설정합니다.
  4. MMBillboard 컴포넌트를 스프라이트 렌더러에 추가합니다.
  5. 장면의 MainCamera에 MMGhostCamera 컴포넌트를 추가합니다.
  6. 에디터에서 재생 버튼을 누릅니다. WASD 키와 스페이스 바, C 키를 사용하여 이동하면 A 원이 카메라를 계속 바라보는 것을 확인할 수 있습니다.

 

 

위치 셰이커 설정 방법

  1. 새 프로젝트를 생성하고 패키지 매니저를 통해 Feel v4.1.2 (또는 그 이상)를 임포트합니다, 빈 씬을 생성합니다.
  2. 큐브를 생성하고 위치를 0,0,0으로 설정합니다, 큐브에 MMPositionShaker 컴포넌트를 추가합니다.
  3. 인스펙터에서 ShakerSettings 아래에서 PlayOnAwake를 true로 설정하고, PermanentShake를 true로 설정합니다.
  4. 플레이 버튼을 누르면 큐브가 실행 중에 흔들립니다. 필요에 따라 인스펙터에서 흔들림 범위와 방향 등을 사용자 정의할 수 있습니다.
  5. 플레이 모드를 종료하고, PlayOnAwake를 false로 설정하고 PermanentShake를 false로 설정합니다, 피드백을 생성하여 필요할 때만 움직임을 트리거할 수 있도록 합니다.
  6. "Player"라는 이름의 새로운 빈 게임 오브젝트를 생성하고 MMF Player 컴포넌트를 추가합니다, "Add new feedback" 드롭다운에서 Transform > PositionShake 피드백을 추가합니다.
  7. 피드백 설정에서 Channel을 정의할 수 있습니다. 우리의 쉐이커는 이미 Channel:0에 있으므로 그대로 둡니다.
  8. 에디터에서 플레이 버튼을 누릅니다. 그런 다음 MMF Player의 녹색 재생 버튼을 클릭하면 큐브가 흔들립니다.
  9. 플레이 모드에서 ShakeSpeed: 40, ShakeRange: 1, Duration: 0.75, ShakeMainDirection: 1,0,0, DirectionalNoiseStrengthMax: 1,1,1로 설정합니다.
  10. 다시 녹색 재생 버튼을 클릭하면 큐브가 주로 수평으로 흔들리며, 방향마다 약간의 무작위성이 추가됩니다.
  11. 이 컴포넌트를 사용하여 사용자가 원하는 대로 사용자 정의할 수 있으니 자유롭게 탐색해 보세요! 필요한 경우 rect transform에도 MMPositionShaker를 사용할 수 있습니다(적절한 모드를 설정하세요). 또한 필요한 경우 회전 및 크기에 대한 쉐이커도 찾아볼 수 있습니다.

 

 

MM Progress Bar 설정 방법?

  1. 새로운 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)을 가져옵니다.
  2. 새 빈 씬을 만들고, UI > Canvas를 추가합니다.
  3. 해당 Canvas 아래에 빈 자식 오브젝트를 (0,0 위치에) 생성하고, 이름을 MyBar로 지정합니다.
  4. MyBar 아래에 UI > Image를 (0,0 위치에) 추가하고, 이름을 BackgroundBar로 지정합니다. 색상을 검정으로 설정하고, 너비를 300으로 설정한 후, Pivot.x를 0으로 설정합니다.
  5. MyBar를 복제하여 DelayedBarDecreasing으로 이름을 변경하고, 색상을 주황색으로 설정합니다.
  6. DelayedBarDecreasing을 복제하여 DelayedBarIncreasing으로 이름을 변경하고, 색상을 노란색으로 설정합니다.
  7. DelayedBarIncreasing을 복제하여 ForegroundBar로 이름을 변경하고, 색상을 녹색으로 설정합니다.
  8. 이제 네 개의 막대가 서로 겹쳐지고 (가장 먼저 녹색 막대가 보이도록) MyBar에 MMProgressBar 컴포넌트를 추가합니다. 주의: Feel에는 NV 데모 전용 MMProgressBar 컴포넌트가 하나 더 있으며, 컬러 인스펙터가 있는 것을 사용해야 합니다. Add Component > More Mountains > Tools > GUI > MM Progress Bar를 선택합니다.
  9. 상단 인스펙터 그룹(Bindings)을 펼치고 ForegroundBar와 DelayedBars를 해당 슬롯에 드래그합니다.
  10. FillSettings 접기를 펼치고 SetInitialFillValueOnStart를 true로 설정하고, InitialFillValue를 1로 설정한 후, BarFillMode를 FixedDuration으로 설정합니다.
  11. 에디터에서 재생을 누른 후, 인스펙터 하단의 Debug 접기에서 Minus10 / Plus10Percent 버튼을 누르면, 축하합니다! 작동하는 진행률 표시줄이 완성되었습니다!

 

 

스크립트를 통해 막대 값 제어

디버그 컨트롤도 좋지만, 아마도 진행률 표시줄의 값을 제어하는 스크립트를 원할 것입니다. 진행률 표시줄 API 메서드를 사용하면 매우 쉽게 할 수 있습니다. 필요한 것은 진행률 표시줄에 대한 참조와 간단한 메서드 호출뿐입니다. 다음 클래스를 프로젝트에 추가해 보겠습니다 (새 클래스를 생성하고 이름을 TestBar로 지정한 후, 다음 코드를 붙여 넣습니다).
using UnityEngine;
using MoreMountains.Tools;

public class TestBar : MonoBehaviour
{
    // 진행률 표시줄 참조를 가져오기 위해 슬롯에 드래그 앤 드롭합니다.
    public MMProgressBar TargetProgressBar;
    // 0에서 100 사이의 값, 게임에서는 주인공의 체력 값일 수 있습니다.
    [Range(0f, 100f)] public float Value;
    // 인스펙터에 표시할 테스트 버튼으로 ChangeBarValue 메서드를 호출합니다.
    [MMInspectorButton("ChangeBarValue")] public bool ChangeBarValueBtn;

    void ChangeBarValue()
    {
        TargetProgressBar.UpdateBar(Value, 0f, 100f);
    }
}
  1. 그런 다음, 씬에 새 빈 오브젝트를 생성하고 TestBar 컴포넌트를 추가한 후, MyBar를 TargetProgressBar 슬롯에 드래그 앤 드롭합니다.
  2. 에디터에서 재생을 누른 후, TestBar 인스펙터에서 슬라이더를 사용하여 값을 설정하고 ChangeBarValue 버튼을 누릅니다.
물론 실제 게임에서는 캐릭터가 피해를 입거나 마나를 사용할 때, 막대의 값을 업데이트하고자 할 때 UpdateBar 호출을 메서드에 포함시킬 것입니다.

 

 

객체에 스쿼시 및 스트레치 동작을 추가하는 방법?

  1. Unity 2022.3.23f1(또는 그 이상)에서 새로운 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)을 가져옵니다.
  2. 새로운 빈 씬을 만듭니다.
  3. 새 빈 오브젝트를 만들고, 이름을 TopLevel로 지정하고, 위치를 (0,0,0)으로 설정합니다.
  4. 그 아래에 빈 자식 오브젝트를 (위치 (0,0,0)) 만들고, 이름을 SquashAndStretch로 지정한 후, MMSquashAndStretch 컴포넌트를 추가합니다.
  5. 마지막으로 큐브를 생성하고, SquashAndStretch 아래에 부모로 설정한 후 (0,0,0 위치), 3단계의 계층 구조를 가지도록 합니다.
  6. 에디터에서 재생 버튼을 누르고, TopLevel 오브젝트를 선택하여 이동시키면, 자동으로 스쿼시와 스트레치가 적용됩니다.

 

 

UI 요소 호버 효과 설정 방법?

마우스 커서가 UI 요소 위를 지나갈 때 UI 요소가 커지고, 마우스가 요소를 벗어날 때 다시 원래 크기로 줄어들게 하고 싶다면, 피드백을 사용하여 쉽게 설정할 수 있습니다.
새 클래스를 생성하고, 이름을 TestPointer로 지정한 후 다음 코드를 붙여 넣습니다:
using MoreMountains.Feedbacks;
using UnityEngine;
using UnityEngine.EventSystems;

public class TestPointer : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
	public MMF_Player MyPlayer;

	public void OnPointerEnter(PointerEventData eventData)
	{
		MyPlayer.Direction = MMFeedbacks.Directions.TopToBottom;
		MyPlayer.PlayFeedbacks();
	}

	public void OnPointerExit(PointerEventData eventData)
	{
		MyPlayer.Direction = MMFeedbacks.Directions.BottomToTop;
		MyPlayer.PlayFeedbacks();
	}
}
  1. 새로운 빈 씬에 UI > Button을 추가합니다, 버튼의 이름을 MyButton으로 지정하고, 위치를 (0,0,0)으로 설정합니다, MyButton에 TestPointer 컴포넌트를 추가합니다,
  2. 버튼에 빈 자식 오브젝트를 추가하고, 이름을 HoverFeedback으로 지정합니다, HoverFeedback에 MMF Player를 추가합니다.
  3. HoverFeedback에 Transform > Scale 피드백을 추가합니다, AnimateScaleTarget을 MyButton으로 설정합니다, 모든 트윈(X, Y, Z)을 MMTween > EaseInCubic으로 설정합니다, AnimateScaleDuration을 3으로 설정합니다.
  4. 다시 MyButton을 선택하고, HoverFeedback을 TestPointer 인스펙터의 MyPlayer 슬롯에 드래그 앤 드롭합니다.
  5. 에디터에서 재생 버튼을 누르고, 버튼 위에 커서를 올리면 버튼이 3초 동안 커지고, 커서를 이동시키면 다시 줄어듭니다.

 

 

 

코루틴의 나머지 부분을 실행하기 전에 MMF Player가 완료되기를 기다리는 방법?

  1. Unity 2022.3.23f1(또는 그 이상)에서 새로운 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)을 가져옵니다.
  2. 새로운 씬에서 큐브를 추가합니다.
  3. 새 빈 오브젝트에 MMF Player를 추가하고, Position 피드백을 추가하여 큐브를 AnimatePositionTarget으로 설정하고, AnimatePositionDuration을 4로 설정합니다.
  4. 새 오브젝트에 TestCoroutine 컴포넌트를 추가하고, MMF Player를 MyPlayer 슬롯에 드래그합니다.
  5. 재생을 누르고 TestCoPlay 버튼을 누르면, 큐브가 이동하기 시작하고 첫 번째 디버그 로그가 콘솔에 표시됩니다. 4초 후 MMF Player가 재생을 완료하면 코루틴의 끝이 실행되어 콘솔에 새 항목이 표시됩니다.
using System.Collections;
using MoreMountains.Feedbacks;
using MoreMountains.Tools;
using UnityEngine;

public class TestCoroutine : MonoBehaviour
{
	public MMF_Player MyPlayer;

	[MMFInspectorButton("TestCoPlay")]
	public bool TestCoPlayBtn;

	private void TestCoPlay()
	{
		StartCoroutine(TestCoPlayCo());
	}

	private IEnumerator TestCoPlayCo()
	{
		MMDebug.DebugLogTime("start");
		yield return MyPlayer.PlayFeedbacksCoroutine(this.transform.position);
		MMDebug.DebugLogTime("end");
	}
}

 

 

특정 유형의 피드백을 비활성화하는 방법?

때때로 플레이어에게 어떤 유형의 피드백을 경험할지 선택할 수 있는 옵션을 제공하고 싶을 때가 있습니다. 예를 들어, 화면 흔들림을 줄일 수 있는 옵션을 제공하는 것은 장애가 있는 사람들에게 도움이 될 수 있습니다. Feel을 사용하면 매우 쉽게 할 수 있습니다!
  1. Unity 2022.3.23f1(또는 그 이상)에서 새로운 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)을 가져옵니다.
  2. Toaster 데모 씬을 엽니다.
  3. 프로젝트에 새로운 클래스를 생성하고, 이름을 ImpulseDisabler로 지정한 후 다음 내용으로 바꿉니다:
using MoreMountains.FeedbacksForThirdParty;
using UnityEngine;

public class ImpulseDisabler : MonoBehaviour
{
	public void DisableAllImpulses()
	{
		MMF_CinemachineImpulse.FeedbackTypeAuthorized = false;
	}

	public void EnableAllImpulses()
	{
		MMF_CinemachineImpulse.FeedbackTypeAuthorized = true;
	}
}
  1. 씬에서 새로운 버튼을 생성합니다 (GameObject > UI > Button), 위치를 (0,0,0)으로 설정합니다 (중앙에 위치하게 되며, 필요에 따라 다른 위치로 옮길 수 있습니다).
  2. 새로 생성한 ImpulseDisabler 컴포넌트를 이 버튼에 추가합니다.
  3. 버튼 인스펙터에서 OnClick 항목에 새 엔트리를 추가하고, ImpulseDisabler 컴포넌트를 해당 슬롯에 드래그한 후, ImpulseDisabler.DisableAllImpulses 함수를 선택합니다.
  4. 에디터에서 재생을 누른 후, 씬 사이드바의 CM Impulse 버튼을 누르면 화면이 흔들립니다. 이제 생성한 버튼을 누르고 다시 CM Impulse 버튼을 누르면 화면이 더 이상 흔들리지 않습니다.
  5. 이제 단일 라인으로 피드백의 특정 유형을 비활성화(또는 활성화)하는 방법을 알게 되었습니다. 모든 피드백에 대해 이 작업을 수행할 수 있으며, 특정 유형을 대상으로 할 수 있습니다.

 

 

피드백을 사용하여 씬을 추가로 로드하는 방법?

  1. Unity 2022.3.23f1(또는 그 이상)에서 새로운 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)을 가져옵니다.
  2. 새로운 빈 씬을 만듭니다.
  3. 새 빈 오브젝트를 생성하고, 이름을 Feedback으로 지정합니다. 이 오브젝트에 MMF Player 컴포넌트를 추가한 후, “Add new feedback” 드롭다운을 통해 Scene > Load Scene 피드백을 추가합니다.
  4. SceneLoading/DestinationSceneName을 FeelDuck(Feel 데모 중 하나)으로 설정합니다.
  5. 빌드 설정(File > Build Settings)을 열고, 프로젝트 뷰에서 FeelDuck 씬을 빌드 설정의 ScenesInBuild 패널로 드래그한 후 창을 닫습니다.
  6. MMAdditiveLoadingScreen 씬도 동일하게 추가합니다.
  7. 에디터에서 플레이 모드로 진입한 후, MMF Player의 녹색 재생 버튼을 누릅니다. 로딩 화면이 나타나고, 로드가 완료된 후 새로운 씬으로 전환됩니다.

 

 

스쿼시 및 스트레치 피드백을 설정하는 방법?

  1. Unity 2022.3.23f1(또는 그 이상)에서 새로운 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)을 가져옵니다.
  2. 새 빈 오브젝트를 생성하고, 이름을 Container로 지정한 후, Transform을 리셋합니다.
  3. 새로운 큐브를 생성하고, 이름을 Model로 지정한 후 Container의 자식으로 설정하고, 위치를 (0,0,0)으로 설정합니다.
  4. 새 빈 오브젝트를 생성하고, 이름을 Player로 지정한 후, MMF Player를 추가합니다.
  5. Transform > Squash & Stretch 피드백을 추가하고, Container를 SquashAndStretchTarget 슬롯에 드래그합니다.
  6. 에디터에서 재생을 누르고, MMF Player의 녹색 재생 버튼을 누릅니다.
  1.  

 

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

Tweens and events  (0) 2024.07.13
Nice Vibrations  (0) 2024.07.13
Add juice to your game using springs  (0) 2024.07.10
Screen Shakes  (0) 2024.07.10
Creating a new feedback  (0) 2024.07.09

요약: 이 섹션에서는 스프링이 무엇인지, 그리고 다양한 방법으로 게임에 스프링을 통합하기 위해 Feel을 사용하는 방법에 대해 설명합니다.

테이블 내용
  • 소개  
  • 핵심 개념  
        -  설정  

        -   상호작용  

        -   Feel의 스프링  

  • 스프링 컴포넌트  
  • 간단한 스프링 컴포넌트 설정 방법  
        -   스프링 메서드  

  • 피드백과 함께 스프링 컴포넌트 사용하기  
  • 피드백을 사용하여 스프링 컴포넌트를 조종하는 방법  
  • 코드를 통해 스프링 컴포넌트 사용하기  
  • 포함된 스프링 컴포넌트 목록  
  • 새로운 스프링 컴포넌트 만들기  
  • 클램핑  
  • 스프링 API

 

소개

아마도 보간(interpolation) 개념에 익숙하실 겁니다. 이는 값을 A에서 B로 이동시키는 아이디어로, float, 벡터, 색상 등을 포함합니다. Feel은 전통적인 선형 보간(lerp)에서 고급 곡선에 이르기까지 다양한 방법을 제공합니다. 또한 값을 “스프링”에 연결하고 그 스프링이 시간이 지남에 따라 값이 어떻게 변할지를 정의하도록 하는 방법도 제공합니다. 이것은 실제 스프링을 가지고 노는 것처럼 매우 만족스러운 동작을 만들어내며, 서로 충돌할 위험 없이 여러 번 사용할 수 있고, 추가적인 이점으로 특정 지점에 이를 때까지 더해집니다. 게다가 Feel의 스프링 시스템은 최적화되어 있으며, 프레임레이트에 독립적이고 사용하기 매우 쉽습니다. 그래서 이 시스템이 게임에 어떤 도움이 될 수 있는지 함께 살펴보겠습니다!

 

 

시작하기 전에, 몇 가지 데모를 먼저 사용해 보시는 것이 좋습니다. Feel의 대부분의 데모는 어떤 형태로든 스프링을 특징으로 하지만, FeelSprings 데모 씬은 이 개념에 대한 최고의 소개이며, 이를 위한 작은 순차적 튜토리얼로 설계되었습니다. 그 후, MMFollowTargetDemo 씬과 FeelSquashAndStretch 씬을 살펴보시면 더 많은 예제를 볼 수 있습니다.

 

 

핵심 개념

"클래식" 보간에서는 A에서 B로 객체를 이동시키기 위해 A와 B 모두를 지정하고, 이동할 애니메이션 곡선과 지속 시간을 지정할 수 있습니다. 그러나 스프링을 사용하는 방법은 조금 다릅니다. 여기서는 이동에 대한 지속 시간을 지정하지 않고, 단지 스프링에게 새로운 값으로 이동하거나 "충격"을 주도록 지시하면 스프링의 설정이 그것이 어떻게 동작할지를 정의합니다.

 

설정

스프링의 동작을 정의하는 두 가지 주요 설정이 있습니다:

  • 감쇠(Damping): 스프링이 방해를 받은 후 얼마나 빨리 안정 상태로 돌아가는지를 결정합니다. 실제 스프링의 강도 또는 장력으로 생각할 수 있습니다. 감쇠 값은 0에서 1까지로, 0에 가까운 값은 매우 느슨한 스프링을, 1에 가까운 값은 매우 팽팽한 스프링을 나타냅니다.
  • 주파수(Frequency): 스프링이 안정 상태로 돌아가기 위해 1초당 몇 번 진동할지를 결정합니다.

이 두 값의 조합은 매우 다른 결과를 만들어낼 수 있으므로 원하는 동작을 얻기 위해 주저하지 말고 실험해 보세요.

 

상호작용

스프링과 상호작용하는 두 가지 주요 방법이 있습니다:

  • MoveTo: 스프링에게 새로운 값으로 이동하도록 요청합니다. 단순히 새로운 값을 지정하면 스프링이 나머지를 처리합니다.
  • Bump: 스프링의 값을 지정한 양만큼 "밀어"줍니다. 기본적으로 값을 특정 방향으로 밀어주고, 시간이 지나면서 설정에 따라 이전 상태로 되돌아갑니다. Bump를 사용할 때는 Bump 양이 스프링의 설정에 영향을 받는다는 것을 기억해야 합니다. 매우 느슨한 스프링은 멀리 이동하기 위해 큰 힘이 필요하지 않지만, 매우 팽팽한 스프링은 상당한 힘이 필요합니다.
    MoveTo와 Bump의 경우 모두 한 번의 호출, 한 번의 피드백, 한 번의 이벤트 또는 한 줄의 코드로 가능합니다.

Feel의 스프링

그래서 Feel에서 스프링을 어떻게 사용할 수 있을까요? 주요 방법은 다음과 같으며, 모두 아래에 자세히 설명되어 있습니다:

  • 스프링 컴포넌트(Spring Components): 70개 이상의 스프링 컴포넌트가 있으며, 이들을 클릭 한 번으로 추가하여 조명의 강도부터 이미지의 색상까지 다양한 요소를 제어할 수 있습니다. 그런 다음 스프링 피드백, 이벤트 또는 직접 호출을 사용하여 이를 조종할 수 있습니다.
  • 피드백(Feedbacks): Position Spring 또는 Scale Spring 피드백과 같이 일부 피드백은 내장된 스프링 동작을 제공합니다.
  • 스프링 API(Spring API): Feel은 고급이면서도 사용하기 쉬운 스프링 API를 제공하며, 이를 통해 자체 코드에 스프링 효과를 추가할 수 있습니다.
  • 기타 컴포넌트(Other components): Feel의 다양한 컴포넌트와 헬퍼에서 스프링이 사용되는 것을 볼 수 있습니다. 예를 들어 MMFollowTarget 헬퍼는 스프링 또는 다른 수단을 사용하여 몇 번의 클릭만으로 팔로우 동작을 설정할 수 있게 해줍니다.


스프링 컴포넌트

스프링을 사용하기 가장 쉬운 방법은 Feel에 포함된 70개 이상의 스프링 컴포넌트 중 하나를 사용하는 것입니다(아래 전체 목록 참조). 객체에 영향을 미치고 싶은 속성을 결정하고, 적절한 스프링을 선택한 다음 AddComponent 메뉴를 통해 게임 객체에 추가하면 됩니다.

스프링 컴포넌트 인스펙터의 예

 

인스펙터는 4개의 주요 섹션으로 나뉘어져 있습니다:

  • Target: 여기에서 스프링의 타겟을 지정할 수 있습니다. 비워두면 스프링은 자동으로 해당 객체의 관련 컴포넌트를 가져오려고 시도합니다. 이 섹션에서는 특정 스프링에 대한 필드도 찾을 수 있습니다.
  • Channel and TimeScale: 여기에서는 채널 옵션(채널에 대한 자세한 정보는 여기를 참조)을 정의하고, 스프링이 스케일된 시간 또는 비스케일된 시간에서 실행될지 선택할 수 있습니다(비스케일된 시간은 타임스케일 변경에 영향을 받지 않습니다).
  • Spring Settings: 여기에서는 스프링의 감쇠와 주파수를 정의할 수 있습니다. 벡터 값을 대상으로 하는 스프링의 경우 축을 분리할 수도 있습니다. 그렇게 하면 각 축에 대해 별도의 감쇠 및 주파수 설정과 각 축에 대한 클램핑 옵션을 얻을 수 있습니다.
  • Randomness: 이 섹션에서는 MoveToRandom() 또는 BumpRandom() 메서드를 호출할 때 선택될 무작위 값의 범위를 정의할 수 있습니다.
  • Test: 이 섹션에서는 스프링에서 사용할 수 있는 다양한 명령과 상호작용할 수 있습니다. 주요 동작(MoveTo 및 Bump)은 파란색으로 강조 표시되며, 바로 위에 있는 테스트 값 필드와 연결됩니다.


간단한 스프링 컴포넌트 설정 방법


  1. Unity 2022.3.23f1 (또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2 (또는 그 이상)을 가져옵니다.
  2. 새 씬에서, Cube를 0,0,0 위치에 추가하고, UI > Button을 0,0,0 위치에 추가합니다.
  3. Cube의 인스펙터에서 AddComponent 버튼을 눌러 MMSpringSquashAndStretch 컴포넌트를 추가합니다.
  4. 버튼의 인스펙터에서 OnClick 이벤트에 항목을 추가하고 Cube를 드래그하여 MMSpringSquashAndStretch > BumpRandom을 선택합니다.
  5. 에디터에서 재생 버튼을 누르고, 버튼을 (반복해서) 눌러봅니다!
  6. 실행 중일 때, Cube를 선택하고 인스펙터에서 Damping, Frequency, BumpAmountRandomValue 설정을 조정하여 버튼을 눌렀을 때 객체에 어떻게 영향을 미치는지 확인해보세요.

 

스프링 메서드

스프링을 컴포넌트, 피드백, 이벤트 또는 메서드의 직접 호출을 통해 상호작용할 때, 사용할 수 있는 주요 명령을 알고 싶을 것입니다:

  • MoveTo(newValue): 감쇠와 주파수 설정을 사용하여 지정된 값으로 스프링을 이동시킵니다.
  • MoveToAdditive(newValue): 현재 값에 전달된 newValue를 더한 값으로 스프링을 이동시킵니다.
  • MoveToSubtractive(newValue): 현재 값에서 전달된 newValue를 뺀 값으로 스프링을 이동시킵니다.
  • MoveToRandom: 최소값과 최대값 사이에서 선택된 새로운 값으로 스프링을 이동시킵니다.
  • MoveToInstant(newValue): 지정된 값으로 스프링을 즉시 이동시킵니다.
  • Bump(bumpAmount): 지정된 양만큼 스프링을 "밀어"줍니다.
  • BumpRandom: 최소값과 최대값 사이에서 선택된 양으로 스프링을 밀어줍니다.
  • Stop: 스프링의 움직임을 즉시 멈춥니다.
  • Finish: 스프링을 최종 목적지 위치로 즉시 이동시킵니다.
  • RestoreInitialValue: 스프링의 목표 값을 초기값으로 복원합니다 (스프링이 활성화되었을 때 또는 마지막으로 ResetInitialValue()가 호출되었을 때의 값).
  • ResetInitialValue: 스프링의 목표의 현재 값을 초기 위치로 설정하여 나중에 RestoreInitialValue() 호출을 통해 복원할 수 있도록 합니다.

  


피드백과 함께 스프링 컴포넌트 사용하기

피드백으로 모든 스프링 컴포넌트를 쉽게 조종할 수 있습니다. 이를 위해 먼저 해당 스프링이 어떤 타입인지 확인해야 합니다(예: float, Vector2, Vector3, Vector4, Color). 이는 스프링이 조종하는 값의 타입에 따라 다릅니다. 예를 들어, 라이트 강도 스프링은 Float 스프링이고, 위치 스프링은 Vector3 스프링입니다. 의심스러울 때는 스프링의 인스펙터에서 Spring Settings 섹션 상단에 작성된 내용을 확인할 수 있습니다.

그런 다음 동일한 타입의 스프링 피드백을 MMF Player에 추가하고, 직접 참조를 통해 타겟 스프링을 드래그하여 설정하거나 채널을 사용하여 이벤트를 통해 타겟팅할 수 있습니다.

 

피드백을 사용하여 스프링 컴포넌트를 조종하는 방법

  1. Unity 2022.3.23f1(또는 그 이상)에서 새 프로젝트를 만들고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)을 가져옵니다.
  2. 새 씬에서 Cube를 0,0,0 위치에 추가합니다.
  3. MainCamera를 선택하고 MMSpringCameraFieldOfView 컴포넌트를 추가합니다.
  4. 새 빈 객체를 생성하고, MMF Player를 추가합니다. 그런 다음 Springs > SpringFloat 피드백을 추가합니다(시야각(Field of View)은 float 값입니다). MainCamera를 TargetSpring 슬롯에 드래그하여 추가하고, BumpAmount를 1000으로 설정합니다.
  5. 에디터에서 재생 버튼을 누른 다음, MMF Player의 녹색 Play 버튼을 누릅니다.

 

 


코드를 통해 스프링 컴포넌트 사용하기

스프링 컴포넌트와 상호작용하는 것은 매우 쉽습니다. 예를 들어, mySpring이 MMSpringLightIntensity에 대한 참조일 때, 그냥 메서드를 직접 호출하면 됩니다:

// 스프링의 값을 3으로 이동시킵니다
mySpring.MoveTo(3f);
// 스프링을 25의 힘으로 밀어줍니다
mySpring.Bump(25f);
// 스프링의 무작위 설정에 따라 무작위 힘으로 스프링을 밀어줍니다
mySpring.BumpRandom();
// 0에서 5 사이에서 선택된 무작위 힘으로 스프링을 밀어줍니다
mySpring.BumpRandom(0f, 5f);

물론, 스프링 명령 중 어느 것이든 호출할 수 있습니다.
모든 스프링 컴포넌트는 이벤트를 수신하므로, 다음과 같이 자신의 코드에서 트리거할 수 있습니다:

// 채널 3을 듣고 있는 모든 float 스프링이 값 2로 이동하도록 하는 이벤트를 트리거합니다
MMChannelData channelData = new MMChannelData(MMChannelModes.Int, 3, null);
MMSpringFloatEvent.Trigger(SpringCommands.MoveTo, null, channelData, 2f);

물론 모든 클래식 스프링 명령을 이벤트를 통해서도 사용할 수 있습니다.

 


포함된 스프링 컴포넌트 목록

Feel은 게임 내 모든 것을 제어할 수 있는 수많은 스프링을 기본적으로 제공합니다. 여기 그 목록이 있습니다:

  • AudioSource: 피치, 볼륨
  • Camera: 시야각(Field of View), 직교 크기(Orthographic Size)
  • HDRP: 블룸 강도, 색수차 강도, 색상 조정 대비, 색상 조정 색상 이동, 색상 조정 채도, 피사계 심도 초점 거리, 렌즈 왜곡 강도, 모션 블러 강도, 파니니 투사 거리, 비네트 중심, 비네트 색상, 비네트 강도, 화이트 밸런스 온도, 화이트 밸런스 색조
  • Light: 색상, 강도, 범위
  • Rendering: 셰이더 컨트롤러, 스프라이트 색상, 텍스처 오프셋, 텍스처 스케일
  • Others: MMTimeScale, 애니메이터 속도
  • Post Processing: 블룸 강도, 색수차 강도, 색상 보정 대비, 색상 보정 색상 이동, 색상 보정 채도, 색상 보정 온도, 색상 보정 색조, 피사계 심도 초점 거리, 렌즈 왜곡 강도, 모션 블러 셔터 각도, 비네트 중심, 비네트 색상, 비네트 강도
  • Transform: 위치, 회전, 회전 중심, 스케일, 스쿼시 & 스트레치
  • UI: 이미지 알파, 이미지 색상, 이미지 채우기 양, RectTransform 위치, RectTransform 사이즈 델타
  • TextMeshPro: 알파, 문자 간격, 확장, 글꼴 크기, 줄 간격, 부드러움, 텍스트 색상, 단어 간격
  • URP: 블룸 강도, 색수차 강도, 색상 조정 대비, 색상 조정 색상 이동, 색상 조정 채도, 피사계 심도 초점 거리, 렌즈 왜곡 강도, 모션 블러 강도, 파니니 투사 거리, 비네트 중심, 비네트 색상, 비네트 강도, 화이트 밸런스 온도, 화이트 밸런스 색조

그리고 이게 부족하다면, 새로운 스크립트를 만드는 데는 단 몇 초밖에 걸리지 않습니다!

 


새로운 스프링 컴포넌트 만들기

새로운 스프링 컴포넌트를 만드는 것은 매우 쉽고, 1분 이내에 완료할 수 있습니다. 이를 위해 새로운 스크립트를 생성하고, 원하는 유형의 스프링 컴포넌트로부터 상속받도록 하면 됩니다.
이 작업이 어떻게 이루어지는지 보기 위해, Rigidbody2D의 Mass를 대상으로 하는 맞춤형 스프링의 예제를 살펴보겠습니다:

using MoreMountains.Feedbacks;
using UnityEngine;
public class Rigidbody2DMassSpring : MMSpringFloatComponent<Rigidbody2D>
{
	public override float TargetFloat
	{
		get => Target.mass;
		set => Target.mass = value;
	}
}

 

우리는 이 스프링이 float 값인 질량(mass) 값을 조종하기를 원하기 때문에 MMSpringFloatComponent를 확장합니다. 만약 Vector2 스프링이 필요하다면, MMSpringVector2Component로부터 상속받으면 됩니다. Vector3, Vector4 또는 Color도 마찬가지입니다. 그런 다음 Rigidbody2D 스프링 float 컴포넌트를 원한다고 지정합니다. 이렇게 하면 스프링이 자동으로 Target을 설정할 수 있습니다. 마지막으로, TargetFloat을 오버라이드하고 그 getter와 setter를 정의합니다. MMSpringVector2Component를 다룰 때는 TargetVector2를 오버라이드하게 됩니다.

물론, 포함된 70개 이상의 스프링 컴포넌트를 살펴보면 그들이 어떻게 하는지에 대한 예제를 볼 수 있습니다.

 


클램핑

클램프 설정의 예:

 

float 스프링 또는 개별 축 벡터 스프링에서는 클램프 설정을 할 수 있습니다. 이 설정은 스프링이 제어하는 값이 정의한 경계를 초과하지 않도록 하는 매우 간단한 설정입니다. 값을 최소값, 최대값 또는 둘 다로 클램프할 수 있습니다. 이는 예를 들어 캐릭터의 y 값을 제어하는 스프링이 있을 때, 공중으로 밀어 올리면서 내려올 때 바닥을 뚫고 지나가지 않도록 하는 데 유용합니다.

최소 및 최대 클램프에 대해 초과하지 않도록 최소값 또는 최대값을 정의하거나 ClampInitial을 true로 설정할 수 있습니다. 이 경우 스프링의 초기 값이 클램프 값으로 사용됩니다. 마지막으로, Bounce 옵션은 클램프가 스프링을 반대 방향으로 튕겨야 하는지 여부를 결정합니다.


스프링 API

이미 만들어진 컴포넌트나 피드백을 사용하여 스프링을 처리하는 방법을 보았지만, Springs API를 직접 코드에서 사용할 수도 있습니다. 이를 위해 기본 스프링 타입(MMSpringFloat, MMSpringVector2, MMSpringVector3, MMSpringVector4 또는 MMSpringColor) 중 하나를 선언하면 됩니다. 다음과 같이:

[Header("Spring")] // 선택 사항
public MMSpringFloat MySpring;

 

이렇게 하면 인스펙터에 사용자 정의 속성 드로어가 추가되어 스프링의 감쇠, 주파수 및 클램프 설정을 조정할 수 있습니다. 이제 어디서든 해당 스프링에 메서드를 호출할 수 있으며, 이전에 언급한 것과 동일한 메서드를 사용할 수 있습니다. 예를 들어:

MySpring.MoveTo(2f); // Bump, MoveToAdditive 등도 호출할 수 있습니다.

 

마지막으로 해야 할 일은 업데이트 시 스프링을 처리하는 것입니다. 다음과 같이 합니다:

MySpring.UpdateSpringValue(Time.deltaTime); // 다른 deltaTime 값을 전달할 수도 있습니다.

 

그 후에는 스프링의 값을 원하는 방식으로 사용할 수 있습니다. 다음과 같이:

float something = MySpring.CurrentValue;

다음은 이미지가 탄력 있는 스프링으로 마우스를 따라가도록 설정하는 전체 예제입니다:

using UnityEngine;
using MoreMountains.Feedbacks;

public class Test : MonoBehaviour
{
    public MMSpringVector2 _vector2Spring;
    private RectTransform _rectTransform;
    private Vector2 _mouseLocalPoint;

    void Start()
    {
        _rectTransform = GetComponent<RectTransform>();
    }

    void Update()
    {
        // 마우스 위치를 기준으로 이미지가 이동할 위치를 계산합니다.
        RectTransformUtility.ScreenPointToLocalPointInRectangle(_rectTransform.parent as RectTransform,
        Input.mousePosition, null, out _mouseLocalPoint);

        // 스프링에게 그 값으로 이동하도록 지시합니다.
        _vector2Spring.MoveTo(_mouseLocalPoint);

        // 스프링을 업데이트합니다.
        _vector2Spring.UpdateSpringValue(Time.deltaTime);

        // 스프링의 현재 값을 이미지의 위치에 적용합니다.
        _rectTransform.anchoredPosition = _vector2Spring.CurrentValue;
    }
}

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

Nice Vibrations  (0) 2024.07.13
Recipes  (0) 2024.07.11
Screen Shakes  (0) 2024.07.10
Creating a new feedback  (0) 2024.07.09
Complete list of Feedbacks  (0) 2024.07.09

요약: 이 섹션에서는 FEEL이 화면을 흔드는 다양한 방법을 다룹니다.

테이블 내용
  • 소개
  • 다양한 화면 흔들기 유형
  • Toaster 데모!
  • 카메라 흔들기 레시피
        -  Cinemachine 카메라 흔들기 설정 방법 (권장 방법)

        -   Cinemachine Impulse Source 피드백 설정 방법

        -   일반적인 non-Cinemachine 카메라 흔들기 설정 방법

        -   일반적인 카메라 흔들기를 설정하되 가상 카메라를 타겟으로 하는 방법

  • 기타 카메라 레시피
        -   카메라 줌 피드백 설정 방법

        -   MMFader 및 페이드 피드백 설정 방법

  • 화면 흔들기 비활성화
        -   특정 유형의 피드백을 비활성화하는 방법

 

 

소개

화면 또는 카메라 흔들기는 게임의 느낌을 생각할 때 가장 먼저 떠오르는 것일 수 있으며, FEEL은 흔들기와 기타 카메라 효과를 트리거하는 다양한 방법을 제공합니다. 이벤트 또는 피드백을 통해 이를 트리거할 수 있으며, 모든 설정을 자유롭게 커스터마이즈할 수 있습니다.

 

 

다양한 화면 흔들기 유형

일반적으로 "화면 흔들기"로 지정되는 것은 다양한 방식으로 수행될 수 있습니다. 게임에서 화면 흔들기를 설계할 때, 저는 이를 위한 언어를 정의하는 것을 좋아합니다. 흔들기의 강도 스케일을 정의하고, 사용하려는 다양한 유형의 화면 흔들기에 대한 의미를 결정합니다. 물론, 이는 제가 작업하는 방식이지만, 전혀 다른 방식으로 작업하셔도 좋습니다. 이는 절대적인 규칙이 아닙니다.

  • 강도 스케일: 게임 내에서 화면을 흔들리게 할 수 있는 많은 일이 발생할 수 있습니다. 보통, 이러한 흔들림의 강도를 스케일에 따라 매핑하고, 플레이어에게 중요한 이벤트는 그렇지 않은 이벤트보다 더 강한 강도를 가지게 됩니다. 예를 들어, 플레이어가 다치면 화면이 더 많이 흔들려야 하며, 아이템을 떨어뜨리는 경우에는 그렇게 중요하지 않을 것입니다. "강도"는 사용하는 화면 흔들기의 유형에 따라 다를 수 있습니다. 이는 움직임 범위, 지속 시간, 빈도 또는 이러한 설정 및 기타 설정의 조합일 수 있습니다.
  • 의미: 다양한 흔들림이 제공되므로, 보통 게임 내 특정 이벤트 유형과 연관시키려고 합니다. 대부분의 흔들림은 보편적인 의미가 없으며, 각 흔들림이 게임의 맥락에서 무엇을 의미하는지 정의하는 것은 당신에게 달려 있습니다. 예를 들어, 팩맨 같은 게임에서는 유령을 먹을 때 카메라 흔들기를 트리거하고, 죽을 때는 뷰 흔들기를 트리거할 수 있습니다. 정의된 피드백 언어를 고수하면 플레이어가 원인과 결과를 식별하는 데 도움이 됩니다.

 

다음은 Feel을 사용하여 구현할 수 있는 가장 일반적인 화면 흔들기 유형 목록입니다:

  • 카메라 위치 흔들기: 가장 일반적인 화면 흔들기 방법 중 하나는 카메라를 단순히 이동시키는 것입니다. Feel은 일반 카메라 흔들기, Cinemachine Impulses, MMWiggle, Cinemachine Noise, Position Shake 등 많은 피드백을 통해 이를 수행할 수 있습니다.
  • 카메라 회전 흔들기: 조금 덜 일반적이지만, 카메라를 이동시키는 또 다른 방법은 회전 흔들기입니다. 이번에는 카메라가 제자리에 머무르지만, 한 축 또는 여러 축으로 회전시킵니다.
  • 카메라 시야/줌 흔들기: 빠르게 줌 인 및 줌 아웃하는 것도 화면을 흔드는 좋은 방법이 될 수 있습니다. 보통 카메라의 시야(Field of View) (또는 2D에서는 정사영 크기)를 조정하여 이를 수행하지만, 카메라를 로컬 z 축으로 이동하여도 얻을 수 있습니다.
  • 뷰 흔들기: 개인적으로 가장 좋아하는 뷰 흔들기는 카메라를 이동하지 않고 전체 뷰를 이동시켜, 플레이 중인 전체 화면이 흔들리는 것처럼 느껴집니다. 이러한 흔들림은 보통 렌더 텍스처에 렌더링하는 것을 필요로 하며, 대부분의 게임은 해상도를 업스케일하기 위해 이를 수행합니다. 유사한 효과는 사용자 정의 포스트 프로세싱 셰이더를 구현하여 얻을 수도 있지만, 이는 하나의 추가 패스이므로 렌더 텍스처 옵션보다 큰 이점이 없습니다.
  • 포스트 프로세싱 흔들기: 렌즈 왜곡 또는 색수차와 같은 포스트 프로세싱 효과의 강도를 흔드는 것은 감정과 "화면 흔들기"를 전달하는 좋은 방법입니다. 비네트, 색상 등급 및 블룸 강도도 좋은 후보입니다.
  • UI 흔들기: 전체 화면을 흔드는 대신, UI(또는 그 일부)만 흔드는 것도 좋은 생각일 수 있습니다. Toaster 데모와 Duck 데모 씬에서 그 예를 볼 수 있습니다.

 

Toaster 데모!

Feel에는 화면을 흔드는 다양한 방법을 보여주는 전체 데모가 포함되어 있으며, 해당 데모에서는 토스터를 사용할 수 있습니다. 사이드바 메뉴에서 토스터 피드백을 켜고 끌 수 있으며, 다양한 화면 흔들기 피드백을 트리거할 수 있습니다. 많은 피드백이 눈에 띄게 과장되어 있음을 빠르게 알 수 있으며, 게임의 느낌에 맞게 강도를 조정하고 싶을 것입니다.

Unity 에디터에서 데모를 열어보는 것을 주저하지 마세요(FeelDemos/Toaster 폴더에 있습니다). 이 데모에서는 각 피드백이 어떻게 설정되어 있는지 볼 수 있으며, 실행 중에도 직접 값을 조정하여 피드백이 어떻게 작동하는지 탐색하고 화면을 흔드는 새로운 흥미로운 방법을 발견할 수 있습니다.

이 단일 데모에서 다양한 화면 흔들기 유형을 실행할 수 있도록 설정이 다소 복잡할 수 있습니다. 물론, 게임에서는 그렇게 많은 종류의 흔들기를 원하지 않을 수도 있으며, 그런 경우 아래의 레시피를 참고하면 최소한의 설정으로 좋은 출발점을 얻을 수 있습니다.

 

 

카메라 흔들기 레시피

 

Cinemachine 카메라 흔들기 설정 방법 (권장 방법)

  1. Unity 2022.3.23f1(또는 그 이상)에서 새로운 프로젝트를 생성하고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)를 가져옵니다. 
  2. 패키지 매니저에서 Cinemachine을 가져옵니다. 
  3. 새로운 빈 씬을 생성합니다. 
  4. 큐브를 추가하고 위치를 0,0,0으로 설정합니다.
옵션 1: 자동 셰이커 설정

  1. 빈 게임 오브젝트를 생성하고 이름을 MyTestFeedbacks로 설정합니다. MMF Player 컴포넌트를 추가하고 위치를 0,0,0으로 설정합니다. 
  2. Add new feedback 드롭다운을 통해 새로운 Cinemachine Impulse 피드백을 추가합니다. 
  3. Automatic Setup 폴드아웃을 펼치고 Automatic Shaker Setup 버튼을 누릅니다. 필요 시 MainCamera를 선택하고 CinemachineBrain이 있는지 확인합니다. 없다면 추가합니다. 
  4. 에디터에서 플레이 버튼을 누르고, MyTestFeedbacks 오브젝트를 선택한 다음, MMF Player 인스펙터에서 녹색 플레이 버튼을 누릅니다. 
  5. 카메라가 흔들립니다!
옵션 2: 수동 설정
  1. 상단 메뉴의 Cinemachine 메뉴를 통해 새로운 가상 카메라를 생성합니다. 
  2. 가상 카메라를 선택하고 Add Extensions 드롭다운을 통해 impulse listener를 추가합니다. 
  3. 빈 게임 오브젝트를 생성하고 이름을 MyTestFeedbacks로 설정합니다. MMF Player 컴포넌트를 추가하고 위치를 0,0,0으로 설정합니다. 
  4. Add new feedback 드롭다운을 통해 새로운 Cinemachine Impulse 피드백을 추가합니다. 
  5. 인스펙터에서 RawSignal 필드 끝의 작은 톱니바퀴를 클릭하고 Presets > 6D Shake를 선택합니다(톱니바퀴 아이콘이 작동하지 않으면 - 알려진 Cinemachine 버그로 인해, Packages/Cinemachine/Presets/Noise/에서 동일한 프리셋을 찾아 임펄스 피드백 인스펙터로 드래그할 수 있습니다). 
  6. Velocity를 인스펙터 하단에서 5,5,5로 설정합니다. 
  7. 에디터에서 플레이 버튼을 누르고, MyTestFeedbacks 오브젝트를 선택한 다음, MMF Player 인스펙터에서 녹색 플레이 버튼을 누릅니다. 
  8. 카메라가 흔들립니다!

 

 

Cinemachine Impulse Source 피드백 설정 방법

  1. Unity 2022.3.23f1(또는 그 이상)에서 새로운 프로젝트를 생성하고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)를 가져옵니다.
  2. 패키지 매니저에서 Cinemachine을 가져옵니다.
  3. 새로운 빈 씬을 생성합니다.
  4. 큐브를 추가하고 위치를 0,0,0으로 설정합니다.
  5. 상단 메뉴의 Cinemachine 메뉴를 통해 새로운 가상 카메라를 생성합니다.
  6. 가상 카메라를 선택하고 Add Extensions 드롭다운에서 impulse listener를 추가합니다.
  7. 빈 게임 오브젝트를 생성하고 이름을 MyTestFeedbacks로 설정합니다. MMF Player 컴포넌트를 추가하고 위치를 0,0,0으로 설정합니다.
  8. CinemachineImpulseSource 피드백을 추가합니다.
  9. AddComponent 버튼을 통해 Cinemachine Impulse Source를 추가하고, 해당 컴포넌트를 피드백의 ImpulseSource 필드로 드래그합니다.
  10. 재생 버튼을 누르고, MyTestFeedbacks 인스펙터에서 Play 버튼을 누르면 카메라가 흔들립니다.

 


일반적인 non-Cinemachine 카메라 흔들기 설정 방법

  1. Unity 2022.3.23f1(또는 그 이상)에서 새로운 프로젝트를 생성하고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)를 가져옵니다.
  2. 새로운 빈 씬을 생성합니다.
  3. 큐브를 추가하고 위치를 0,0,0으로 설정합니다.
옵션 1: 자동 셰이커 설정

  1. 빈 게임 오브젝트를 생성하고 이름을 MyTestFeedbacks로 설정합니다. MMF Player 컴포넌트를 추가합니다.
    새로운 피드백 추가 > 카메라 > 카메라 흔들기 추가합니다.
  2. Automatic Setup 폴드아웃을 펼치고 Automatic Shaker Setup 버튼을 누릅니다.
  3. 재생 버튼을 누르고, MyTestFeedbacks 인스펙터에서 Play 버튼을 누르면 카메라가 흔들립니다.
옵션 2: 수동 설정

  1. 카메라 위치에 빈 게임 오브젝트를 생성하고 CameraRig로 이름을 설정합니다.
  2. 카메라 위치에 빈 게임 오브젝트를 생성하고 CameraShaker로 이름을 설정하고, 이를 CameraRig 아래에 중첩시킵니다.
  3. 메인 카메라를 CameraShaker 아래에 중첩시킵니다. (이제 CameraRig > CameraShaker > MainCamera 구조를 가집니다.)
  4. CameraShaker 노드에 MMCameraShaker 컴포넌트를 추가합니다.
  5. MMWiggle에서 Position을 체크하고, wiggle 타입으로 Noise를 선택하며, wiggle permitted를 체크 해제합니다.
  6. 빈 게임 오브젝트를 생성하고 MyTestFeedbacks로 이름을 설정합니다. MMF Player 컴포넌트를 추가합니다.
  7. 새로운 피드백 추가 > 카메라 > 카메라 흔들기 추가합니다.
  8. 재생 버튼을 누르고, MyTestFeedbacks 인스펙터에서 Play 버튼을 누르면 카메라가 흔들립니다.

 


일반적인 카메라 흔들기를 설정하되 가상 카메라를 타겟으로 하는 방법

  1. Unity 2022.3.23f1(또는 그 이상)에서 새로운 프로젝트를 생성하고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)를 가져옵니다. 
  2. 패키지 매니저에서 Cinemachine을 가져옵니다. 
  3. 새로운 빈 씬을 생성하고 큐브를 추가한 다음, 위치를 0,0,0으로 설정합니다.
  4. 새로운 Cinemachine 가상 카메라를 생성하고 큐브를 볼 수 있도록 위치를 설정합니다.
  5. 가상 카메라의 Noise 설정에서 BasicMultiChannelPerlin을 선택하고, NoiseProfile을 6D Shake으로 설정한 다음, AmplitudeGain을 0으로, FrequencyGain을 0으로 설정합니다.
  6. 가상 카메라에 MMCinemachineCameraShaker를 추가합니다.
  7. 빈 게임 오브젝트를 생성하고 MMF Player를 추가합니다. Camera > Camera Shake 피드백을 추가합니다. CameraShakeProperties를 펼치고 모든 값을 다음과 같이 설정합니다: Duration: 0.3, Amplitude: 2, Frequency: 40.
  8. 에디터에서 재생 버튼을 누른 후, MMF Player 인스펙터에서 Play 버튼을 누릅니다.

 


기타 카메라 레시피

카메라 줌 피드백 설정 방법

  1. Unity 2022.3.23f1(또는 그 이상)에서 새로운 프로젝트를 생성하고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)를 가져옵니다.
  2. 새로운 빈 씬을 생성합니다.
  3. 큐브를 추가하고 위치를 0,0,0으로 설정합니다.
  4. MainCamera를 선택하고 MMCameraZoom 컴포넌트를 추가합니다.
  5. 빈 게임 오브젝트를 생성하고 이름을 MyTestFeedbacks로 설정합니다. MMF Player 컴포넌트를 추가합니다.
  6. Add new feedback 드롭다운을 통해 Camera > Camera Zoom 피드백을 추가합니다.
  7. 에디터에서 재생 버튼을 누르고, MyTestFeedbacks 오브젝트를 선택한 다음, MMF Player 인스펙터에서 녹색 재생 버튼을 누릅니다.

 


MMFader 및 페이드 피드백 설정 방법

  1. Unity 2022.3.23f1(또는 그 이상)에서 새로운 프로젝트를 생성하고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)를 가져옵니다.
  2. 새로운 빈 씬을 생성합니다.
옵션 1: 자동 셰이커 설정

  1. 씬에서 새로운 빈 오브젝트를 생성하고, MMF Player를 추가한 후, Camera > Fade 피드백을 추가합니다. 
  2. Automatic Setup 폴드아웃을 펼치고 Automatic Shaker Setup 버튼을 누릅니다. 
  3. 에디터에서 재생 버튼을 누르고, MMF Player의 녹색 재생 버튼을 누릅니다.
옵션 2: 수동 설정
  1. 씬에 UI 이미지를 추가하고, RectTransform을 설정하여 화면 전체를 덮도록 설정합니다(보통 전체 스트레치와 좌/우/상/하 0으로 설정). 이미지 색상을 검정으로 설정합니다. 
  2. UI 이미지에 MMFader 컴포넌트를 추가합니다. 이는 CanvasGroup을 추가하고, 알파를 0으로 설정합니다. 
  3. 씬에서 새로운 빈 오브젝트를 생성하고, MMF Player를 추가한 후, Camera > Fade 피드백을 추가합니다. 
  4. 재생 버튼을 누르고 피드백을 재생하면 페이더가 페이드 인(화면을 검정으로 페이드)됩니다. FadeType을 Fade Out으로 변경하면 다시 정상으로 페이드 아웃됩니다. Fade 피드백의 인스펙터에서 설정(지속 시간, 곡선 등)을 원하는 대로 조정할 수 있습니다. 페이더가 둘 이상 있는 경우, 페이더와 피드백의 채널 ID가 일치하는지 확인하십시오.

 


화면 흔들기 비활성화

특정 유형의 피드백을 비활성화하는 방법

 

때때로 플레이어에게 어떤 유형의 피드백을 경험할지 제어할 수 있는 옵션을 제공하고 싶을 때가 있습니다. 예를 들어, 화면 흔들기를 줄이는 옵션을 제공하는 것이 일반적입니다. 이는 장애가 있는 사람들에게 문제가 될 수 있기 때문입니다. Feel을 사용하면 이를 매우 쉽게 할 수 있습니다!


  1. Unity 2022.3.23f1(또는 그 이상)에서 새로운 프로젝트를 생성하고 패키지 매니저를 통해 Feel v4.1.2(또는 그 이상)를 가져옵니다. 
  2. Toaster 데모 씬을 엽니다. 
  3. 프로젝트에 새로운 클래스를 생성하고, 이름을 `ImpulseDisabler`로 설정한 후, 내용을 다음으로 교체합니다:
using MoreMountains.FeedbacksForThirdParty;
using UnityEngine;

public class ImpulseDisabler : MonoBehaviour
{
	public void DisableAllImpulses()
	{
		MMF_CinemachineImpulse.FeedbackTypeAuthorized = false;
	}

	public void EnableAllImpulses()
	{
		MMF_CinemachineImpulse.FeedbackTypeAuthorized = true;
	}
}
  1. 씬에서 새로운 버튼을 생성합니다 (GameObject > UI > Button), 위치를 0,0,0으로 설정합니다 (예, 화면 중앙에 위치하지만 원하는 위치로 이동시켜도 됩니다). 
  2. 새로 생성한 `ImpulseDisabler` 컴포넌트를 이 버튼에 추가합니다. 
  3. 버튼 인스펙터에서, OnClick 섹션에 새 항목을 추가하고, `ImpulseDisabler` 컴포넌트를 해당 슬롯으로 드래그한 다음, `ImpulseDisabler.DisableAllImpulses` 함수를 선택합니다. 
  4. 에디터에서 재생 버튼을 누르고, 씬의 사이드바에서 CM Impulse 버튼을 누르면 화면이 흔들립니다. 이제 생성한 버튼을 누른 다음 다시 CM Impulse 버튼을 누르면 더 이상 화면이 흔들리지 않습니다. 
  5. 이렇게 하면 이제 한 줄의 코드로 모든 유형의 피드백을 비활성화(또는 활성화)할 수 있습니다. 모든 피드백에 대해 이렇게 할 수 있으며, 단순히 특정 유형을 타겟으로 설정하면 됩니다!

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

Recipes  (0) 2024.07.11
Add juice to your game using springs  (0) 2024.07.10
Creating a new feedback  (0) 2024.07.09
Complete list of Feedbacks  (0) 2024.07.09
The MMF_Player component  (0) 2024.07.09

요약: 이 섹션에서는 새로운 MMFeedback을 생성하는 데 필요한 모든 정보를 설명합니다.

테이블 내용
  • 새로운 피드백 생성하기
  • 기존 피드백 수정하기
  • MMF_FeedbackBase 클래스
  • 확장 리포지토리

 

 

새로운 피드백 생성하기

새로운 피드백을 생성하는 것은 매우 간단합니다. 새 클래스를 생성하고, 이를 `MMF_Feedback`에서 상속받으며, 관심 있는 메서드를 오버라이드합니다(보통 `CustomInitialization`, `CustomPlayFeedback`, `CustomStopFeedback`, `CustomReset`). 각 피드백을 참고하여 어떻게 구현되는지 확인할 수 있으며, 모든 피드백에는 상세한 주석이 달려 있습니다. 시작점으로 사용할 수 있는 템플릿은 다음과 같습니다:

using UnityEngine;
using MoreMountains.Tools;

namespace MoreMountains.Feedbacks
{
    [AddComponentMenu("")]
    [FeedbackHelp("여기에 피드백 설명을 추가할 수 있습니다.")]
    [FeedbackPath("ChosenPath/MyFeedbackNameGoesHere")]
    public class MMF_MyFeedbackName : MMF_Feedback
    {
        /// 이 유형의 모든 피드백을 한 번에 비활성화하는 데 사용되는 정적 불리언
        public static bool FeedbackTypeAuthorized = true;
        /// 피드백의 지속 시간을 지정하기 위해 이 오버라이드를 사용합니다 (다른 피드백을 참고하는 것을 주저하지 마세요)
        public override float FeedbackDuration { get { return 0f; } }
        /// 피드백 인스펙터의 색상을 선택합니다
    		#if UNITY_EDITOR
    			public override Color FeedbackColor { get { return MMFeedbacksInspectorColors.DebugColor; } }
    		#endif

    		protected override void CustomInitialization(MMF_Player owner)
    		{
    			base.CustomInitialization(owner);
    			// 초기화 코드를 여기에 작성합니다
    		}

        protected override void CustomPlayFeedback(Vector3 position, float feedbacksIntensity = 1.0f)
        {
            if (!Active || !FeedbackTypeAuthorized)
            {
                return;
            }            
            // 재생 코드를 여기에 작성합니다
        }

        protected override void CustomStopFeedback(Vector3 position, float feedbacksIntensity = 1)
        {
	        if (!FeedbackTypeAuthorized)
	        {
		        return;
	        }            
	        // 정지 코드를 여기에 작성합니다
        }
    }
}

 

 

기존 피드백 수정하기

때때로 거의 원하는 기능을 제공하는 피드백을 찾을 수 있지만, 완전히 일치하지는 않을 때가 있습니다. 이러한 상황에서는 몇 가지 선택 사항이 있습니다:

  • 새로운 피드백을 완전히 생성하기: 이것도 가능하지만, 이미 다른 피드백이 제공하는 기능을 모두 다시 작성하는 것은 시간 낭비일 수 있으며, 많은 중복된 코드가 생성될 수 있습니다.
  • 기존 피드백 수정하기: 이것도 가능하지만, 다음 번 Feel을 업데이트할 때 변경 사항을 잃을 수 있습니다.
  • 현재 피드백을 상속하고 그 동작을 변경하기: 보통 권장되는 옵션으로, 가장 빠르고, 깔끔하며 안전한 방법입니다.

기존 피드백을 상속하고 확장하는 것은 C#의 다른 클래스와 마찬가지로 수행됩니다. Unity의 문서에서 이에 대해 더 자세히 배울 수 있습니다.

간단한 예제를 살펴보겠습니다: TextMeshPro Count To 피드백을 사용하여 현재 게임 내 크레딧을 표시한다고 가정해 보겠습니다. 예를 들어, 레벨 끝에서 해당 텍스트가 0에서 수집된 양으로 증가하도록 하는 경우입니다. 모든 것이 잘 작동하고 있지만, 해당 텍스트 끝에 달러 기호를 추가하고 싶다고 가정해 보겠습니다. 더 똑똑한 사람들은 옆에 달러 기호가 있는 또 다른 텍스트 요소를 추가하면 된다고 말할 수 있습니다. 하지만 데모를 위해 피드백 자체가 동일한 텍스트 요소에 접미사를 추가하도록 하고 싶다고 가정해 보겠습니다.

상속을 사용하면 쉽게 해결할 수 있습니다. 첫 번째로 해야 할 일은 확장할 스크립트를 파악하는 것입니다. Feel의 피드백 이름은 항상 ‘MMF_’ 접두사로 시작합니다. 보통 에디터의 프로젝트 패널의 검색 창에서 이름을 입력하여 피드백을 찾을 수 있습니다. 우리의 경우, MMF_TMPCountTo를 확장하려고 합니다. 시작해 봅시다:

using MoreMountains.Feedbacks;
using UnityEngine;

// "Add Feedback" 드롭다운에서 이 피드백에 액세스하는 방법을 지정합니다.
[FeedbackPath("TextMesh Pro/TMP Count To With Suffix")]

// 클래스 이름을 선언하고 MMF_TMPCountTo에서 상속받도록 지정합니다.
public class MMF_TMPCountToSuffix : MMF_TMPCountTo
{
    // 이 새로운 피드백이 접미사를 표시하도록 하기 위해, 텍스트에 추가할 새로운 문자열을 생성합니다.
	public string Suffix = "$";

    // 피드백에서 변경하고자 하는 부분은 UpdateText 메서드뿐이므로 이를 오버라이드합니다.
    // 나머지 부분은 이전과 동일하게 동작할 것입니다.
	protected override void UpdateText(float currentValue)
	{
        // 기본 메서드를 호출합니다. 변경 없이 실행되기를 원하며, 끝에 추가 작업을 하고자 합니다.
        // 물론 이는 필수 사항은 아니며, base를 호출하지 않고 해당 메서드의 동작을 완전히 변경할 수도 있습니다.
		base.UpdateText(currentValue);
        // TextMeshPro에 접미사를 추가합니다.
		TargetTMPText.text = TargetTMPText.text + Suffix;
	}
}

이제 이전 피드백을 제거하고, 이 새로운 피드백을 사용하기 시작할 수 있습니다. 피드백을 확장하는 것은 기존 기능을 활용하고 프로젝트의 정확한 사양에 맞게 조정하는 훌륭한 방법입니다. 피드백을 확장하는 동안 현재 피드백의 구조가 이상적이지 않다고 느끼면, 지원 양식을 사용하여 변경을 요청하는 것을 주저하지 마세요. Feel은 확장할 수 있도록 설계되었으며, 이 측면에서 지속적으로 개선되고 있습니다. 모든 제안은 환영합니다!

 

 

MMF_FeedbackBase 클래스

피드백에는 사용 사례에 적용할 수 있는 기본 클래스가 함께 제공됩니다. 이 추상 클래스는 피드백이 시간에 따라 또는 즉시 하나 이상의 값(float, 벡터, 색상, int, bool 등)을 수정하는 경우를 처리하도록 설계되었습니다. 좋은 예로는 CanvasGroup의 알파값이나 AudioSource의 볼륨이 있습니다.

사용 사례가 일치하는 경우 이 클래스를 기본으로 사용하면 많은 시간을 절약할 수 있습니다. MMF_CanvasGroup을 참고하여 구현 방법을 확인할 수 있습니다.

using MoreMountains.Tools;
using UnityEngine;
using UnityEngine.Scripting.APIUpdating;

namespace MoreMountains.Feedbacks
{
  /// <summary>
  /// 이 피드백은 시간에 따라 CanvasGroup의 불투명도를 제어할 수 있습니다.
  /// </summary>
  [AddComponentMenu("")]
  [FeedbackHelp("이 피드백은 시간에 따라 CanvasGroup의 불투명도를 제어할 수 있습니다.")]
  [MovedFrom(false, null, "MoreMountains.Feedbacks.MMTools")]
  [FeedbackPath("UI/CanvasGroup")]
  public class MMF_CanvasGroup : MMF_FeedbackBase
  {
    /// 이 피드백의 인스펙터 색상을 설정합니다.
    #if UNITY_EDITOR
    public override Color FeedbackColor { get { return MMFeedbacksInspectorColors.UIColor; } }
    public override bool EvaluateRequiresSetup() { return (TargetCanvasGroup == null); }
    public override string RequiredTargetText { get { return TargetCanvasGroup != null ? TargetCanvasGroup.name : "";  } }
    public override string RequiresSetupText { get { return "이 피드백이 제대로 작동하려면 TargetCanvasGroup이 설정되어야 합니다. 아래에서 설정할 수 있습니다."; } }
    #endif
    public override bool HasAutomatedTargetAcquisition => true;
    protected override void AutomateTargetAcquisition() => TargetCanvasGroup = FindAutomatedTarget<CanvasGroup>();

    // 아래에서 사용 사례에 특정한 여러 속성을 선언합니다.
    // 각 값에 대해 이동할 MMTweenType 곡선,
    // 대상, 0과 1 값을 다시 매핑할 값, 즉시 적용할 값을 선언합니다.

    [MMFInspectorGroup("Canvas Group", true, 12, true)]
    /// 레벨을 기록할 수신기
    [Tooltip("레벨을 기록할 수신기")]
    public CanvasGroup TargetCanvasGroup;
    /// 불투명도를 트윈할 곡선
    [Tooltip("불투명도를 트윈할 곡선")]
    [MMFEnumCondition("Mode", (int)MMFeedbackBase.Modes.OverTime)]
    public MMTweenType AlphaCurve = new MMTweenType(new AnimationCurve(new Keyframe(0, 0), new Keyframe(0.3f, 1f), new Keyframe(1, 0)));
    /// 불투명도 곡선의 0을 다시 매핑할 값
    [Tooltip("불투명도 곡선의 0을 다시 매핑할 값")]
    [MMFEnumCondition("Mode", (int)MMFeedbackBase.Modes.OverTime)]
    public float RemapZero = 0f;
    /// 불투명도 곡선의 1을 다시 매핑할 값
    [Tooltip("불투명도 곡선의 1을 다시 매핑할 값")]
    [MMFEnumCondition("Mode", (int)MMFeedbackBase.Modes.OverTime)]
    public float RemapOne = 1f;
    /// 즉시 모드에서 불투명도를 이동할 값
    [Tooltip("즉시 모드에서 불투명도를 이동할 값")]
    [MMFEnumCondition("Mode", (int)MMFeedbackBase.Modes.Instant)]
    public float InstantAlpha;

    public override void OnAddFeedback()
    {
      base.OnAddFeedback();
      RelativeValues = false;
    }

    // 이 메서드에서 마법이 일어납니다.
    // 기본 타겟과 수신기를 생성합니다. 수신기의 객체를 바인딩하고,
    // 영향을 줄 속성을 지정합니다.
    // 그런 다음 MMF_FeedbackBaseTarget을 설정하고, 마지막으로 타겟 목록에 추가합니다. 끝입니다!
    protected override void FillTargets()
    {
      if (TargetCanvasGroup == null)
      {
        return;
      }
      MMF_FeedbackBaseTarget target = new MMF_FeedbackBaseTarget();
      MMPropertyReceiver receiver = new MMPropertyReceiver();
      receiver.TargetObject = TargetCanvasGroup.gameObject;
      receiver.TargetComponent = TargetCanvasGroup;
      receiver.TargetPropertyName = "alpha";
      receiver.RelativeValue = RelativeValues;
      target.Target = receiver;
      target.LevelCurve = AlphaCurve;
      target.RemapLevelZero = RemapZero;
      target.RemapLevelOne = RemapOne;
      target.InstantLevel = InstantAlpha;
      _targets.Add(target);
    }
  }
}

 

 

 

확장 리포지토리

새로운 피드백을 생성하고 다른 사람들이 이를 활용할 수 있을 것 같다면, 또는 더 많은 피드백이나 Feel 도구를 찾고 있다면, Github의 Feel Extensions Repository를 확인할 수 있습니다. 기여는 언제나 환영입니다!

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

Add juice to your game using springs  (0) 2024.07.10
Screen Shakes  (0) 2024.07.10
Complete list of Feedbacks  (0) 2024.07.09
The MMF_Player component  (0) 2024.07.09
Core concepts(핵심 개념)  (0) 2024.07.08

요약: 이 섹션에서는 자산에 포함된 모든 피드백을 나열합니다.

테이블 내용
  • 피드백 전체 목록
        -  Animation

        -   Audio

        -   Camera

        -   Events

        -   GameObject

        -   Feedbacks

        -   HDRP Volume

        -   Loop

        -   Nice Vibrations

        -   Particles

        -   Pause

        -   Post Processing

        -   Renderer

        -   Scene

        -   Springs

        -   TextMesh Pro

        -   Time

        -   Transform

        -   UI Toolkit

        -   URP Volume

        -   UI

        -   Various(기타)

        -   Debug

        -   추가 정보

 

 

피드백 전체 목록

Feel은 다양한 유형의 피드백을 제공합니다. 일부는 게임 오브젝트와 상호작용하거나 초점을 맞추고, 일부는 카메라(또는 그 일부)와 상호작용하며, 일부는 서드 파티와 상호작용하거나 특정 범주에 속하지 않는 경우도 있습니다. 일부 피드백은 자율적으로 작동하고, 일부는 장면에 배치된 Shaker(물체를 흔드는 역할을 하는 객체)라는 다른 객체의 존재를 필요로 합니다. 이 목록은 모든 피드백을 설명하며, 더 자세히 알고 싶다면 각 클래스의 주석을 참조할 수 있습니다.

이 페이지는 모든 피드백을 단순히 나열합니다. 각 피드백에 대한 모든 세부 정보를 알고 싶다면 API 문서를 참조하십시오.

 

Animation

  • Animation Parameter: 애니메이터에서 모든 애니메이션을 재생할 수 있습니다. 피드백의 인스펙터에 애니메이터를 바인딩하면 트리거 및/또는 불 애니메이션 매개변수를 업데이트할 수 있습니다.
  • Animator Speed: 런타임 동안 대상 애니메이터의 속도를 조정할 수 있습니다.
  • Animator Cross Fade: 정규화된 시간 또는 일반 시간을 통해 애니메이터를 지정된 상태로 크로스 페이드할 수 있습니다.

 

Audio

  • AudioSource: 기존의 오디오 소스를 필요에 따라 재생, 일시 정지, 재개 또는 중지할 수 있습니다. 또한 임의의 피치와 볼륨으로 재생/일시 정지/중지/재개할 수 있으며, 선택적으로 오디오 믹서 그룹을 통해 수행할 수 있습니다.
  • Sound: 사운드를 트리거하는 또 다른 방법입니다. 오디오 클립을 지정한 다음 필요에 따라 인스턴스화, 캐시, 준비된 사운드의 객체 풀 생성 또는 사운드 이벤트 트리거 등을 결정할 수 있습니다. 이 피드백은 에디터에서 사운드를 미리 볼 수도 있습니다. 기본적으로 Event 모드로 설정되어 있으며, 이는 장면에서 MMSoundManager가 이를 잡도록 요구합니다(또는 이러한 이벤트를 잡도록 하려는 다른 클래스). 사운드 관리자를 사용하지 않으려면 Cached 모드를 선택하는 것이 좋습니다.
  • AudioSource Pitch: AudioSource의 피치를 시간에 따라 조정합니다. 대상 오디오 소스에 MMAudioSourcePitchShaker가 필요합니다.
  • AudioSource Stereo Pan: AudioSource의 스테레오 팬 값을 시간에 따라 변경합니다. 대상 오디오 소스에 MMAudioSourceStereoPanShaker가 필요합니다.
  • AudioSource Volume: 오디오 소스의 볼륨을 시간에 따라 조정할 수 있습니다. 대상 오디오 소스에 MMAudioSourceVolumeShaker가 필요합니다.
  • Distortion Filter: 왜곡 필터의 왜곡 수준을 시간에 따라 조정합니다. 대상 오디오 소스에 MMAudioSourceDistortionShaker와 왜곡 필터가 필요합니다.
  • Echo Filter: 에코를 시간에 따라 조정합니다. 대상 오디오 소스에 MMAudioSourceEchoShaker와 에코 필터가 필요합니다.
  • High Pass Filter: 하이 패스 필터의 컷오프를 시간에 따라 조정합니다. 대상 오디오 소스에 MMAudioSourceHighPassShaker와 하이 패스 필터가 필요합니다.
  • Low Pass Filter: 로우 패스 필터의 컷오프를 시간에 따라 조정합니다. 대상 오디오 소스에 MMAudioSourceLowPassShaker와 로우 패스 필터가 필요합니다.
  • Reverb Filter: 리버브 수준을 시간에 따라 조정합니다. 대상 오디오 소스에 MMAudioSourceReverbShaker와 리버브 필터가 필요합니다.
  • AudioMixer Snapshot Transition: 지정된 기간 동안 대상 스냅샷으로 전환할 수 있습니다.
  • MMPlaylist: 피드백에서 MMPlaylist를 원격으로 제어(재생/일시 정지/중지/이전/다음 등)할 수 있습니다.
  • MMSoundManager All Sounds Control: MMSoundManager에서 재생 중인 모든 사운드를 제어할 수 있습니다.
  • MMSoundManager Save and Load: MMSoundManager 설정(트랙 볼륨 등)을 저장하고 로드할 수 있습니다.
  • MMSoundManager Sound: MMSoundManager에서 사운드를 재생할 수 있습니다.
  • MMSoundManager Sound Control: MMSoundManager에서 재생 중인 사운드를 재생/일시 정지/재개/볼륨 설정 등을 할 수 있습니다.
  • MMSoundManager Sound Fade: MMSoundManager에서 사운드를 페이드 인/아웃할 수 있습니다.
  • MMSoundManager Track Control: MMSoundManager에서 전체 트랙(음악, UI, 효과음, 마스터)을 제어할 수 있습니다.
  • MMSoundManager Track Fade: MMSoundManager의 트랙을 페이드 인/아웃할 수 있습니다.

 

Camera

  • Camera Shake: 카메라를 일정 시간 동안 흔들 수 있으며, 지속 시간(초), 진폭 및 빈도를 지정할 수 있습니다. 더 고급 흔들림을 원한다면 Cinemachine Impulse 피드백을 확인하세요. 이 피드백에는 카메라에 MMCameraShaker 컴포넌트가 필요합니다. Cinemachine을 사용하는 경우, 가상 카메라에 MMCinemachineCameraShaker와 소음 설정이 필요합니다. 노이즈를 추가하려면 가상 카메라를 선택하고, Noise 패널에서 Basic Multichannel Perlin을 선택하여 노이즈 프로파일을 선택하십시오. "일반" 카메라 또는 사용자 정의 카메라 컨트롤러를 사용하는 경우, "카메라 리그"라는 계층 구조를 사용하는 것이 좋습니다. MMF_PlayerDemo의 "Camera & Lights" 노드에서 예시를 확인할 수 있습니다. 기본적으로 상위 레벨 객체에 카메라 컨트롤러를 배치하고, 그 아래에 MMCameraShaker를 배치한 후, 카메라를 중첩합니다. 필요에 따라 더 많은 중첩 레벨을 추가할 수 있습니다.
  • Camera Zoom: 피드백이 재생될 때 줌 인 또는 줌 아웃을 할 수 있으며, 지정된 기간 동안 또는 추가 지시가 있을 때까지 지속됩니다. 일반 카메라를 사용하는 경우 MMCameraZoom 컴포넌트가 필요하며, Cinemachine 가상 카메라를 사용하는 경우 MMCinemachineZoom 컴포넌트가 필요합니다. 이 피드백은 현재 줌 값을 기준으로 상대적인 값을 사용할 수 있습니다.
  • Flash: 화면에 이미지를 플래시하거나 색상을 짧은 시간 동안 플래시합니다. 이 피드백과 상호 작용하기 위해 장면에 MMFlash 컴포넌트를 가진 요소가 필요합니다. 색상, 알파, Flash ID를 지정하여 플래시를 완벽하게 제어할 수 있습니다.
  • Fade: 이미지를 페이드 인 또는 페이드 아웃하여 전환에 유용합니다. 이 피드백에는 장면에 MMFader 컴포넌트를 가진 객체가 필요합니다. 피드백의 인스펙터에서 전환 곡선, 대상 알파 및 위치를 선택할 수 있습니다. MMFaderRounds를 제어하는 데도 사용할 수 있습니다.
  • Field of View: 카메라의 시야각을 시간에 따라 제어합니다. 카메라에 MMCameraFieldOfViewShaker가 필요하거나, 가상 카메라에 MMCinemachineFieldOfViewShaker가 필요합니다.
  • Clipping Planes: 카메라의 가까운 및 먼 클리핑 평면 거리를 시간에 따라 트윈할 수 있습니다. 카메라에 MMCameraClippingPlanesShaker가 필요하며, Cinemachine을 사용하는 경우 가상 카메라에 MMCinemachineClippingPlanesShaker가 필요합니다.
  • Orthographic Size: 정사영/2D 카메라 전용으로, 카메라의 크기를 시간에 따라 트윈하여 줌 인 또는 줌 아웃할 수 있습니다. 카메라에 MMCameraOrthographicSizeShaker가 필요하거나, 가상 카메라에 MMCinemachineOrthographicSizeShaker가 필요합니다.
  • Cinemachine Transition: 선택한 블렌드를 사용하여 다른 가상 카메라로 전환하고, 다른 카메라의 우선 순위를 자동으로 관리합니다. 이를 위해 각 가상 카메라에 MMCinemachinePriorityListener가 필요합니다. 더 많은 제어가 필요한 경우, Cinemachine 브레인에 MMCinemachinePriorityBrainListener를 추가할 수 있습니다. 이를 통해 피드백에서 기본 전환을 재정의할 전환을 지정할 수 있습니다.
  • Cinemachine Impulse: 가상 카메라를 흔들기 위해 Cinemachine Impulse를 트리거합니다. 이를 위해 가상 카메라에 Impulse Listener가 필요합니다. 가상 카메라를 선택하고, 인스펙터 하단의 "add extension" 드롭다운에서 Cinemachine Impulse Listener를 선택합니다. 피드백의 인스펙터에서 여러 설정을 조정할 수 있습니다. 시작하려면 Raw Signal을 선택하고(작은 톱니바퀴 아이콘을 클릭하여 Presets > 6D Shake 선택), 인스펙터 하단의 속도를 1, 1, 1로 설정합니다. 그런 다음 필요에 따라 조정하세요. 공격, 유지, 감쇠, 스케일, 충격 반경 등을 제어할 수 있는 강력한 도구입니다. Impulse에 대해 더 알고 싶다면 Cinemachine 문서를 참조하세요. Impulse는 거리 기반이므로 가상 카메라가 발신자(MMF_Player의 변환)의 범위 내에 있는지 확인하세요. 그렇지 않으면 아무 일도 일어나지 않습니다.
  • Cinemachine Impulse Source: 대상 Cinemachine Impulse 소스에 Impulse를 생성합니다. 설정은 Cinemachine Impulse 피드백과 유사하지만 Cinemachine Impulse Source 컴포넌트가 필요하며, 가상 카메라에 Cinemachine Impulse Listener가 필요합니다.
  • Cinemachine Impulse Clear: 재생 중인 Cinemachine Impulse를 취소합니다.

 

Events

  • Unity Events: 피드백에 모든 종류의 Unity 이벤트를 연결하여 재생, 중지, 초기화 또는 재설정 시 트리거할 수 있습니다.
  • MMGameEvent: 재생 시 지정된 이름의 MMGameEvent를 트리거합니다.

 

GameObject

  • Destroy: 특정 게임 오브젝트를 파괴, 즉시 파괴 또는 비활성화할 수 있습니다.
  • Enable Behaviour: 피드백이 재생될 때, 초기화될 때, 중지될 때 또는 재설정될 때 모노비헤이비어를 활성화 또는 비활성화합니다.
  • Float Controller: 모든 모노비헤이비어의 float 값을 제어할 수 있는 가장 강력한 피드백 중 하나입니다. 대상 모노비헤이비어에 FloatController 컴포넌트가 필요합니다.
  • Instantiate Object: 피드백이 재생될 때 지정된 위치에 객체를 생성합니다.
  • Rigidbody: Rigidbody에 힘 또는 토크를 추가합니다.
  • Rigidbody2D: Rigidbody2D에 힘 또는 토크를 추가합니다.
  • Collider: 대상 콜라이더를 활성화/비활성화/토글하거나 트리거 상태를 변경합니다.
  • Collider2D: 대상 콜라이더 2D를 활성화/비활성화/토글하거나 트리거 상태를 변경합니다.
  • Property: 모든 객체(스크립터블 오브젝트 포함)의 모든 속성 또는 필드(float, 벡터, int, 문자열, 색상 등)를 타겟팅하고 제어할 수 있습니다. 대상 객체 또는 스크립터블 오브젝트를 TargetObject 슬롯에 드래그한 다음 컴포넌트를 선택하고 영향을 미칠 속성을 선택하십시오. 그런 다음 재매핑 옵션을 정의하고 곡선을 조정할 수 있습니다.
  • Set Active: 객체를 활성화 또는 비활성화합니다.
  • MMRadioSignal: 이 피드백은 MMRadioSignal을 제어할 수 있으며, 이를 통해 원하는 값을 모든 컴포넌트의 모든 객체에서 제어할 수 있습니다. MMRadio 시스템에 대해 더 읽어보세요. 매우 유용할 수 있습니다.
  • MMRadio Broadcast: MMRadioSignal 피드백과 유사하지만 신호를 발신자를 통해 거치지 않고 직접 수신자에게 방송합니다.

 

Feedbacks

  • Feedbacks Player: 지정된 범위 내에서 다른 MMF_Players를 트리거하거나, 대상 MMF_Player를 지정하여 그 대상의 전체 지속 시간을 맞춥니다.
  • MMF Player Chain: 여러 MMF Players를 순차적으로 재생하고, 그 전후에 선택적으로 지연을 추가할 수 있습니다.
  • Player Control: 하나 이상의 대상 MMF Players에서 메서드를 트리거할 수 있습니다.

 

HDRP Volume

  • Bloom HDRP: 시간에 따라 블룸 강도를 제어합니다.
  • Chromatic Aberration HDRP: 시간에 따라 색수차의 강도를 제어합니다.
  • Channel Mixer HDRP: 시간에 따라 빨강, 초록, 파랑 채널을 독립적으로 제어합니다.
  • Color Adjustments HDRP: 노출, 채도, 색조 이동, 대비 등 다양한 색상 조정 옵션을 사용할 수 있습니다.
  • Depth of Field HDRP: 시간에 따라 HDRP Depth of Field 초점 거리 또는 근접/원거리 범위를 제어합니다.
  • Film Grain HDRP: 시간에 따라 필름 그레인 강도를 제어합니다.
  • Lens Distortion HDRP: 렌즈 왜곡을 필요에 따라 적용합니다.
  • Motion Blur HDRP: 시간에 따라 모션 블러 수준을 제어합니다.
  • Panini Projection HDRP: 시간에 따라 파니니 프로젝션의 거리 및 자르기 값을 조정합니다.
  • Vignette HDRP: 시간에 따라 비네트 매개변수를 제어합니다.
  • White Balance HDRP: 시간에 따라 화이트 밸런스 매개변수를 제어합니다.

 

Loop

  • Looper: MMF_Player의 시퀀스의 현재 "헤드"를 목록의 다른 피드백으로 되돌립니다. 이 시퀀스를 원하는 횟수만큼 반복하거나 무한히 반복할 수 있습니다.
  • Looper Start: 루프의 시작 지점으로 작동할 수 있으며, 일시 정지 기능도 제공합니다.

 

Nice Vibrations

  • Nice Vibrations Preset: 사전 정의된 간단한 햅틱 패턴을 재생합니다.
  • Nice Vibrations Emphasis: 실시간으로 진폭과 주파수를 제어할 수 있는 짧은 햅틱 버스트(Transient)를 재생합니다.
  • Nice Vibrations Clip: .haptic 클립을 재생하며, 레벨과 주파수를 무작위화할 수 있습니다.
  • Nice Vibrations Continuous: 지정된 진폭과 주파수로 일정 시간 동안 연속적인 햅틱을 재생합니다. 이 피드백은 이를 무작위화하고 시간에 따라 변조할 수도 있습니다.
  • Nice Vibrations Control: 글로벌 수준에서 햅틱과 상호 작용하여 모두 중지, 활성화 또는 비활성화, 글로벌 레벨 조정 또는 햅틱 엔진 초기화/해제 등을 수행할 수 있습니다.

 

Particles

  • Particles Instantiation: 파티클을 인스턴스화하고 재생합니다. 필요에 따라 인스턴스화하거나 캐시할 수 있으며, 원하는 위치를 지정할 수 있습니다.
  • Particles Play: 기존 파티클 시스템을 제어(재생, 일시 정지, 중지, 재개)할 수 있습니다. 피드백의 위치로 이동할 수도 있습니다.
  • Visual Effect: 대상 비주얼 효과를 제어하여 재생/일시 정지/중지 등을 할 수 있습니다.
  • Visual Effect Set Property: 대상 비주얼 효과의 Property ID 값을 설정할 수 있습니다.

 

Pause

  • Pause: 피드백 시퀀스에서 만났을 때 일시정지를 발생시켜, 일시정지가 완료될 때까지 시퀀스 내에서 하위 피드백의 실행을 방지합니다.
  • Holding Pause: 시퀀스의 이전 모든 피드백과 이 피드백의 일시정지가 완료될 때까지 대기합니다.

 

Post Processing

모든 포스트 프로세싱 피드백은 PostProcessing 볼륨에 해당하는 셰이커가 필요합니다.

  • Bloom: 시간에 따라 블룸 강도와 임계값을 제어합니다. 포스트 프로세싱 볼륨에 MMBloomShaker가 필요합니다.
  • Chromatic Aberration: 시간에 따라 색수차 강도를 제어합니다. 포스트 프로세싱 볼륨에 MMChromaticAberrationShaker가 필요합니다.
  • Color Grading: 노출, 채도, 색조 이동, 대비 등 다양한 색상 등급 옵션을 사용할 수 있습니다. 포스트 프로세싱 볼륨에 MMColorGradingShaker가 필요합니다.
  • Depth of Field: 시간에 따라 피사계 심도 초점 거리, 조리개 및 초점 거리를 제어합니다. 포스트 프로세싱 볼륨에 MMDepthOfFieldShaker가 필요합니다.
  • Global PP Volume Auto Blend: 포스트 프로세싱 볼륨의 가중치를 트윈할 수 있습니다.
  • Lens Distortion: 필요에 따라 렌즈 왜곡을 적용합니다. 포스트 프로세싱 볼륨에 MMLensDistortionShaker가 필요합니다.
  • PP Moving Filter: 카메라 안팎으로 포스트 프로세싱 필터를 이동합니다.
  • Vignette: 시간에 따라 비네트 매개변수를 제어합니다. 포스트 프로세싱 볼륨에 MMVignetteShaker가 필요합니다.

 

Renderer

  • Flicker: 재질의 색상을 빠르게 변경할 수 있습니다. 기본적으로 타겟 렌더러의 셰이더 색상 값을 제어하지만 원하는 경우 사용자 지정 값을 지정할 수도 있습니다. 플리커 지속 시간, 옥타브 및 색상 제어가 가능합니다.
  • Fog: 장면의 안개 밀도, 색상, 종료 및 시작 거리를 애니메이션화할 수 있습니다.
  • Material: 배열의 재질 중에서 재생될 때마다 타겟 렌더러의 재질을 변경할 수 있습니다. 순차적으로 또는 무작위로 교체할 수 있습니다.
  • Image Material: 타겟 이미지의 재질을 변경할 수 있습니다.
  • Material Set Property: 타겟 렌더러의 재질 속성 값을 설정할 수 있습니다.
  • MMBlink: 게임 오브젝트를 활성화/비활성화하거나, 알파 값, 방출 강도 또는 셰이더의 임의 값 변경 등을 통해 고급 깜빡임 동작을 제어할 수 있습니다. 보간 여부와 반복 패턴 및 단계를 정의할 수 있습니다.
  • Shader Controller: Float Controller와 유사하게 모든 셰이더의 대부분의 설정을 제어할 수 있습니다. 타겟(또는 여러 타겟)에 ShaderController 컴포넌트가 필요합니다.
  • Shader Global: 런타임에 전역 셰이더 속성을 제어할 수 있습니다.
  • SpriteRenderer: SpriteRenderer의 색상 및 X 또는 Y 플립을 제어할 수 있습니다.
  • Skybox: 새로운 재질을 할당하여(무작위 또는 순차적으로) 장면의 스카이박스를 변경할 수 있습니다.
  • TextureOffset: 시간에 따라 타겟 렌더러의 재질의 텍스처 오프셋을 제어할 수 있습니다.
  • TextureScale: 시간에 따라 타겟 렌더러의 재질의 텍스처 스케일을 제어할 수 있습니다.

 

Scene

  • LoadScene: 네이티브 방법 또는 MMTools의 로딩 스크린을 사용하여 대상 씬을 로드할 수 있습니다.
  • UnloadScene: 빌드 인덱스 또는 이름을 통해 씬을 언로드할 수 있습니다.

 

Springs

  • Float Spring: float 스프링(비네트 강도, 조명, 시간 스케일 등)을 직접 또는 이벤트를 통해 제어할 수 있습니다.
  • Vector2 Spring: Vector2 스프링(텍스처 오프셋 등)을 제어할 수 있습니다.
  • Vector3 Spring: Vector3 스프링(위치, 스케일 등)을 제어할 수 있습니다.
  • Vector4 Spring: Vector4 스프링을 제어할 수 있습니다.
  • Color Spring: Color 스프링(조명 색상, 스프라이트 색상, 이미지 등)을 제어할 수 있습니다.

 

TextMesh Pro

  • TextMeshPro Font Size: TMP 글꼴 크기를 시간에 따라 수정할 수 있습니다.
  • TextMeshPro Text: 대상 TMP 텍스트 컴포넌트의 텍스트를 수정할 수 있습니다.
  • TextMeshPro Character Spacing: 시간에 따라 TMP 텍스트의 문자 간격을 변경할 수 있습니다.
  • TextMeshPro Count To: 시간에 따라 A에서 B로 이동하는 float 값이나 반올림된 값을 사용하여 대상 TMP 텍스트를 업데이트할 수 있습니다.
  • TextMeshPro Word Spacing: 시간에 따라 TMP 텍스트의 단어 간격을 변경할 수 있습니다.
  • TextMeshPro Line Spacing: 시간에 따라 TMP 텍스트의 줄 간격을 변경할 수 있습니다.
  • TextMeshPro Paragraph Spacing: 시간에 따라 TMP 텍스트의 문단 간격을 변경할 수 있습니다.
  • TextMeshPro Color: 시간에 따라 텍스트 색상을 변경할 수 있습니다.
  • TextMeshPro Alpha: 시간에 따라 텍스트 알파를 변경할 수 있습니다.
  • TextMeshPro Outline Width: 시간에 따라 텍스트의 외곽선 너비를 변경할 수 있습니다.
  • TextMeshPro Outline Color: 시간에 따라 텍스트의 외곽선 색상을 변경할 수 있습니다.
  • TextMeshPro Dilate: 텍스트 윤곽의 위치를 거리 필드에서 조정합니다.
  • TextMeshPro Softness: 텍스트 윤곽의 부드러움을 애니메이션화할 수 있습니다.
  • TextMeshPro TextReveal: 지정된 시간 동안 문자별, 단어별 또는 줄별로 대상 텍스트를 나타낼 수 있습니다.

 

Time

모든 시간 관련 피드백은 MMTimeManager API를 사용합니다. 다른 스크립트에서 timescale을 수정하려는 경우 이 API를 통해 모든 timescale 변경을 수행하는 것이 좋습니다. Time Manager는 여러 timescale을 관리하여 이미 느려진 timescale을 잠시 동안 더 느리게 하였다가 다시 복원할 수 있습니다. 이를 우회하여 timescale API에 직접 접근하면 문제를 일으킬 수 있습니다. 이를 사용하지 않으려면 전용 피드백을 만들어야 합니다.

  • Freeze Frame: 원하는 짧은 시간 동안 timescale을 일시 정지합니다. 장면에 TimeManager가 필요합니다.
  • Time Modifier: 시간에 대한 완전한 제어를 제공하여, 속도를 느리게 하거나 빠르게 할 수 있으며, 사용자 정의 가능한 보간 옵션도 포함됩니다. 또한 Change 또는 Reset 시간 변경을 트리거할 수 있어, timescale을 무기한으로 새로운 값으로 변경하거나 이전 값으로 재설정할 수 있습니다. 장면에 TimeManager가 필요합니다.

 

Transform

  • Position: 다양한 모드로 트랜스폼의 위치를 시간에 따라 조정할 수 있습니다. 예를 들어, A에서 B로 이동, 정의된 곡선을 따라 이동, 또는 지정된 목적지로 이동할 수 있습니다.
  • Rotation: 시간에 따라 트랜스폼의 회전을 조정할 수 있으며, 절대 모드, 추가 모드(재생 시작 시 현재 회전에 더함), 또는 정의된 목적지로 회전할 수 있습니다.
  • Scale: 트랜스폼의 크기를 시간에 따라 애니메이션화할 수 있습니다. Position 및 Rotation 피드백과 유사한 옵션과 설정이 포함됩니다.
  • Position Spring: 스프링을 사용하여 대상의 위치를 이동하거나 충돌시킬 수 있습니다.
  • Rotation Spring: 스프링을 사용하여 대상의 회전을 이동하거나 충돌시킬 수 있습니다.
  • Scale Spring: 스프링을 사용하여 대상의 크기를 이동하거나 충돌시킬 수 있습니다.
  • Squash & Stretch Spring: 스프링을 사용하여 대상의 크기를 눌러서 늘리거나 충돌시킬 수 있습니다.
  • Wiggle: 시간에 따라 회전, 크기 및 위치를 조정할 수 있습니다. 이를 위해 대상 객체에 MMWiggle 컴포넌트가 필요합니다.
  • Rotate Position Around: 다른 중심 객체 주위를 회전시킬 수 있으며, 모든 축을 완전히 제어할 수 있습니다.
  • DestinationTransform: 트랜스폼의 모든 속성(위치, 회전, 크기)을 대상 트랜스폼의 속성에 맞게 애니메이션화할 수 있습니다.
  • SquashAndStretch: 한 축의 크기를 수정하면서 다른 두 축(또는 하나의 축)이 질량을 유지하도록 자동으로 수정합니다.
  • Position Shake: 대상 위치 셰이커를 활성화할 수 있습니다. 셰이커는 지정된 시간 동안 대상 객체의 위치를 지정된 범위와 방향 내에서 이동시킵니다. 흔들림의 무작위성과 시간에 따른 감쇠를 제어할 수 있습니다. 이를 위해 하나 이상의 MMPositionShaker가 필요합니다.
  • Rotation Shake: 대상 회전 셰이커를 활성화할 수 있습니다. 셰이커는 지정된 시간 동안 대상 객체의 회전을 지정된 범위와 방향 내에서 이동시킵니다. 흔들림의 무작위성과 시간에 따른 감쇠를 제어할 수 있습니다. 이를 위해 하나 이상의 MMRotationShaker가 필요합니다.
  • Scale Shake: 대상 크기 셰이커를 활성화할 수 있습니다. 셰이커는 지정된 시간 동안 대상 객체의 크기를 지정된 범위와 방향 내에서 이동시킵니다. 흔들림의 무작위성과 시간에 따른 감쇠를 제어할 수 있습니다. 이를 위해 하나 이상의 MMScaleShaker가 필요합니다.
  • Look At: 트랜스폼을 회전시켜 다른 대상 트랜스폼(또는 방향, 특정 세계 좌표)을 바라보게 할 수 있으며, 선택적인 축 잠금 및 이벤트/셰이커 지원이 포함됩니다. 이를 위해 대상에 MMLookAtShaker가 필요합니다.
  • Set Parent: 대상 트랜스폼의 부모 트랜스폼을 변경할 수 있습니다.

 

UI Toolkit

UI Toolkit 피드백은 대부분 다른 피드백처럼 작동하지만, Unity 시스템의 구조로 인해 사용하기 전에 알아야 할 몇 가지 사항이 있습니다:

  • UI Toolkit이 모든 Unity 에디터 버전에서 동일하게 지원되지 않기 때문에, 이 피드백과 관련된 데모는 에셋 내 UnityPackage로 제공되며, 이를 먼저 추출해야 합니다. 프로젝트 패널에서 FeelUIToolkitPackage unitypackage을 검색하고, 두 번 클릭하여 내용을 가져오십시오.
  • 모든 UI Toolkit 피드백에 대해, TargetDocument 필드에 UIDocument를 지정하고, QueryMode(이름 또는 클래스 중 선택)를 선택한 다음, Query(영향을 미칠 객체를 찾기 위해 UI 문서에서 찾을 요소 이름 또는 클래스 이름)를 정의해야 합니다. 이는 하나 이상의 요소를 반환해야 합니다. 쿼리가 둘 이상의 요소를 반환하면, 모든 요소가 피드백의 영향을 받습니다.
  • FeelUIToolkitFeedbacksDemo 씬을 확인해보세요. 이 씬은 모든 피드백을 실제로 보여줍니다.
  • Background Color: 시간에 따라 배경색을 보간합니다.
  • Border Color: 시간에 따라 테두리 색상을 제어합니다.
  • Border Radius: 시간에 따라 UI 요소의 테두리 반경을 변경합니다.
  • Border Width: 시간에 따라 요소의 테두리 너비를 변경합니다.
  • Class: 대상 UI 요소의 클래스를 수정할 수 있습니다.
  • Font Size: 대상 UI 요소의 글꼴 크기를 변경합니다.
  • Image Tint: 대상 이미지의 색조를 변경합니다.
  • Opacity: 시간에 따라 시각적 요소의 불투명도를 변경합니다.
  • Rotate: 하나 이상의 대상 시각적 요소를 회전시킵니다.
  • Scale: 하나 이상의 대상 시각적 요소의 크기를 변경합니다.
  • Size: 하나 이상의 대상 시각적 요소의 크기를 변경합니다.
  • Stylesheet: UI 문서에 새로운 스타일시트를 첨부합니다.
  • Text: 텍스트를 새로운 텍스트로 교체합니다.
  • TextColor: 시간에 따라 텍스트 색상을 변경합니다.
  • Transform Origin: 회전, 스케일링 및 변환이 발생하는 원점을 이동할 수 있습니다.
  • Translate: UI 요소를 변환합니다.
  • Visible: 시각적 요소의 가시성을 켜고 끌 수 있습니다.

URP Volume

모든 URP 볼륨 피드백은 Volume에 해당하는 URP 셰이커가 필요합니다. URP 작업 시 URP 버전의 셰이더 및 피드백을 선택해야 합니다. 그렇지 않으면 작동하지 않습니다.

  • Bloom URP: 시간에 따라 블룸 강도를 제어합니다.
  • Chromatic Aberration URP: 시간에 따라 색수차 강도를 제어합니다.
  • Color Adjustments URP: 노출, 채도, 색조 이동, 대비 등 다양한 색상 조정 옵션을 사용할 수 있습니다.
  • Depth of Field URP: 시간에 따라 피사계 심도 매개변수를 제어합니다.
  • Global PP Volume Auto Blend URP: 포스트 프로세싱 볼륨의 가중치를 트윈합니다.
  • Lens Distortion URP: 필요에 따라 렌즈 왜곡을 적용합니다.
  • Motion Blur URP: 시간에 따라 모션 블러 수준을 제어합니다.
  • Panini Projection URP: 시간에 따라 파니니 프로젝션의 거리 및 자르기 값을 조정합니다.
  • Vignette URP: 시간에 따라 비네트 매개변수를 제어합니다.
  • White Balance URP: 시간에 따라 화이트 밸런스 매개변수를 제어합니다.

 

UI

  • ImageRaycastTarget: 대상 이미지의 RaycastTarget 매개변수를 제어하여 재생 시 켜거나 끌 수 있습니다.
  • CanvasGroup: 시간에 따라 CanvasGroup의 알파를 제어합니다.
  • CanvasGroupBlocksRaycasts: 재생 시 대상 CanvasGroup의 BlocksRaycast 매개변수를 켜거나 끌 수 있습니다.
  • Graphic: 시간에 따라 대상 그래픽의 색상을 변경할 수 있습니다.
  • Graphic CrossFade: 대상 그래픽에서 크로스 페이드를 트리거할 수 있습니다.
  • Image: 시간에 따라 이미지의 색상을 조정할 수 있습니다.
  • Image Alpha: 시간에 따라 이미지의 알파를 조정할 수 있습니다.
  • Image Fill: 시간에 따라 이미지의 채우기를 조정할 수 있습니다.
  • Image Texture Offset: 시간에 따라 이미지의 텍스처 오프셋을 애니메이션화합니다.
  • Image Texture Scale: 시간에 따라 이미지의 텍스처 스케일을 애니메이션화합니다.
  • Raycast Target: 대상 이미지의 RaycastTarget 매개변수를 제어하여 재생 시 켜거나 끌 수 있습니다.
  • RectTransformAnchor: 시간에 따라 RectTransform의 최소 및 최대 앵커 위치를 제어합니다.
  • RectTransformPivot: 시간에 따라 RectTransform의 피벗 위치를 제어합니다.
  • RectTransformOffset: RectTransform의 왼쪽 하단 앵커와의 상대적 오프셋 및 오른쪽 상단 앵커와의 상대적 오프셋을 제어할 수 있습니다.
  • RectTransformSizeDelta: 시간에 따라 앵커 간의 거리와 상대적인 크기를 애니메이션화합니다.
  • Floating Text: 플로팅 텍스트(주로 데미지 텍스트)를 쉽게 생성할 수 있습니다.
  • Text: 대상 텍스트의 내용을 제어합니다.
  • TextColor: 시간에 따라 대상 텍스트의 색상을 변경할 수 있습니다.
  • TextFontSize: 시간에 따라 대상 텍스트의 글꼴 크기를 변경할 수 있습니다.
  • VideoPlayer: 비디오 플레이어를 다양한 방식으로 제어할 수 있습니다(재생, 일시 정지, 토글, 중지, 준비, 앞으로/뒤로 단계, 재생 속도 설정, 직접 오디오 볼륨 설정, 직접 오디오 음소거 설정, 프레임으로 이동, 루프 토글).

 

Various(기타)

  • Light: 시간에 따라 조명의 강도와 색상을 완전히 제어할 수 있습니다.
  • Light 2D: 시간에 따라 URP 2D 조명의 강도와 색상(및 기타)을 완전히 제어할 수 있습니다.

 

Debug

  • DebugBreak: 피드백이 재생될 때 Debug.Break()를 발생시킵니다.
  • DebugComment: 인스펙터에 텍스트를 저장할 수 있으며, 피드백을 특정 방식으로 설정한 이유를 기록하는 데 유용합니다. 선택적으로 콘솔에 출력할 수도 있습니다.
  • DebugLog: 다양한 방법(MMDebug, 경고, 오류, 로그 등)을 사용하여 콘솔에 디버그 메시지를 출력할 수 있습니다.

 

추가 정보

리스트는 계속해서 확장되고 있으며, 제안도 환영합니다. 아이디어가 있다면 언제든지 연락 주세요! 또한, DOTween 또는 Unity의 2D 조명 시스템과 관련된 피드백을 포함한 공개 기여 리포지토리도 확인해보세요.

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

Screen Shakes  (0) 2024.07.10
Creating a new feedback  (0) 2024.07.09
The MMF_Player component  (0) 2024.07.09
Core concepts(핵심 개념)  (0) 2024.07.08
Getting started  (0) 2024.07.06

요약: 이 페이지는 새로운 MMF_Player 시스템이 무엇인지 그리고 이를 어떻게 사용하는지 설명합니다.

테이블 내용
  • MMF_Player란 무엇인가?
  • 명명 규칙
  • 컨트롤
  • 설정
  • 런타임 변경 유지
  • MMF_Player 중지
  • 이벤트
  • 템플릿
  • 편의성
  • 런타임에 피드백 값 수정
  • 런타임에 피드백 추가 및 제거
  • 런타임에 플레이어와 피드백 생성
  • 모든 피드백이 재생된 후 코드 실행
  • 기존 MMFeedback 스크립트를 새로운 시스템으로 변환 (v3.0 이전)

 

https://www.youtube.com/watch?v=wef688wkbPc&t=1s

 

MMF_Player란 무엇인가?

MMF_Player는 게임에 생동감을 추가하기 위해 상호작용하는 주요 구성 요소입니다. 이를 사용하려면 빈 게임 객체를 생성하고 MMF_Player 구성 요소를 추가하십시오. 인스펙터에서 여러 일반 설정을 할 수 있으며, "새 피드백 추가" 드롭다운을 사용하여 피드백을 추가하고 조정할 수 있습니다. 피드백은 가장 왼쪽 아이콘을 드래그하여 순서를 변경할 수 있으며, 접거나 펼치거나 개별적으로 비활성화할 수 있고, 라벨 필드를 편집하여 이름을 변경하거나 오른쪽 드롭다운을 사용하여 제거 및 복사할 수 있습니다.

MMF Player 인스펙터

피드백을 몇 개 추가한 후에는 이러한 피드백을 재생하고 싶을 것입니다. 이를 수행하는 두 가지 간단한 방법이 있습니다(다르게 할 수도 있습니다):

  • Unity 이벤트를 통해: 버튼이나 이벤트를 사용하는 다른 구성 요소에서 MMF_Player 객체를 이벤트 슬롯에 드래그 앤 드롭하고 PlayFeedbacks 메서드를 바인딩합니다. 해당 이벤트가 발생할 때마다 피드백이 재생됩니다.
  • 코드를 통해: 피드백을 추가하려는 클래스에서 public MMF_Player 변수를 선언하고 인스펙터에서 새로 만든 MMF_Player 객체에 바인딩합니다. 코드에서 피드백이 발생하기를 원하는 위치에 PlayFeedbacks 메서드를 호출합니다. 또한 Initialization, StopFeedbacks 및 ResetFeedbacks 메서드를 호출할 수도 있습니다.

다음 예제는 플레이어가 점프하도록 하는 클래스가 MMF_Player를 사용하여 이를 개선하는 방법을 보여줍니다:

using UnityEngine;
using MoreMountains.Feedbacks;

public class CharacterJump : MonoBehaviour
{
    // CharacterJump 인스펙터에서 설정할 public MMF_Player 참조를 선언합니다
    public MMF_Player JumpFeedback;

    public void Jump()
    {
      // 여기에서 점프 코드를 작성합니다
      JumpFeedback.PlayFeedbacks();
    }
}

런타임에 디버그 모드에서 직접 인스펙터의 하단 버튼 바를 통해 Initialize, Play, Stop 및 Reset 메서드를 테스트할 수 있다는 점에 유의하십시오. 각 피드백의 제목 바 오른쪽에 있는 드롭다운을 통해 개별적으로 테스트할 수도 있습니다.
각 피드백의 인스펙터에는 타이밍 드롭다운이 있습니다. 이를 통해 초기 지연, 쿨다운 지속 시간(해당 피드백의 두 번의 재생 사이의 최소 시간) 및 반복 옵션과 같은 항목을 미세 조정할 수 있습니다.
각 피드백에는 0에서 100까지의 Chance 슬라이더도 있습니다. 이는 피드백이 재생될 때 실제로 발생할 확률을 나타냅니다. 100은 항상 발생함을 의미하고, 0은 절대 발생하지 않음을 의미하며, 25는 4번 중 한 번 발생함을 의미합니다.


명명 규칙

두 가지 주요 클래스에 대해 알아야 합니다: 피드백을 재생할 수 있는 MMF_Player와 개별 기본 클래스인 MMF_Feedback입니다. MMF_Player는 MMF_Feedback 목록을 재생합니다.

피드백은 일반적으로 MMF_Something으로 명명됩니다.

Feel의 3.0 이전 버전에서 MMF_Player의 전신은 MMFeedbacks로 불렸습니다. 따라서 오래된 비디오를 볼 때는 MMFeedbacks를 MMF_Player로 바꾸면 되며, 나머지는 동일하게 적용됩니다.


컨트롤

각 MMF_Player 구성 요소의 하단에서 일반적인 컨트롤을 찾을 수 있습니다:

MMF_Player 컨트롤 패널

 

  • 새 피드백 추가 : 목록에 추가할 새 MMF_Player를 선택할 수 있는 드롭다운을 엽니다.
  • 모두 복사 : 모든 피드백을 복사합니다. 그런 다음 이 섹션에 나타나는 버튼을 통해 다른 MMF_Player에 붙여넣을 수 있습니다. 이는 피드백을 하나에서 다른 것으로 복사하는 유일하게 권장되는 방법입니다. Unity의 "구성 요소 값 복사" 기능을 사용하지 마십시오.
  • Initialize, Play, Stop, Skip, Restore, Reset, Revert : 테스트 목적으로 해당 MMF_Player에 해당 메서드를 호출합니다. 이들 중 대부분은 런타임에서만 사용할 수 있습니다.
  • Playmode 변경 사항 유지 : 런타임 중 이 버튼을 누르면 재생 시간이 끝날 때 이 MMF_Player에 대한 변경 사항이 유지됩니다.

 

설정

각 MMF_Player의 상단에는 접을 수 있는 설정 섹션이 있으며, 여기에서 MMF_Player 수준에서 적용되는 설정을 조정할 수 있습니다.

MMF_Player 설정 패널

초기화:

  • 초기화 모드: 가능한 초기화 모드입니다. 스크립트를 사용하는 경우 Initialization 메서드를 호출하고 소유자를 전달하여 수동으로 초기화해야 합니다. 그렇지 않으면 이 구성 요소는 Awake 또는 Start 시에 자체적으로 초기화할 수 있으며, 이 경우 소유자는 MMF_Player 자체가 됩니다. 대부분의 경우 Start를 선택하면 됩니다.
  • 시작 시 자동 재생: 씬이 시작될 때 이 MMF_Player가 재생될지 여부를 설정합니다.
  • 활성 시 자동 재생: 이 MMF_Player가 활성화될 때 재생될지 여부를 설정합니다.
  • 자동 초기화: 이 값을 true로 설정하면 시스템은 가능한 최적의 시간에 이 플레이어를 재생하기 전에 자동으로 초기화하려고 시도합니다.

방향:

  • 방향: 피드백이 재생될 순서를 정의합니다. 기본적으로는 위에서 아래로 재생되지만, 아래에서 위로 재생되도록 설정할 수도 있습니다.
  • 끝날 때 자동 방향 변경: 모든 피드백이 재생된 후 이 MMF_Player가 자동으로 방향을 반대로 변경할지 여부를 설정합니다.

강도:

  • 피드백 강도: 이 피드백을 재생할 강도를 설정합니다. 대부분의 피드백은 이 값을 사용하여 진폭을 조정합니다. 1은 정상, 0.5는 절반의 강도, 0은 효과 없음입니다. 이 값이 제어하는 것은 피드백마다 다르므로 정확한 동작을 확인하려면 코드를 확인하십시오.

 

타이밍:

  • TimeScale 모드 강제: 이 옵션을 선택하면 이 플레이어의 모든 피드백이 스케일된 시간 또는 스케일되지 않은 시간으로 실행되도록 강제할 수 있습니다.
  • 지속 시간 배수: 모든 피드백 지속 시간(초기 지연, 지속 시간, 반복 간 지연)에 적용되는 시간 배수입니다.
  • 지속 시간 무작위화: 각 피드백의 지속 시간에 대해 최소(x) 및 최대(y) 값 사이에서 무작위 배수를 적용할 수 있습니다.
  • 전체 지속 시간 세부 정보 표시: 이 값이 true이면 에디터 전용의 자세한 정보가 지속 시간 슬롯에 피드백별로 표시됩니다.
  • 쿨다운 지속 시간: 한 번 재생된 후 이 MMF_Player의 새로운 재생을 트리거할 수 없는 지속 시간(초)입니다.
  • 초기 지연: 이 MMF_Player의 내용을 재생하기 시작하기 전에 지연할 시간(초)입니다.
  • 재생 확률: 명령을 받았을 때 이 플레이어가 실제로 재생될 확률(%)입니다.
  • 플레이어 TimeScale 모드: 피드백 시퀀스를 재생하는 동안 플레이어가 실행되는 시간 스케일입니다.

범위:

  • 범위 내에서만 재생: 이 값이 true이면 다음 범위 설정이 이 플레이어의 재생 여부를 결정하는 데 사용됩니다.
  • RangeCenter: 범위 값을 계산할 때 고려할 변환입니다. 일반적으로 플레이어 캐릭터 또는 메인 카메라일 수 있습니다.
  • RangeDistance: 피드백이 범위 내에 있는 것으로 간주되는 RangeCenter로부터의 거리(단위)입니다.
  • RangeFalloff 사용: RangeFallOff 곡선을 기반으로 피드백의 강도를 수정할지 여부를 설정합니다. 이를 통해 범위 중심에서 멀어질수록 피드백 강도를 점점 낮출 수 있습니다.
  • 범위 이벤트 무시: MMSetFeedbackRangeCenterEvent를 무시할지 여부를 설정합니다. 이 이벤트는 어디서든 RangeCenter를 설정하는 데 사용됩니다.

재생 설정:

  • 재생 가능 여부: 이 값이 false이면 이 플레이어는 시퀀스를 재생할 수 없습니다.
  • 이미 재생 중일 때 재생 가능 여부: 이 값을 선택 해제하면 개별 피드백이 재생 중일 때 이 피드백이 재생되지 않도록 합니다. 이는 피드백이 자체적으로 재생되지 않도록 하려는 경우에 유용합니다.
  • 성능 모드: 이 모드는 플레이어의 인스펙터 렌더링에 대한 에디터 비용을 줄여 게임의 리소스를 확보합니다. 이는 에디터 외부에는 영향을 미치지 않으며, 빌드에서는 성능이 이미 최적화되어 있습니다.
  • 비활성 시 피드백 강제 중지: 이 값이 true이면 플레이어를 비활성화할 때 항상 StopFeedbacks가 자동으로 호출됩니다.

이벤트:

  • MMFeedbacks 이벤트 트리거: 이 MMF_Player가 MMFeedbacksEvents를 발생시킬지 여부를 설정합니다. MMFeedbacksEvents는 모든 클래스에서 수신할 수 있는 이벤트 유형입니다.
  • Unity 이벤트 트리거: 이 MMF_Player가 일반 Unity 이벤트를 발생시킬지 여부를 설정합니다. 인스펙터의 이벤트 슬롯을 사용하여 바인딩합니다.
  • OnPlay: 이 이벤트는 MMF_Player가 재생될 때마다 발생합니다.
  • OnPause: 이 이벤트는 MMF_Player가 일시 중지될 때마다 발생합니다.
  • OnResume: 이 이벤트는 MMF_Player가 다시 시작될 때마다 발생합니다.
  • OnRevert: 이 이벤트는 MMF_Player가 되돌아갈 때마다 발생합니다(일반적으로 AutoChangeDirectionOnEnd가 true일 때 자동으로 재생이 끝날 때 또는 Revert() 메서드를 호출할 때 발생합니다).
  • OnComplete: 이 이벤트는 MMF_Player가 마지막 피드백을 재생할 때마다 발생합니다.

 

런타임 변경 유지

MMF_Player를 사용하면 런타임 변경 사항을 쉽게 유지하고 워크플로를 가속화할 수 있습니다. 이를 수행하는 두 가지 주요 방법이 있습니다:

  • MMF_Player 인스펙터 하단의 Playmode 변경 사항 유지 버튼을 누릅니다. 재생 모드를 종료하면 변경 사항이 저장됩니다.
  • 런타임 동안 언제든지 모두 복사 버튼을 사용하고, 재생 모드를 종료한 후 모두 교체 버튼을 사용하여 복사한 값으로 모든 피드백을 교체합니다.

Playmode 변경 사항 유지 버튼

 

이 버튼을 사용하면 MMF_Player에 대한 모든 변경 사항이 유지됩니다. 여기에는 추가/제거된 피드백 또는 피드백 내의 값 변경이 포함됩니다. 각 피드백 오른쪽의 작은 점 3개를 클릭하여 개별 피드백을 복사할 수도 있습니다.

잠재적인 실수를 방지하기 위해, "Playmode 변경 사항 유지" 모드는 재생 모드를 종료할 때마다 자동으로 비활성화됩니다. 이 동작을 변경하려면 (일부 사람들은 위험을 감수하는 것을 좋아합니다) MMF_PlayerConfiguration 설정을 편집하여 가능합니다. 프로젝트에서 "MMF_PlayerConfiguration"을 찾아 인스펙터에서 AutoDisableKeepPlaymodeChanges의 선택을 해제하십시오.

 

MMF_Player 중지

위 섹션에서 설명한 바와 같이, MMF_Player는 StopFeedbacks() 메서드를 호출할 수 있습니다. 기본적으로 이 메서드는 전체 시퀀스 재생을 중지하며, 그 당시 재생 중이던 개별 피드백도 중지합니다. 예를 들어, UI 아이콘을 A에서 B로 이동시키는 Position MMFeedback을 포함한 MMF_Player가 있고, StopFeedbacks()를 호출하면 해당 아이콘은 이동을 멈춥니다. 시퀀스만 중지하고 내용은 중지하지 않으려면 StopFeedbacks(false)를 호출하면 됩니다. 이렇게 하면 시퀀스는 중지되지만, UI 예시에서는 아이콘이 B 목적지까지 이동하게 됩니다. 마지막으로, 각 피드백의 Timing 설정 드롭다운 아래에서 InterruptsOnStop 체크박스를 통해 피드백 수준에서 이를 조정할 수 있습니다. 이 값을 false로 설정하면 피드백이 Stop 명령을 무시하고 실행을 완료합니다. StopFeedbacks()의 동작을 제어하는 이 세 가지 방법의 조합을 통해 원하는 모든 설정을 만들 수 있습니다.


이벤트

MMF_Player 구성 요소는 사이클의 특정 단계(Play, Pause, Resume, Revert, Complete)에서 이벤트를 트리거할 수 있습니다. 인스펙터의 끝 부분에 이벤트 접기 섹션이 있으며, 이를 통해 특정 MMF_Player가 MMFeedbacksEvents를 트리거할지 여부와 "일반" Unity 이벤트를 트리거할지 여부를 정의할 수 있습니다.

그런 다음 다른 Unity 이벤트와 마찬가지로 인스펙터 이벤트 슬롯에 원하는 항목을 연결할 수 있습니다.

코드를 통해 MMFeedbacksEvents를 수신할 수도 있습니다. 다음과 같이 하면 됩니다:

using UnityEngine;
using MoreMountains.Feedbacks;
using MoreMountains.Tools;

public class OnCompleteTest : MonoBehaviour
{
    // MMFeedbacks 이벤트를 수신하는 메서드입니다.
    public void OnMMFeedbacksEvent(MMFeedbacks source, MMFeedbacksEvent.EventTypes type)
    {
        switch (type)
        {
            // 이벤트 타입이 Complete일 때 실행됩니다.
            case MMFeedbacksEvent.EventTypes.Complete:
                Debug.Log("The feedback "+source.name+" just completed.");
                break;
        }
    }

    // 컴포넌트가 활성화될 때 이벤트를 등록합니다.
    private void OnEnable()
    {
        MMFeedbacksEvent.Register(OnMMFeedbacksEvent);  
    }
    // 컴포넌트가 비활성화될 때 이벤트를 등록 해제합니다.
    private void OnDisable()
    {
        MMFeedbacksEvent.Unregister(OnMMFeedbacksEvent);  
    }
}

보시다시피, 이 간단한 클래스는 활성화될 때 이러한 이벤트를 등록하고 비활성화될 때 등록을 해제합니다. 그런 다음, 어디서든 이러한 이벤트가 발생할 때마다 OnMMFeedbacksEvent 메서드가 이를 수신하여 이벤트의 소스 및 타입을 사용하여 원하는 작업을 수행할 수 있습니다. 이 예에서는 완료 이벤트를 필터링하고 이를 발생시킨 MMFeedbacks의 이름을 표시하고 있습니다.


템플릿

이제 언제든지 피드백을 복사하고, 하나의 플레이어에서 다른 플레이어로 쉽게 복사할 수 있으므로 프로젝트의 다양한 부분에서 재사용할 "템플릿"을 쉽게 만들 수 있습니다.

이를 수행하는 방법은 여러 가지가 있습니다. 권장되는 방법은 Unity의 프리셋 시스템을 사용하는 것입니다. 새로운 프리셋을 만드는 방법은 매우 간단합니다:

  • 프리셋으로 사용하고자 하는 피드백 목록을 이미 포함하고 있는 MMF_Player를 선택합니다.
  • 프리셋 버튼을 누르면(아래 이미지를 참조) 팝업이 열리고, 팝업 왼쪽 하단에 있는 "현재 상태 저장" 버튼을 클릭합니다.
  • 프리셋을 저장할 프로젝트 내의 위치를 선택하고 이름을 지정합니다.
  • 이제, 어떤 MMF_Player에서도 프리셋 버튼을 클릭하여 저장한 프리셋 중 하나를 불러올 수 있으며, 그러면 MMF_Player의 피드백 목록이 즉시 교체됩니다. 실수로 이 작업을 수행한 경우 Ctrl+Z를 눌러 이전 상태로 되돌릴 수 있습니다.

프리셋 버튼

프리팹(prefab)을 사용하여 MMF_Player에 피드백 스택을 "저장"하고 거기서 복사할 수도 있습니다. 데모 전체에서 이러한 프리팹의 예제를 찾을 수 있습니다. 여기서는 정규 프리팹을 템플릿의 저장 공간으로 사용하고 있습니다. 물론 이러한 프리팹을 정규 프리팹으로 사용할 수도 있지만, 새 피드백 플레이어를 처음부터 만들지 않고도 생성하고 싶을 수 있습니다. 프로젝트에서 템플릿을 선택하고, 모두 복사 버튼을 사용하여 모든 피드백을 복사한 다음, 원하는 곳에 새로운 MMF_Player를 생성하고 붙여넣기만 하면 됩니다. 시스템은 피드백이 올바르게 작동하기 위해 바인딩해야 하는 모든 위치를 작은 경고를 통해 알려줍니다. 이는 일부 워크플로에서 시간을 절약하는 데 매우 유용할 수 있습니다!


편의성

인스펙터의 다양한 지원 기능

 

MMF_Player는 설정을 더 안전하고 쉽게 만들 수 있는 여러 가지 편의 기능을 제공합니다. 위 이미지에서 볼 수 있듯이 피드백이 바인딩되지 않은 경우, 목록에 작은 경고 아이콘이 표시되며, 피드백을 확장하면 수정해야 할 내용을 알려주는 텍스트 영역이 나타납니다. 수정이 필요한 피드백 섹션에도 동일한 경고 아이콘이 표시됩니다.

피드백에는 이제 다양한 섹션을 구분하는 인스펙터 그룹이 있으며, 모든 피드백에 공통으로 포함된 "피드백 설정" 섹션이 있습니다. 각 섹션을 접거나 펼칠 수 있으며, 기본적으로 이러한 그룹이 접히거나 확장되도록 구성 스크립터블 오브젝트에서 설정을 조정할 수 있습니다.

섹션이 접혀 있을 때는 관련된 경우(대상, 채널 등) 지속 시간 옆에 추가 정보가 표시됩니다. 이는 동일한 유형의 피드백을 구별하는 데 도움이 될 수 있습니다. 또한 피드백 설정 섹션에서 피드백별로 고유한 배경색을 정의할 수 있습니다.

각 피드백에는 컨텍스트 메뉴(오른쪽에 있는 세로로 된 작은 점 3개)가 있어 피드백을 재생, 복사, 붙여넣기, 복제 또는 제거할 수 있습니다.


런타임에 피드백 값 수정

MMF Player 내부의 피드백에 접근한 후, 해당 피드백의 필드를 수정하려면 GetFeedbackOfType 또는 GetFeedbacksOfType 메서드를 사용할 수 있습니다:

// 해당 MMF_Player에서 첫 번째 MMF_Scale을 반환합니다.
MMF_Scale scaleFeedback = MyTargetMMFPlayer.GetFeedbackOfType<MMF_Scale>();

// 해당 MMF_Player에서 모든 MMF_Scale의 목록을 반환합니다.
List<MMF_Scale> scaleFeedbacks = MyTargetMMFPlayer.GetFeedbacksOfType<MMF_Scale>();

// 해당 MMF_Player에서 라벨이 "MyCustomLabel"과 일치하는 첫 번째 MMF_Scale을 반환합니다.
MMF_Scale scaleFeedback = MyTargetMMFPlayer.GetFeedbackOfType<MMF_Scale>("MyCustomLabel");

// 해당 MMF_Player에서 라벨이 "MyCustomLabel"과 일치하는 모든 MMF_Scale의 목록을 반환합니다.
List<MMF_Scale> scaleFeedbacks = MyTargetMMFPlayer.GetFeedbacksOfType<MMF_Scale>("MyCustomLabel");

변경하고자 하는 피드백(또는 피드백들)에 대한 참조를 얻은 후, 이러한 값을 수정하는 것은 다른 구성 요소에서와 마찬가지로 수행됩니다:

// LookAt 피드백을 가져와서 지속 시간을 5초로 변경합니다.
MMF_LookAt lookAtFeedback = MyTargetMMFPlayer.GetFeedbackOfType<MMF_LookAt>();
lookAtFeedback.Duration = 5f;

// 대상 MMF Player의 모든 LookAt 피드백을 가져와서 지속 시간을 5초로 설정합니다.
foreach (var lookAtFeedback in myPlayer.GetFeedbacksOfType<MMF_LookAt>())
{
  lookAtFeedback.Duration = 5f;
}

런타임에 타이밍/지속 시간 관련 값을 수정한 경우, 재생하기 전에 MMF Player에서 ComputeCachedTotalDuration을 호출해야 합니다. 다음과 같이 할 수 있습니다:

MyTargetMMFPlayer.ComputeCachedTotalDuration();


런타임에 피드백 추가 및 제거

런타임에 스크립트에서 피드백을 추가하고 제거하는 것이 매우 쉬워졌습니다.

피드백을 추가하는 주요 방법은 두 가지가 있습니다.

위의 모든 예제에서는 기존 MMF_Player에 대한 참조가 있다고 가정합니다. 예를 들어 다음과 같이 선언할 수 있습니다:

public MMF_Player MyTargetMMFPlayer;

피드백을 추가하는 첫 번째 방법은 구성 요소를 추가하는 방식과 매우 유사하며, 추가하려는 피드백의 유형을 지정하기만 하면 됩니다. 이렇게 하면 추가된 MMF_Feedback이 반환되므로 이후에도 계속 상호작용할 수 있습니다:

MyTargetMMFPlayer.AddFeedback(typeof(MMF_Scale));

해당 메서드의 두 번째 시그니처를 사용하면 피드백을 생성하고 선택적으로 사용자 지정할 수 있습니다. 여기에서는 예를 들어 새 스케일 피드백을 생성하고, 레이블과 지속 시간을 사용자 지정 값으로 설정하여 대상 MMF_Player에 추가하고 있습니다:

MMF_Scale scale = new MMF_Scale();
scale.Label = "MyCustomLabel";
scale.AnimateScaleDuration = 15f;
MyTargetMMFPlayer.AddFeedback(scale);

물론 피드백을 제거할 수도 있습니다. 목록에서 해당 피드백의 인덱스를 지정하기만 하면 됩니다. 여기에서는 목록에서 두 번째 피드백을 제거하고 있습니다:

MyTargetMMFPlayer.RemoveFeedback(1);


런타임에 플레이어와 피드백 생성

런타임에 피드백을 추가하고 제거하는 것도 멋지지만, Feel은 전체 플레이어를 동적으로 생성할 수 있게 해줍니다. 이를 보여주기 위해, 여러 큐브를 순차적으로 스케일링하고 각 큐브 사이에 약간의 일시 정지를 두는 MMF Player를 만들어 보겠습니다.

먼저 새로운 빈 씬을 생성하고, 빈 게임 객체를 추가한 다음, 해당 객체의 이름을 "DynamicCreator"로 변경합니다. 그런 다음 큐브를 생성하고 DynamicCreator 객체에 자식으로 추가합니다. 이제 큐브를 원하는 만큼 복제하고(여전히 빈 객체에 자식으로 추가), 큐브들을 약간 이동시킵니다. 장면은 다음과 같이 보일 것입니다:

프리셋 버튼


이제 프로젝트 내의 아무 곳에나 새 클래스를 생성하고 이름을 DynamicPlayerCreator로 지정합니다. IDE에서 해당 클래스를 열고 다음 내용으로 교체합니다:

using MoreMountains.Feedbacks;
using MoreMountains.Tools;
using UnityEngine;

/// <summary>
/// 이 테스트 클래스는 이 객체의 자식 수만큼 스케일 피드백을 포함하는 MMF Player를 자동으로 생성합니다.
/// 테스트 방법:
/// - 새 씬을 만들고, 그 안에 새 객체를 생성합니다. 이 컴포넌트를 해당 객체에 추가합니다.
/// - 여러 큐브를 생성하고 원하는 위치에 배치한 다음, 이 객체의 자식으로 설정합니다.
/// - 에디터에서 재생을 누르고, 이 컴포넌트의 인스펙터에서 "Create" 버튼을 누릅니다.
/// </summary>
public class DynamicPlayerCreator : MonoBehaviour
{
	// Create 메서드를 트리거하기 위한 인스펙터 테스트 버튼
	[MMInspectorButton("Create")] public bool CreateBtn;

	private void Create()
	{
		// MMF Player를 생성합니다.
		MMF_Player newPlayer = this.gameObject.AddComponent<MMF_Player>();
		// 생성한 후 이 MMF Player를 재생할 것이므로 수동으로 초기화합니다.
		// 이렇게 하면 Start 시 초기화 메서드가 실행되지 않도록 합니다.
		newPlayer.InitializationMode = MMFeedbacks.InitializationModes.Script;

		if (transform.childCount == 0)
		{
			Debug.LogWarning("[DynamicCreation test class] 이 클래스를 테스트하려면 여러 큐브를 생성하고 임의로 배치한 다음, 이 객체의 자식으로 설정하세요.");
			return;
		}

		// 각 자식 변환에 대해
		for (int i = 0; i < transform.childCount; i++)
		{
			Transform childTransform = transform.GetChild(i);

			// 새로운 스케일 피드백을 생성하고, 타겟을 설정한 다음, 플레이어에 추가합니다.
			MMF_Scale newScaleFeedback = new MMF_Scale();
			newScaleFeedback.Label = "Scale child " + i;
			newScaleFeedback.AnimateScaleTarget = childTransform;
			newPlayer.AddFeedback(newScaleFeedback);

			// 새로운 일시 정지 피드백을 생성하고, 일시 정지 시간을 정의한 다음, 플레이어에 추가합니다.
			MMF_Pause newPauseFeedback = new MMF_Pause();
			newPauseFeedback.Label = "Pause " + i;
			newPauseFeedback.PauseDuration = 0.2f;
			newPlayer.AddFeedback(newPauseFeedback);
		}

		// 플레이어를 초기화하고 재생합니다.
		newPlayer.Initialization();
		newPlayer.PlayFeedbacks();
	}
}

이제 새로 생성한 컴포넌트를 DynamicPlayerCreator 객체에 추가하세요. 재생을 누른 다음, DynamicPlayerCreator 인스펙터에서 Create 버튼을 누릅니다. 이는 위의 Create 메서드를 실행하여 MMF Player를 생성하고, 각 큐브에 대해 스케일 피드백과 일시 정지 피드백을 추가 및 설정한 다음, 플레이어를 초기화하고 재생합니다. 작은 큐브들이 차례대로 튀어오르는 것을 볼 수 있을 것입니다. 동일한 로직(마지막의 Initialization 및 PlayFeedbacks 호출 제외)을 사용하여 재생 모드 외부에서도 피드백을 자동으로 설정할 수 있습니다.


모든 피드백이 재생된 후 코드 실행

MMF Player는 재생, 일시 정지, 재개, 되돌림 및 완료 시 이벤트를 수신할 수 있습니다. 마지막 이벤트를 사용하여 플레이어가 완료되면 코드를 실행할 수 있습니다.

또한, Unity Events를 훅으로 사용할 수 있으며, 이는 플레이어의 설정 폴드아웃 아래에서 찾을 수 있습니다. 물론 인스펙터에서 메서드를 바인딩할 수 있지만, 코드에서도 이를 훅으로 사용할 수 있습니다:

using MoreMountains.Feedbacks;
using MoreMountains.Tools;
using UnityEngine;

public class Test : MonoBehaviour
{
	public MMF_Player MyPlayer;

	// MMF_Player가 피드백 재생을 완료했을 때 호출되는 메서드
	void OnPlayerComplete()
	{
		MMDebug.DebugLogTime("The MMF_Player is done playing its feedbacks.");
	}

	// 리스너를 추가하고 제거하는 것을 확실히 합니다 (일반적으로 활성화/비활성화 시에 추가/제거합니다)
	private void OnEnable() { MyPlayer.Events.OnComplete.AddListener(OnPlayerComplete); }
	private void OnDisable() { MyPlayer.Events.OnComplete.RemoveListener(OnPlayerComplete); }
}

마지막으로, 비동기적으로 완료를 기다릴 수도 있습니다. 다음과 같이 할 수 있습니다:

using System.Collections;
using System.Collections.Generic;
using MoreMountains.Feedbacks;
using MoreMountains.Tools;
using UnityEngine;

public class AwaitTest : MonoBehaviour
{
	public MMF_Player FirstPlayer;
	public MMF_Player SecondPlayer;

	// 테스트 버튼, 인스펙터에서 호출됩니다.
	[MMInspectorButton("Test")]
	public bool TestButton;

	// 첫 번째 플레이어가 피드백 재생을 완료할 때까지 기다린 후 두 번째 플레이어를 재생합니다.
	public async void Test()
	{
		await FirstPlayer?.PlayFeedbacksTask(this.transform.position);
		SecondPlayer?.PlayFeedbacks();
	}
}


기존 MMFeedback 스크립트를 새로운 시스템으로 변환 (v3.0 이전)

기존 MMFeedbacks 시스템에서는 사용자 정의 피드백 스크립트를 만들려면 MMFeedback를 상속하는 새 클래스를 생성했습니다. 이제 MMF_Player 시스템에서는 MMF_Feedback를 상속하는 새 클래스를 생성합니다. 기존 피드백을 변환하려면 과정은 상당히 간단하며, 인지해야 할 몇 가지 차이점만 있습니다:

  • 기본 클래스
  • 초기화 메서드 서명
  • 코루틴
  • 추가 에디터 재정의
  • 인스펙터 그룹

보통 기존 클래스를 복제하고 이름을 변경하는 것부터 시작합니다. 새 피드백은 모두 이름 패턴으로 MMF_Something을 따르지만, 이는 여러분에게 달려 있으며 원하는 대로 설정할 수 있습니다.

새 클래스를 만들었으면 상속받는 클래스를 변경해야 합니다. 예를 들어, MMFeedbackTest 클래스를 다음과 같이 변경합니다:

public class MMFeedbackTest : MMFeedback

// 다음과 같이 변경됩니다:

public class MMF_Test : MMF_Feedback

만약 CustomInitialization 메서드를 오버라이드하고 있다면, 그 시그니처를 다음과 같이 변경해야 합니다:

protected override void CustomInitialization(MMF_Player owner)

// 다음과 같이 변경됩니다:

protected override void CustomInitialization(MMF_Player owner)

새로운 피드백은 MonoBehaviour가 아니기 때문에, 이전과 같이 일반적으로 코루틴을 사용할 수 없습니다. 그러나 MMF_Player의 MonoBehaviour 지원을 통해 이를 해결할 수 있습니다. 코루틴을 시작하는 방법은 다음과 같습니다:

StartCoroutine(DoSomethingCo());

// 다음과 같이 변합니다:

Owner.StartCoroutine(DoSomethingCo());

 

MMF_Feedback에서 추가 편집기 재정의를 지정할 수도 있습니다. 일반적으로 이들은 FeedbackColor 재정의와 동일한 #if UNITY_EDITOR 블록에 위치시키는 것이 좋습니다. 이들은 모두 선택 사항이며 총 세 가지가 있습니다.

// 만약 피드백이 설정이 필요하고, 그 요구 사항이 충족되지 않으면 경고를 표시하고 싶다면,
// EvaluateRequiresSetup을 오버라이드하여 해당 조건을 반환하도록 할 수 있습니다.
public override bool EvaluateRequiresSetup() { return (MyTargetObject == null); }

// 위와 같이 필요한 설정을 정의하면, RequiresSetupText 속성을 오버라이드하여
// 인스펙터에서 경고 메시지에 표시될 텍스트를 지정해야 합니다.
public override string RequiresSetupText => "이 피드백은 MyTargetObject를 설정해야 합니다.";

// 피드백 헤더의 오른쪽 부분에 추가 정보를 표시하려면 아래 속성을 사용할 수 있습니다.
// 여기서는 MyTargetObject의 이름을 표시하려고 하므로, 이 값이 null이 아닌지 확인하고 해당 이름을 반환합니다.
// 다른 값으로 변경할 수도 있습니다.
public override string RequiredTargetText => MyTargetObject != null ? MyTargetObject.name : "";

MMF_Player에서는 인스펙터 그룹을 정의할 수도 있습니다. 이는 인스펙터에서 접을 수 있는 섹션으로 속성을 그룹화하는 기능입니다.

[MMFInspectorGroup("MySectionTitle", true, 12, true)]

첫 번째 인자는 섹션의 이름입니다. 두 번째 인자는 다음 섹션까지 이 속성이 유효한지 여부를 결정합니다(보통은 true로 두는 것이 좋습니다). 세 번째 인자는 색상을 정의합니다 (정수이며, 최대 값은 139입니다. 전체 목록은 MMFeedbacksColors 클래스에 있습니다). 마지막 매개변수는 선택 사항입니다. 설정이 필요한 경우(바운드된 게임 오브젝트가 없는 경우 등) 경고를 표시하려는 모든 섹션에 대해 true로 설정해야 합니다. EvaluateRequiresSetup이 true이면 해당 섹션에 작은 경고 아이콘이 표시됩니다.

이제 새로운 피드백을 생성하는 데 필요한 모든 정보를 알고 있습니다! 물론 기존의 피드백을 참고할 수도 있습니다. 자산 안에는 이전 버전과 새 버전 모두가 포함되어 있습니다.

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

Creating a new feedback  (0) 2024.07.09
Complete list of Feedbacks  (0) 2024.07.09
Core concepts(핵심 개념)  (0) 2024.07.08
Getting started  (0) 2024.07.06
Demos  (0) 2024.07.06

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

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

  • 일시 중지  
        -   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