요약: 이 페이지는 새로운 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

+ Recent posts