요약: 이 섹션에서는 새로운 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

+ Recent posts