요약: 이 섹션에서는 MMFloatingText 시스템을 사용하여 게임 세계에 텍스트를 생성하는 방법을 설명합니다.

테이블 내용
  • 소개
  • 설정
        -  피드백을 통해 플로팅 텍스트를 재생하는 방법 설정

 

소개

 

게임에서 플레이어에게 화면에 특정 위치에서 관련된 값을 전달하고 싶을 때가 자주 있습니다. 예를 들어 데미지 숫자, 생성된 화폐, 또는 텍스트 메시지 등이 될 수 있으며, 이는 여러분의 선택에 달려 있습니다!

Feel은 게임에 만족스러운 플로팅 텍스트를 쉽게 추가할 수 있도록 도와줍니다.

 


설정

 

FeelTactical 데모 씬에서 플로팅 데미지 텍스트의 예제를 찾을 수 있습니다. 데미지 텍스트 피드백에는 MMFloatingTextSpawner가 필요하며, 이 씬에서는 Managers 노드 아래에 각각의 슈터/큐브에 하나씩 총 세 개의 MMFloatingTextSpawner가 있습니다. 각 전술 슈터에는 ShootFeedbacks가 바인딩되어 있으며, 각각의 슈터는 플로팅 텍스트 피드백을 트리거합니다. 각각의 피드백은 특정 채널을 대상으로 하며, 이는 각각의 MMFloatingTextSpawners 중 하나에서 해당 채널과 일치하는 것으로 잡힙니다.

  • 첫 번째 스포너는 매우 기본적인 플로팅 텍스트를 생성합니다.
  • 두 번째 스포너는 생성 시 MMF_Player를 재생하여 회전, 위치, 색상 및 텍스트 간격을 애니메이션화하는 피드백 파워드 텍스트를 생성합니다.
  • 세 번째 스포너는 TextMeshPro 플로팅 텍스트를 생성합니다.

 


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

  1. Unity 2022.3.23f1(이상)에서 새로운 프로젝트를 생성하고, 패키지 매니저를 통해 Feel v4.1.2(이상)를 가져옵니다.
  2. 빈 씬(또는 기존 씬)에서 새로운 빈 게임 오브젝트를 생성하고, 이름을 "FloatingTextSpawner"로 설정한 후 MMFloatingTextSpawner 컴포넌트를 추가합니다.
  3. 프로젝트 패널에서 MMFloatingText 프리팹을 검색하고, 이를 새로 생성한 스포너의 Pooler 설정에서 PooledSimpleMMFloatingText 슬롯에 드래그합니다.
  4. 새로운 빈 오브젝트를 생성하고, 이름을 "TestPlayer"로 설정한 후 위치를 (0,0,0)으로 설정합니다. 그런 다음, MMF Player 컴포넌트를 추가합니다.
  5. MMF Player 컴포넌트에 새로운 UI > Floating Text 피드백을 추가합니다.
  6. 에디터에서 재생 버튼을 누른 후, MMF Player의 초록색 재생 버튼을 누르면 "100" 텍스트가 매번 생성됩니다.

추가 기능: 강도 제어 추가

  • 더 나아가서, MMF Player의 강도를 피드백에 적용하려면 "use intensity as value" 옵션을 체크할 수 있습니다. 아래 클래스와 같이 프로젝트에 새로운 클래스를 생성하고, 위 단계를 완료한 후 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 속성을 포함한 다른 모든 속성을 동적으로 변경할 수도 있습니다. 아래 예제에서는 값을 랜덤 부동 소수점으로 설정하고 색상을 화려한 그라디언트로 설정합니다.

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>(); // 플레이어에 하나의 플로팅 텍스트 피드백만 있는 경우 가정, 더 복잡한 방법은 문서 참조

        // 표시 값을 랜덤 값으로 설정합니다.
        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);
    }
}

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

MMStateMachine  (3) 2024.07.14
MMSceneLoading  (0) 2024.07.14
MMProgressBar  (1) 2024.07.14
MMRadio  (1) 2024.07.14
MMSequencer  (2) 2024.07.14

요약: 이 페이지에서는 Feel에 포함된 유한 상태 기계를 사용하는 방법을 설명합니다.

테이블 내용
  • 상태 기계(State Machine)란?
  • 상태 기계 생성
  • 상태 변경 감지

 

상태 기계(State Machine)란?

상태 기계(또는 유한 상태 기계)는 계산의 수학적 모델입니다. 이는 주어진 시간에 정확히 하나의 유한한 상태 중 하나에 있을 수 있는 추상적인 기계입니다. 이는 게임에서 캐릭터의 상태, 무기의 상태, 캐릭터의 진행 상황 등을 추적하는 데 자주 사용되는 디자인 패턴입니다.

Feel에는 상태 기계를 처리하고, 상태를 저장하며, 이러한 변경에 대해 이벤트를 트리거하는 간단한 클래스인 MMStateMachine이 포함되어 있습니다. 필요하다면 이를 사용할 수 있습니다.


상태 기계 생성

아래 클래스는 상태 기계의 일반적인 사용 사례를 보여줍니다. 이 클래스는 입력을 읽고 "점프" 또는 "대시"를 수행하는 캐릭터 컨트롤러를 시뮬레이션합니다. 이를 테스트하려면, 새 빈 씬을 생성하고, 새 빈 게임 오브젝트를 생성한 후, 이름을 "MyTestCharacter"로 설정하고 MyCharacter 컴포넌트를 추가합니다. 재생 버튼을 누르면 화면에 디버그 콘솔이 현재 "캐릭터"의 상태를 표시합니다. 스페이스바, D 또는 R을 누르면 새로운 상태로 변경됩니다.

using MoreMountains.Tools;
using UnityEngine;

/// 매우 기본적인 캐릭터 컨트롤러의 데모 클래스입니다. 입력을 읽고 상태 기계를 업데이트합니다.
public class MyCharacter : MonoBehaviour
{
    /// 유한 상태 기계의 모든 가능한 상태를 선언합니다.
    public enum MovementStates { Null, Idle, Walking, Running, Dashing, Jumping }
    /// 상태 기계를 선언하고, MovementStates에서 작동하도록 지정합니다.
    public MMStateMachine<MovementStates> MovementState;

    /// Awake에서 상태 기계를 초기화합니다.
    private void Awake()
    {
        MovementState = new MMStateMachine<MovementStates>(this.gameObject, true);
    }

    /// Update에서 입력을 확인하고 캐릭터 컨트롤러의 메서드를 적절히 트리거합니다.
    /// 이 메서드 각각은 상태 기계에서 캐릭터의 현재 상태를 변경합니다.
    /// 실제 컨트롤러에서는 힘을 가하거나, 캐릭터를 이동시키거나, 속도를 변경하는 등의 작업을 수행합니다.
    private void Update()
    {
        if (Input.GetKeyDown("space"))
        {
            Jump();
        }
        if (Input.GetKeyDown("d"))
        {
            Dash();
        }
        if (Input.GetKeyDown("r"))
        {
            Run();
        }

        // 현재 상태를 화면의 디버그 콘솔에 출력합니다.
        MMDebug.DebugOnScreen("Current Character State", MovementState.CurrentState);
    }

    private void Jump()
    {
        MovementState.ChangeState(MovementStates.Jumping);
    }

    private void Dash()
    {
        MovementState.ChangeState(MovementStates.Dashing);
    }

    private void Run()
    {
        MovementState.ChangeState(MovementStates.Running);
    }
}

 

 

상태 변경 감지

어떤 클래스에서든 이 시스템을 사용하여 상태 변화를 감지하고 이에 따라 행동할 수 있습니다. 이렇게 하면 "점프 상태를 종료할 때" 또는 "대시 상태에 진입할 때" 작업을 수행하는 것이 매우 쉬워집니다. 다음 클래스는 이러한 작업이 어떻게 수행되는지를 보여줍니다. 이를 테스트하려면, 이전 씬에서 동일한 객체 또는 씬의 다른 객체에 MyListeningClass 컴포넌트를 추가하세요.

using MoreMountains.Tools;
using UnityEngine;

/// 캐릭터가 상태를 변경할 때 동작하는 리스닝 클래스의 예제입니다.
public class MyListeningClass : MonoBehaviour, MMEventListener<MMStateChangeEvent<MyCharacter.MovementStates>>
{
    // 활성화될 때 이벤트 변경 사항을 수신 대기합니다.
    private void OnEnable()
    {
        this.MMEventStartListening<MMStateChangeEvent<MyCharacter.MovementStates>>();
    }

    // 비활성화될 때 이벤트 변경 사항 수신을 중지합니다.
    private void OnDisable()
    {
        this.MMEventStopListening<MMStateChangeEvent<MyCharacter.MovementStates>>();
    }

    // 새로운 상태 변경 이벤트를 수신하면, 원하는 로직을 실행할 수 있습니다.
    public void OnMMEvent(MMStateChangeEvent<MyCharacter.MovementStates> movementStateEvent)
    {
        // 상태 기계가 현재 있는 새로운 상태에 따라 작업을 수행할 수 있습니다.
        switch (movementStateEvent.NewState)
        {
            case MyCharacter.MovementStates.Jumping:
                Debug.Log("we're jumping now");
                break;
            case MyCharacter.MovementStates.Dashing:
                Debug.Log("we're dashing now");
                break;
        }

        // 이전 상태에 따라 작업을 수행할 수도 있습니다.
        switch (movementStateEvent.PreviousState)
        {
            case MyCharacter.MovementStates.Running:
                // 이벤트를 트리거한 게임 오브젝트에 대한 참조를 항상 얻을 수 있습니다.
                Debug.Log("object " + movementStateEvent.Target + " was running but we're not running anymore");
                break;
        }
    }
}

 

 

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

MMFloatingText  (2) 2024.07.14
MMSceneLoading  (0) 2024.07.14
MMProgressBar  (1) 2024.07.14
MMRadio  (1) 2024.07.14
MMSequencer  (2) 2024.07.14

요약: 이 페이지에서는 Feel에 포함된 헬퍼를 사용하여 프로젝트에서 씬을 로드하는 다양한 방법을 설명합니다.

테이블 내용
소개

  • 피드백을 사용하여 씬을 로드하는 방법
  • 피드백을 사용하여 씬을 추가적으로 로드하는 방법
        -  코드를 통해 씬을 로드하는 방법

  • 자신만의 로딩 화면 만들기

 

 

 

소개

Unity는 게임에서 씬을 전환하는 기본적인 방법을 제공하지만, 이는 매우 흥미롭지 않으며 사용자 친화적이지도 않습니다. Feel에는 씬을 로드하고 언로드하는 몇 가지 헬퍼가 포함되어 있어 옵션을 확장하면서도 간단하게 사용하고 쉽게 커스터마이징할 수 있으며, 전체적으로 플레이어에게 더 나은 경험을 제공합니다.

먼저 중요한 경고 사항을 알려드리겠습니다. 쉽게 잊기 쉬운 부분인데, Unity에서 씬을 로드하려면 해당 씬이 빌드 설정에 있어야 합니다 (파일 > 빌드 설정). 빌드 설정에 익숙하지 않다면 먼저 이를 읽어보는 것이 좋습니다. 로딩 씬을 사용하는 경우, 그 씬 역시 빌드 설정에 추가되어야 합니다.

 

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

새로운 씬을 로드하는 가장 쉬운 방법은 피드백을 사용하는 것입니다. 이는 코드를 필요로 하지 않으며 몇 초 만에 설정할 수 있습니다. 다음은 Feel에 포함된 데모 로딩 화면 중 하나를 사용하여 씬을 추가적으로 로드하는 예제입니다:

 

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

  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의 녹색 Play 버튼을 누릅니다. 로딩 화면이 나타나고, 로딩이 완료된 후 새로운 씬으로 전환됩니다.

 

 

 

보시다시피, 이 방법은 기본 Unity 방식보다 훨씬 간단하고 개선된 방법입니다. 피드백의 설정에서 몇 가지를 조정할 수 있으며, 먼저 로딩 모드를 선택할 수 있습니다. 사용 가능한 4가지 모드는 다음과 같습니다:

  • Direct: 기본 SceneManager.LoadScene 호출을 수행합니다.
  • Direct Additive: 기본 SceneManager.LoadScene 호출을 사용하지만 추가 모드로 실행됩니다.
  • MM Scene Loading Manager: 이 모드는 MMSceneLoadingManager를 사용하여 순차적, 비추가적인 씬 로드를 트리거합니다(현재 씬 언로드, 로딩 화면 로드, 새 씬 로드, 로딩 화면 언로드).
  • MM Additive Scene Loading Manager: 이 모드는 보다 고급인 MMAdditiveSceneLoadingManager를 사용합니다. 로딩 화면을 추가적으로 로드하며, 이전 씬을 언로드하지 않습니다(더 흥미로운 전환이 가능). 사용자 지정 지연 시간과 전환 곡선을 사용할 수 있습니다(다른 모드에서는 사용되지 않음).

마지막 모드에서는 전환을 위한 여러 지연 시간과 곡선을 조정할 수 있습니다. 이러한 설정은 MMFader(일반, 원형 또는 방향성 페이더)를 조정합니다. Feel에 포함된 다양한 데모 로딩 화면에서 이미 설정된 예제를 확인할 수 있습니다.

 

코드를 통해 씬을 로드하는 방법

코드를 통해 씬을 로드하는 것도 매우 간단합니다!

다음은 Unity에서 기본적으로 씬을 로드하는 방법입니다(빌드 설정에 TheNameOfMyDestinationScene이라는 씬이 있다고 가정):

SceneManager.LoadScene("TheNameOfMyDestinationScene");

 

다음은 MMSceneLoadingManager를 사용하여 씬을 로드하는 방법입니다 (LoadingScreen은 데모 로딩 화면 중 하나의 이름입니다. 이를 사용할 수 있습니다):

MMSceneLoadingManager.LoadScene("TheNameOfMyDestinationScene", "LoadingScreen");

 

마지막으로, 씬을 추가적으로 로드하는 방법은 다음과 같습니다(이 메서드는 더 많은 매개변수를 가지므로, IDE나 API 문서에서 자세히 확인해보세요):

MMAdditiveSceneLoadingManager.LoadScene("TheNameOfMyDestinationScene");

 

씬을 추가적으로 로드할 때, MMAdditiveSceneLoadingManagerSettings 클래스를 통해 다양한 설정을 지정할 수 있습니다. 전체 설정 목록을 확인하려면 해당 클래스를 참조하세요. 다음은 예제입니다:

MMAdditiveSceneLoadingManagerSettings mySettings = new MMAdditiveSceneLoadingManagerSettings();
mySettings.LoadingSceneName = "MyAdditiveLoadingSceneName";
MMAdditiveSceneLoadingManager.LoadScene("TheNameOfMyDestinationScene", mySettings);

 

기억하세요, 이러한 기능이 작동하려면 목적지 씬과 로딩 씬이 모두 빌드 설정에 포함되어 있어야 합니다.

 

 

자신만의 로딩 화면 만들기

자신만의 로딩 화면을 만들기 위해, 데모 중 하나를 시작점으로 사용하는 것이 가장 좋습니다. 먼저, MMAdditiveLoadingScreen 씬을 복제하여 MyAdditiveLoadingScreen으로 이름을 변경하고, 프로젝트 내의 Feel 폴더 외부에 위치한 적절한 장소로 이동한 후, 빌드 설정에 추가하고 엽니다.

보시다시피, 이 씬은 진행 상황을 숫자로 표시하는 텍스트와 프로그레스 바로 구성된 매우 간단한 씬입니다. 이러한 UI 요소들을 원하는 대로 편집할 수 있습니다. 예를 들어, 계층 구조에서 FaderExtension 오브젝트를 선택하고 색상을 변경할 수 있습니다. 데모 로고를 제거하고 자신만의 로고를 추가할 수도 있습니다.

또한 이 씬에는 LoadingSceneManager라는 오브젝트가 포함되어 있습니다. 인스펙터에서 이 오브젝트에는 다양한 UnityEvents가 있으며, 이를 통해 거의 모든 측면을 제어할 수 있습니다. 기본적으로 대부분은 비어 있으며, 텍스트 버전의 진행 상황과 프로그레스 바를 업데이트하는 바인딩만 설정되어 있습니다. 더 많은 기능을 추가해도 좋습니다!

편집이 완료되면 씬을 저장하고, 이제 코드나 피드백을 통해 새로운 씬을 추가적으로 로드할 때 기본 씬 이름 대신 새로 만든 씬 이름을 지정하면 해당 씬이 사용됩니다. Feel/MMTools/Tools/MMSceneLoading/LoadingScreens/ 폴더에서 여러 데모 로딩 씬을 찾을 수 있습니다. 대부분은 추가적으로 사용되며, LoadingScreen 씬은 비추가적인 MMSceneLoadingManager를 사용할 때 사용됩니다. 이 둘을 혼용하지 않도록 주의하세요!

이제 씬을 멋지게 로드하는 방법을 모두 알게 되었습니다. 잘하셨습니다!

 

 

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

MMFloatingText  (2) 2024.07.14
MMStateMachine  (3) 2024.07.14
MMProgressBar  (1) 2024.07.14
MMRadio  (1) 2024.07.14
MMSequencer  (2) 2024.07.14

요약: 이 섹션에서는 Feel을 사용하여 게임에서 매력적인 진행 바를 만드는 방법을 설명합니다.

테이블 내용
  • 소개
  • 설정
          -  MM Progress Bar 설정 방법

  • 스크립트를 통해 막대값 제어
  • 진행 막대 커스터마이징
  • 스크립트를 통해 막대를 제어하는 추가 방법
  • MM Health Bars
          -   MMHealthBar 컴포넌트를 사용하여 자동으로 체력 막대를 그리는 방법

 

소개

 

진행 막대는 게임에서 가장 일반적인 UI 요소 중 하나입니다. 진행 막대는 수치와 총 수치를 시각화하는 훌륭한 방법이며, 체력, 스태미나, 마나, 탄약, 시간 제한 등 다양한 용도로 사용될 수 있습니다. 따라서 게임에서 여러 개의 진행 막대가 필요할 가능성이 큽니다. 진행 막대를 만드는 것은 어려운 일이 아니지만, 멋지고 직관적인 막대를 만드는 것은 예술에 가깝습니다.

MMProgressBar 컴포넌트는 이러한 어려움을 해결해주며, 쉽게 제어할 수 있는 API를 통해 빠르게 멋진 진행 막대를 제공합니다. 이 컴포넌트는 UI 요소(보통 이미지)의 속성을 애니메이션화하여 두 범위 사이의 값을 반영할 수 있습니다.

이 컴포넌트는 여러 "막대"(일반적으로 가로 직사각형이지만, 원, 정사각형, 이미지 등 원하는 모든 형태로 작동할 수 있음)를 제어합니다: 현재 값의 막대를 나타내는 ForegroundBar와 선택적으로 지연된 두 개의 막대입니다. DelayedBarDecreasing은 막대 값이 감소할 때 ForegroundBar보다 뒤처지며, 플레이어가 잃어버린 값을 확인할 수 있게 해줍니다. DelayedBarIncreasing은 막대 값이 증가할 때 먼저 움직이며, ForegroundBar는 그 뒤를 따라 플레이어가 얻은 값을 보여줍니다.

이 진행 막대는 게임 내 어디에나 배치할 수 있습니다. HUD에 있거나 월드 캔버스에 있을 수 있으며, 이는 여러분의 선택에 달려 있습니다.

FeelMMProgressBar 데모 씬에서 MMProgressBar가 동작하는 예시를 확인할 수 있습니다.

 

 

설정

MMProgressBar를 설정하는 것은 매우 쉽습니다. 다음 단계에서는 단순한 직사각형을 막대로 사용하는 매우 기본적인 설정 방법을 안내하겠습니다.

 

MM Progress Bar 설정 방법

  1. Unity 2022.3.23f1(이상)에서 새로운 프로젝트를 생성하고 패키지 매니저를 통해 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에는 두 개의 MMProgressBar 컴포넌트가 있습니다. NV 데모 전용이 아닌 컬러 인스펙터가 있는 것을 선택합니다. 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. 에디터에서 Play 버튼을 눌러 재생 모드로 들어간 후, TestBar 인스펙터에서 슬라이더를 사용하여 Value 값을 설정하고 ChangeBarValue 버튼을 클릭하세요.
물론, 실제 게임에서는 캐릭터가 데미지를 입거나 마나를 사용할 때마다 UpdateBar 호출을 통해 진행 막대의 값을 업데이트하게 될 것입니다.

 

 

진행 막대 커스터마이징

MMProgressBar 인스펙터를 통해 막대를 원하는 대로 커스터마이징할 수 있습니다. 다양한 접기 항목 아래에서 막대의 모든 측면을 제어할 수 있는 필드를 찾을 수 있습니다. 대부분의 필드는 설명이 필요 없지만, 주요 옵션 목록은 다음과 같습니다:

  • Bindings: 전경 및 지연 막대를 해당 슬롯에 드래그해야 합니다. PlayerID는 다른 스크립트에서 접근할 때 막대를 식별하는 데 사용할 수 있는 ID입니다.
  • Fill Settings: 현재 값이 0 또는 1일 때 막대의 채움 값을 정의할 수 있으며, 시작 시 자동으로 채워지는 값을 설정할 수 있습니다(코드에서 초기화를 처리하기 위해 false로 설정하는 것이 좋습니다). 그 다음, 막대 방향, 채움 모드(채움 모드를 선택할 경우 Filled 타입으로 설정된 이미지를 사용해야 함), 그리고 작업할 타임스케일을 정의할 수 있습니다. 마지막으로, BarFillMode를 통해 막대가 고정된 기간 동안 움직이도록 설정할 수 있습니다(막대가 한 지점에서 다른 지점으로 이동하는 데 항상 X초가 걸리며, 거리에 관계없이) 또는 SpeedBased로 설정하여 막대가 더 큰 간격을 이동하는 데 더 오래 걸리도록 할 수 있습니다.
  • Bar settings: 각 막대에 대해 속도와 지속 시간을 설정할 수 있으며(어느 것이 사용될지는 BarFillMode에 따라 다름), 이동 곡선을 설정할 수 있습니다.
  • Bump: 막대는 내장된 "범프" 피드백 기능을 제공하여 값이 변경될 때마다 자동으로 막대의 크기와 색상을 변경할 수 있습니다. 증가 또는 감소(또는 둘 다)할 때 "범프"를 적용할지 여부를 결정할 수 있으며, 값이 크게 변할 때 더 큰 범프를 가질 수 있도록 강도 배율을 설정할 수 있습니다.
  • Events: 막대는 범프부터 이동 시작/중지에 이르는 생애 주기의 모든 단계에 대해 Unity Events를 제공합니다. 이를 통해 다른 컴포넌트(일반적으로 MMF Player)를 연결하여 막대를 더욱 향상시킬 수 있습니다. HorizontalBar가 막대가 감소하고 증가할 때 다양한 MMF Player를 트리거하는 FeelMMProgressBar 데모에서 그 예를 확인할 수 있습니다.
  • Text: 선택적으로 Text 또는 TextMeshPro 컴포넌트를 막대에 연결하여 막대와 함께 텍스트 값을 업데이트할 수 있습니다. 접두사와 접미사를 추가하고 총 값을 표시할지 여부를 결정하며, 표시할 텍스트 형식을 정의할 수 있습니다.
  • Debug: 막대를 업데이트하거나 DebugNewTargetValue 슬라이더에 설정된 값으로 막대를 설정하고, 범프를 강제하거나 막대를 10%씩 이동시키는 버튼 세트입니다.
  • Debug Read Only: 막대의 진행 상황을 실시간으로 보여주는 4개의 슬라이더(이것들은 읽기 전용입니다).

 

스크립트를 통해 막대를 제어하는 추가 방법

다른 모든 Feel 클래스와 마찬가지로, 해당 클래스의 메서드에 대한 자세한 정보는 API 문서나 클래스 자체에서 확인할 수 있습니다(모든 클래스는 주석이 잘 달려 있습니다). 그러나 막대와 상호 작용하는 주요 방법은 다음과 같습니다. 아래 모든 코드 라인에서 TargetProgressBar는 MMProgressBar에 대한 참조입니다.

막대의 값을 변경하는 주요 메서드는 두 가지 유형이 있습니다: Update와 Set입니다. Update는 값을 변경하고 범프(스케일, 색상 등에 영향을 미치는 시각적 피드백을 트리거하며, 위치로 이동함)를 트리거합니다. 반면 Set 메서드는 범프를 발생시키지 않고, 막대를 최종 상태로 가상 텔레포트합니다.

// 지정한 값과 범위 사이에서 막대를 업데이트하며, 범프를 발생시킵니다
TargetProgressBar.UpdateBar(Value, SomeMinValue, SomeMaxValue);
// 예를 들어, 아래 코드는 막대를 50%로 설정합니다:
TargetProgressBar.UpdateBar(20f, 0f, 40f);

// 지정된 정규화된 값(0f와 1f 사이)으로 막대를 업데이트하며, 범프를 발생시킵니다
TargetProgressBar.UpdateBar01(NormalizedValue);
// 예를 들어, 아래 코드는 막대를 50%로 설정합니다:
TargetProgressBar.UpdateBar01(0.5f);

// 지정한 값으로 즉시 막대 값을 설정하며, 범프를 발생시키지 않습니다
TargetProgressBar.SetBar(Value, SomeMinValue, SomeMaxValue);
// 지정된 정규화된 값으로 즉시 막대 값을 설정하며, 범프를 발생시키지 않습니다
TargetProgressBar.SetBar01(NormalizedValue);

API 문서를 확인하여 막대를 제어하는 데 사용할 수 있는 다양한 메서드에 대한 추가 정보를 꼭 확인하세요!

 

 

MM Health Bars

MMHealthBar 컴포넌트는 MMProgressBar의 기능을 활용하여 클릭 한 번으로 객체에 체력 막대(또는 다른 막대)를 추가할 수 있는 솔루션을 제공합니다. 이 (체력) 막대는 오버레이 UI가 아닌 월드 내에 존재하며, 부착된 객체를 따라다니며, 빌보드, 자동 숨김, 사망 시 작업 수행 등의 옵션을 제공합니다. 월드 내에 위치한 작은 MM Progress Bars를 사용하고 싶지만, 모든 측면을 제어할 필요가 없는 경우 유용한 컴포넌트입니다. 다음은 설정 단계입니다:

 

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

  1. Unity 2022.3.23f1(이상)에서 새로운 프로젝트를 생성하고 패키지 매니저를 통해 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 버튼을 누를 때마다 체력 막대가 업데이트됩니다.

 

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

MMStateMachine  (3) 2024.07.14
MMSceneLoading  (0) 2024.07.14
MMRadio  (1) 2024.07.14
MMSequencer  (2) 2024.07.14
MMAudioAnalyzer  (1) 2024.07.14

요약: 이 페이지에서는 MMRadio 시스템을 사용할 수 있는 다양한 방법을 다룹니다.

테이블 내용
  • MMRadio란 무엇인가요?
  • MMRadio 사용 방법
  • 라디오 신호
  • MMRadio를 피드백과 함께 사용하기

 

MMRadio란 무엇인가요?

MMRadio는 다른 객체의 속성을 제어하려고 할 때마다 사용자 지정 코드를 작성하는 번거로움을 해소하기 위해 만들어진 시스템입니다. 코드 한 줄도 작성하지 않고 객체의 속성을 읽고 새로운 값을 쓸 수 있도록 설계되었습니다. MMRadio라는 이름은 Broadcaster가 객체의 값을 읽고 이를 "방송"할 수 있게 하고, 여러 Receivers가 이 입력을 듣고 자신의 타겟에 값을 적용할 수 있도록 하기 위해 붙여졌습니다.

예를 들어, 거대한 GTA 같은 레벨이 있고, 캐릭터의 체력을 반영하여 레벨의 모든 램프가 밝기를 조절하도록 하고 싶다고 가정해봅시다(건강할 때는 매우 밝고, 손상되었을 때는 거의 꺼지는 램프). 램프에 캐릭터의 체력을 확인하는 클래스를 추가할 수 있지만, 이는 비용이 많이 들 수 있습니다. 더 나은 패턴은 캐릭터가 맞을 때마다 이벤트를 트리거하고, 램프가 이를 듣고 강도를 변경하는 것입니다. MMRadio를 사용하면 단 한 줄의 코드도 작성하지 않고 이를 수행할 수 있으며, 값이 변경될 때만 (아주 적은) 비용이 들기 때문에 매우 효율적입니다.

 

 

MMRadio 사용 방법

MMRadio의 예제는 MMRadioDemo 씬에서 확인할 수 있습니다(경로: Feel/MMTools/Tools/MMRadio). 재생 버튼을 누르면 여러 개의 큐브가 한 번에 비교적 높은 속도로 움직이는 것을 볼 수 있습니다. 이들은 모두 계층 패널의 TestBroadcaster에 의해 제어됩니다. 이를 연구하거나, 새로운 것을 만들기 위해 비활성화할 수 있습니다.

빈 객체를 생성하고, MMRadioBroadcaster 컴포넌트를 추가합니다. Emitter 슬롯에 계층 구조에서 Cube1 객체를 드래그합니다. Component에서 Transform을 선택하고, Property에서 position을 선택합니다. TargetAxis는 X로 남겨둡니다. 나머지 설정은 기본값으로 두지만, 리맵 규칙과 방송할 채널을 정의할 수 있습니다. 씬의 나머지 부분은 이미 채널 0을 듣도록 설정되어 있으므로, 다음 단계로 넘어갑니다.

재생 버튼을 누르면 아무 일도 일어나지 않는 것이 정상입니다. 이제 Cube1 객체를 선택하고 X축(빨간색 축)으로 이동하면, 다른 모든 큐브가 Cube1의 움직임에 따라 Y축 방향으로 동기화되어 움직이는 것을 볼 수 있습니다. 이것이 MMRadio 시스템의 작동 방식입니다.

다른 큐브를 선택하여 어떻게 설정되어 있는지 확인할 수 있습니다. 모든 큐브는 MMRadioReceiver 컴포넌트를 가지고 있으며, 여기서도 position 속성을 대상으로 합니다. 하지만 이번에는 y축을 수정하도록 지정합니다. 또한, 임의의 곱셈값, 리맵 규칙, 청취할 채널 등을 정의할 수 있습니다.

 

 

라디오 신호

우리가 본 것처럼, 어떤 객체어떤 값이든 방송할 수 있습니다. 따라서 게임의 어떤 클래스든 이 작업을 수행할 수 있습니다. 하지만 지속적으로(또는 한 번) 수준을 방출하여 방송할 수 있는 준비된 "신호" 클래스도 있습니다. 기본 사용 방법은 이러한 신호 클래스를 브로드캐스터와 같은 객체에 추가하거나 그 아래에 중첩하여 배치한 후, 해당 객체를 브로드캐스터의 TargetObject 슬롯에 드래그하고, Component 드롭다운에서 신호를 선택한 다음 Level 속성을 선택하는 것입니다.

Feel에는 두 가지 내장 신호 클래스와 사용자 정의 신호를 생성할 수 있는 MMRadioSignal 추상 클래스가 포함되어 있습니다:

  • MMRadioSignalAudioAnalyzer: 이 신호 클래스는 MMAudioAnalyzer를 대상으로 설정하고 특정 비트를 청취할 수 있게 해줍니다.
  • MMRadioSignalGenerator: 이 신호 클래스는 기본 곡선을 결합하여 신호를 생성하고 사용자 정의할 수 있게 해줍니다. 신호의 지속 시간(초 단위)에서 곡선 구성 요소에 이르기까지 많은 매개변수를 조정하여 고유한 신호를 만들 수 있습니다. 사인파, 펄스, 톱니파, 애니메이션 곡선, 노이즈, 트윈 등을 추가하고 결합하여 고유한 신호를 제작할 수 있습니다. 라이브 미리보기를 통해 매우 쉽게 조정할 수 있습니다.

 

MMRadio를 피드백과 함께 사용하기

피드백을 사용하여 신호를 트리거할 수도 있습니다. 이를 위해 MMFeedbackRadioSignal이 설계되었습니다. 다른 피드백처럼 추가하고, 인스펙터에서 대상 신호를 설정할 수 있습니다. 또한 지속 시간, 글로벌 곱셈값 및 타임스케일을 정의할 수 있습니다. 이는 OneTime 모드 신호에서만 사용하도록 설계되었습니다.

 

 

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

MMSceneLoading  (0) 2024.07.14
MMProgressBar  (1) 2024.07.14
MMSequencer  (2) 2024.07.14
MMAudioAnalyzer  (1) 2024.07.14
MMSoundManager  (0) 2024.07.14

요약: 이 페이지는 Feel에 포함된 MMSequencer 시스템을 사용하는 방법을 설명합니다.

테이블 내용
  • MMSequencer란 무엇인가요?
  • 시퀀서 사용법
  • 시퀀서 유형
  • 시퀀서를 피드백과 함께 사용하기

 

MMSequencer란 무엇인가요?

MMSequencer는 시퀀스에서 "무언가"를 트리거할 수 있게 해주는 클래스의 집합입니다. 음악 시퀀서와 비슷하지만, Unity의 모든 것에 적용할 수 있습니다. 이 시스템은 완전히 선택 사항이며, 피드백을 사용하기 위해 반드시 사용해야 하는 것은 아닙니다. 더불어 즐길 수 있는 추가 장난감 같은 것입니다.

MMSequencer가 무엇인지, 무엇을 할 수 있는지 더 잘 이해하기 위해서는 SequencerDemo 데모 씬을 열어보는 것이 좋습니다. 계층 구조에서 Sequencers 노드를 찾을 수 있으며, 그 아래에 여러 시퀀서(MMSequencer, MMSoundSequencer, MMFeedbacksSequencer, MMAudioSourceSequencer)가 있습니다. 이 중 하나를 테스트하려면, 재생 버튼을 누르고 계층 구조에서 시퀀서를 선택한 다음 Start playing 버튼을 누릅니다. 그러면 재생 헤드가 움직이고 이벤트가 트리거되는 것을 볼 수 있습니다.

데모의 시퀀서와 하단의 컨트롤

 

 

시퀀서 사용법

이 예제에서는 편의를 위해 MMSequencerDemo에서 작업하는 것이 좋습니다. 시퀀서를 사용하려면 먼저 MMSequence를 생성해야 합니다. 이는 시퀀스 정보를 저장하는 데이터 파일입니다. 아무 폴더에서나 마우스 오른쪽 버튼을 클릭한 후, Create > More Mountains > Sequencer > MMSequence를 선택합니다. 원하는 이름으로 파일을 명명합니다. 그런 다음 시퀀스의 인스펙터에서 Sequence Tracks를 펼치고 크기를 4로 설정합니다(또는 원하는 만큼 조정할 수 있습니다). 트랙은 시퀀서의 라인과 같습니다. 각 트랙마다 연관된 이벤트(소리, 피드백 등)를 재생할 비트를 정의할 수 있습니다. 각 트랙에 대해 고유한 ID, 색상(편집을 쉽게 하기 위한 것), 키(키보드로 시퀀스를 녹음할 계획이 있을 경우, 그렇지 않으면 무시), 활성화 여부를 정의할 수 있습니다. 이 예제에서는 기본 설정을 그대로 두어도 됩니다.

이 예제에서는 기본 시퀀서인 MMSequencer를 사용할 것이지만, 다른 유형의 시퀀서도 사용할 수 있습니다. MMSequences와 관련하여 이들은 모두 비슷합니다.

씬에 새 빈 게임 오브젝트를 생성하고, MMSequencer 컴포넌트를 추가합니다. 새로 생성한 시퀀스를 시퀀스 슬롯에 드래그합니다. 인스펙터에서 몇 가지를 정의할 수 있습니다:

  • BPM: 분당 비트 수, 시퀀서의 재생 속도를 의미합니다. 분당 해당 횟수만큼 "비트"를 트리거합니다. 각 "비트"는 재생 헤드를 앞으로 이동시키고 새로운 이벤트를 트리거합니다.
  • 시퀀서 길이: 트랙당 비트 수를 의미합니다. 루프의 길이를 정의합니다. 헤드가 트랙의 마지막 비트에 도달하면 왼쪽으로 다시 이동합니다.
  • 루프: 일반적으로 시퀀서가 수행해야 하는 작업이지만, 언제든지 루프를 방지할 수 있습니다.
  • 랜덤 시퀀스: 비트를 왼쪽에서 오른쪽으로 재생할지, 무작위로 재생할지 여부를 결정합니다.
  • 메트로놈 소리: 모든 비트마다 재생할 사운드 클립을 바인딩하고 볼륨을 조정할 수 있습니다.

그런 다음 Track Events에서는 비트가 재생될 때 각 트랙에서 발생하는 이벤트를 정의해야 합니다. 이 예제에서 SequencerDemo에 있다면 계층 구조 패널에서 Drumkit 노드(Sequencers 아래)를 펼치고, 그 아래의 오디오 소스를 Track Event 슬롯으로 드래그합니다. 각 오디오 소스에 대해 AudioSource > Play() 함수를 선택합니다.

인스펙터 하단에는 재미있는 일이 일어나는 시퀀스 편집기가 있습니다:

시퀀스 편집기

 

수평 방향으로 트랙을 볼 수 있습니다(이 예제에서는 0부터 3까지 4개의 트랙이 있습니다). 수직 방향으로는 비트를 볼 수 있습니다. 트랙 길이는 8이므로 0부터 7까지 8개의 비트가 있습니다. 각 사각형은 버튼으로, 트랙 x가 비트 y에서 재생되도록 설정할 수 있습니다. 사각형이 트랙의 색상으로 되어 있으면 재생되며, 검정색이면 해당 비트에서는 비활성화됩니다. 이 슬롯들 중 일부를 켜고 재생 버튼을 누릅니다. 재생 모드로 들어가면 시퀀서 인스펙터 하단에 두 개의 컨트롤이 나타납니다: Start Playing 및 Play Next Beat. Start Playing을 눌러 새 노래를 즐기세요. 런타임 동안 트랙을 편집할 수도 있습니다.

물론 이 시퀀서는 일부 오디오 소스만 재생하지만, 이를 통해 모든 종류의 이벤트를 바인딩할 수 있으며, 원하는 모든 것을 트리거할 수 있습니다.

 

 

시퀀서 유형

Feel에 포함된 클래스와 시퀀서는 다음과 같으며, 이를 객체에 추가하여 MMSequences를 활용할 수 있습니다:

  • MMSequencer: 위의 단계에서 사용한 시퀀서로, 모든 유형의 이벤트를 재생할 수 있습니다. 대부분의 다른 시퀀서는 이 기본 시퀀서를 확장합니다.
  • MMAudioSourceSequencer: AudioSources 배열에 여러 오디오 소스를 직접 바인딩할 수 있습니다. 트랙 수만큼 AudioSources 배열에 오디오 소스를 추가해야 합니다.
  • MMFeedbacksSequencer: Feedbacks 배열에 여러 피드백을 직접 바인딩할 수 있습니다. 트랙 수만큼 Feedbacks 배열에 피드백을 추가해야 합니다.
  • MMSoundSequencer: 이전 두 가지와 비슷하지만, 사운드 파일을 직접 슬롯에 추가할 수 있습니다. 자동으로 인스턴스화를 처리합니다.
  • MMInputSequenceRecorder: 키보드 입력을 기반으로 시퀀스를 녹음할 수 있습니다. 빈 객체에 추가하고 시퀀스를 드래그하여 설정한 후, 재생을 누르고 Start Recording Hotkey(Home 키, 기본값)를 누른 다음 리듬에 맞춰 키보드로 입력합니다(또는 원하는 대로). 녹음을 중지하려면 Stop Recording Hotkey(End 키, 기본값)를 누릅니다. 그런 다음 녹음된 시퀀스를 위의 시퀀서 중 하나에서 사용할 수 있습니다.

 

시퀀서를 피드백과 함께 사용하기

모든 MMFeedback에서 시퀀스를 사용하여 타이밍을 조정할 수 있습니다:

피드백의 타이밍을 조정하는 데 사용되는 시퀀스

 

이 작업을 수행하려면, Timing 폴더를 펼치고 Sequence 슬롯에 MMSequence를 드래그합니다. 비트를 확인할 트랙을 선택하고, 대부분의 경우 Quantized를 체크합니다. 입력 녹화를 사용하여 시퀀스를 녹음한 경우, 체크를 해제할 수 있습니다. 그런 다음 재생 버튼을 누르고 피드백을 재생합니다. 피드백은 한 번만 재생되는 대신, 선택한 트랙에서 활성 슬롯의 수만큼 비트에 맞춰 여러 번 재생됩니다.

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

MMProgressBar  (1) 2024.07.14
MMRadio  (1) 2024.07.14
MMAudioAnalyzer  (1) 2024.07.14
MMSoundManager  (0) 2024.07.14
MMTools  (0) 2024.07.13

요약: 이 페이지에서는 게임에서 오디오에 맞춰 동기화할 수 있는 훌륭한 도구인 MMAudioAnalyzer에 대해 알아봅니다.

테이블 내용
  • MMAudioAnalyzer란 무엇인가요?
  • 정규화된 값 계산
  • 레벨
  • 비트
  • 이 값들을 사용하는 방법

 

MMAudioAnalyzer란 무엇인가요?

 

 

게임의 사운드트랙에 움직임, 크기, 이벤트 등을 동기화하고 싶다면 MMAudioAnalyzer가 흥미로울 것입니다. 이 컴포넌트는 씬의 오브젝트에 추가할 수 있으며, 오디오 소스, 씬 전체의 사운드트랙, 또는 마이크에 바인딩할 수 있습니다. 이 컴포넌트는 소리를 분석하고 해당 데이터를 사용할 수 있는 훅을 제공합니다. 위 비디오에서 작동하는 모습을 볼 수 있으며, 완전히 커스터마이즈 가능한 시각화 도구도 함께 제공됩니다.

인스펙터에서 오디오 소스(AudioSource, Global, 또는 Microphone)를 정의하고, 샘플링 간격, 샘플, 윈도우를 설정할 수 있습니다. (간격이 짧을수록 비용이 많이 들고, 샘플이 많을수록 비용이 많이 듭니다.) 특정한 요구가 없다면, 이 세 가지는 기본값으로 두는 것이 좋습니다. 그런 다음 스펙트럼을 몇 개의 밴드로 나눌지 정의할 수 있습니다. 각 밴드는 개별적으로 분석할 수 있습니다. 밴드가 많을수록 특정 정보를 분리하기 쉬워지지만, 비용이 많이 듭니다. 대부분의 목적을 위해서는 1에서 8 사이면 충분합니다.


정규화된 값 계산

런타임 동안 사운드가 재생되고 있다면, 이러한 밴드의 원시 시각화와 정규화된 버전을 볼 수 있습니다. 오디오 소스에서 정규화된 값을 사용하려면, 시스템이 런타임에 전체 소스를 파싱해야 하므로 약간의 과정이 필요합니다. 재생 버튼을 누르고 사운드가 재생될 때 인스펙터 하단의 Find Peaks 버튼을 누릅니다. 트랙이 고속으로 재생됩니다. 완료되면 재생 모드를 종료하고 Paste Peaks 버튼을 누릅니다. 이제 정규화된 값을 사용할 수 있습니다.

 


레벨

런타임 시 MMAudioAnalyzer의 레벨

MMAudioAnalyzer의 인스펙터에서, 런타임 동안 Levels 패널을 펼칠 수 있습니다. 이 패널에서는 글로벌 오디오 값과 정의한 각 밴드의 정확한 값을 볼 수 있습니다. 각 값은 플로트 형식으로, 다른 클래스에서 오브젝트의 움직임을 제어하거나 이벤트를 트리거하는 데 사용할 수 있습니다. 이 패널을 통해 각 플로트 값이 어떻게 변화하는지와 그들의 정확한 값을 확인할 수 있습니다.
  • Amplitude: 특정 프레임에서 소리의 현재 레벨(기본적으로 볼륨)을 나타냅니다.
  • Normalized: 같은 레벨이지만 0에서 1 사이로 정규화된 값입니다. 0은 소리가 전혀 없는 상태, 1은 전체 지속 시간 동안 소리의 최대 진폭을 의미합니다.
  • Buffered Amplitude: 소리의 현재 레벨로 이동하는 보간된 값입니다. 실제 값보다 느리게 움직이며, 무언가를 여기에 바인딩할 때 더 부드러운 움직임을 제공합니다. Buffered 값의 이동 속도는 Buffer Speed 설정에 의해 정의됩니다.
  • Normalized Buffered Amplitude: 정규화된 값이지만, 위와 같이 버퍼링된 값입니다.

이 4가지 값을 글로벌 사운드와 각 밴드에 대해 확인할 수 있습니다.

 

 

비트

배경에서 노래가 재생될 때, 드럼 크래시 심벌이 연주될 때마다 플래시를 트리거하고 싶다고 가정해봅시다(이는 Brass 데모 씬의 사용 사례입니다). 드럼의 각 요소에 대해 별도의 트랙이 재생된다면 비교적 쉽습니다. 하지만 전체 트랙에 대해 단일 .wav 파일을 사용하는 경우는 좀 더 까다롭습니다. 크래시 심벌이 연주되는 시간을 하드코딩할 수도 있지만, 트랙을 변경하면 어떻게 될까요? 이때 Beats가 유용합니다.

MMAudioAnalyzer는 Beats 배열을 정의할 수 있게 해줍니다. 각 Beat는 이름과 색상(순전히 조직 목적)을 가지며, 모드(위의 것들 외에도 원시 값)가 있습니다. 그런 다음 임계값을 정의해야 합니다. 이는 Beat를 트리거하는 가장 중요한 값입니다. 위의 사용 사례에서, 인스펙터에서 8개의 밴드 시각화를 보고 원하는 소리가 재생될 때마다 발생하는 패턴을 찾을 수 있습니다. Brass 데모의 경우, Band#2가 크래시 심벌이 재생될 때마다 상당히 높아지는 것을 볼 수 있습니다. 따라서 Band ID를 2로 설정하고, 밴드 값이 이를 초과할 때마다 이벤트가 발생하도록 임계값을 조정할 수 있습니다. 약간의 시행착오를 통해 이를 조정할 수 있습니다. Beats 시각화는 값이 발생하는 방법과 시점을 보여줍니다. 이 Beats는 이벤트를 트리거하는 데 사용할 수 있으며(값이 임계값을 초과할 때, 상승 시), 개별 플로트로도 볼 수 있습니다(이것이 Beats 시각화가 반영하는 것입니다). 이러한 값을 재매핑하도록 선택하고, 안전 조치로 비트 사이의 최소 시간을 정의할 수 있습니다.

각 비트에 대해 인스펙터에서 Unity Events를 바인딩할 수 있습니다. 이는 특정 소리가 재생될 때마다 피드백을 트리거하는 좋은 방법이 될 수 있습니다.

 


이 값들을 사용하는 방법

MMAudioAnalyzer 값은 여러 가지 방법으로 액세스할 수 있습니다. 가장 일반적인 방법은 스크립트를 사용하는 것입니다. MMAudioAnalyzer에 대한 참조를 사용하여 다음과 같은 작업을 할 수 있습니다:

TargetLight.intensity = TargetAnalyzer.NormalizedBufferedAmplitude * 5f;

 

이는 사운드트랙의 현재 진폭에 맞춰 조명의 강도를 설정합니다. Brass 데모의 FeelBrass 컴포넌트에서 동일한 라인을 확인할 수 있습니다. MMAudioAnalyzer의 모든 값도 동일한 방식으로 액세스할 수 있습니다. 예를 들어:

TargetAnalyzer.Beats[0].CurrentValue

 

이것은 선언한 첫 번째 비트의 현재 값을 제공합니다. 마찬가지로 각 밴드와 비트에 대한 버퍼링된 앰플리튜드, 일반 앰플리튜드 및 모든 다른 값에 접근할 수 있습니다.

Feel의 다른 클래스들도 때때로 MMAudioAnalyzer에 대한 내장 훅을 가집니다. 예를 들어, Float ControllerShader Controller는 MMAudioAnalyzer 모드를 가지며, 이를 통해 어떤 밴드나 비트를 청취하여 값을 조정할지 정의할 수 있습니다. Brass 데모 씬의 VisualizerBlocks에서는 이러한 방식으로 사용된 Float Controller의 예를 찾을 수 있습니다. ShaderController는 동일한 씬의 RightBlock에서 사용됩니다. 또한 MMRadio 시스템을 MMAudioAnalyzer와 함께 사용할 수도 있습니다. 이는 Brass 데모에서 GroundBlocks가 단일 발신기와 각 블록에 수신기를 사용하여 움직이는 방식입니다. 마지막으로, MMAudioAnalyzer의 인스펙터 자체에서 각 비트에 직접 이벤트를 바인딩하는 옵션도 항상 있습니다.

이 모든 것들은 소리를 읽고 게임을 소리와 동기화하는 다양한 방법을 제공합니다.

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

MMRadio  (1) 2024.07.14
MMSequencer  (2) 2024.07.14
MMSoundManager  (0) 2024.07.14
MMTools  (0) 2024.07.13
Tweens and events  (0) 2024.07.13

요약: 이 페이지는 MMSoundManager 시스템을 사용할 수 있는 다양한 방법을 다룹니다.

테이블 내용
  • MMSoundManager란 무엇인가?
  • MMSoundManager 설정하기
        -  3D 사운드를 재생하는 방법?

  • 트랙
  • 피드백
        -   MMSoundManager 사운드

        -   MMSoundManager 사운드 컨트롤

        -   MMSoundManager 트랙 컨트롤

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

        -   MMSoundManager 모든 사운드 컨트롤

        -   MMSoundManager 사운드 페이드

        -   MMSoundManager 트랙 페이드

        -   MMSoundManager 저장 및 로드

  • 스크립팅
        -   MMSoundManagerSoundPlayEvent

        -   MMSoundManagerSoundControlEvent

        -   MMSoundManagerSoundFadeEvent

        -   MMSoundManagerAllSoundsControlEvent

        -   MMSoundManagerTrackEvent

        -   MMSoundManagerTrackFadeEvent

        -   MMSoundManagerEvent

  • 여러 이벤트 시퀀싱
  • 현재 트랙이 사운드를 재생 중인지 확인하기
  • 사운드 매니저 설정 및 AudioMixer

 

MMSoundManager란 무엇인가?

MMSoundManager와 그것이 작동하는 클래스들은 이벤트를 사용하여 여러 트랙에서 소리를 재생하고 제어할 수 있는 시스템입니다. 이 시스템은 Unity의 AudioMixer 시스템을 기반으로 구축되었으며, 게임의 소리를 완벽하게 제어할 수 있는 간단한 인터페이스를 제공합니다. 물론, 사용하기 쉽게 하기 위해 전용 피드백도 제공됩니다. Unity의 기본 시스템을 기반으로 구축되었기 때문에 원하지 않는다면 사용하지 않아도 되며, 다른 사운드 시스템과도 평화롭게 공존할 수 있습니다.

주요 기능은 다음과 같습니다:

  • 재생/정지/일시정지/재개/해제 사운드
  • 완전한 제어: 반복, 볼륨, 피치, 팬, 공간 혼합, 바이패스, 우선순위, 리버브, 도플러 레벨, 스프레드, 롤오프 모드, 거리
  • 2D 및 3D 공간 지원
  • 내장된 풀링, 최대 성능을 위해 오디오 소스 세트를 자동으로 재활용
  • 내장 오디오 믹서 및 그룹, 미리 준비된 트랙(Master, Music, SFX, UI)과 필요에 따라 더 많은 그룹에서 재생할 수 있는 옵션
  • 전체 트랙 정지/일시정지/재개/해제
  • 모든 소리를 한 번에 정지/일시정지/재개/해제
  • 전체 트랙 음소거/볼륨 설정
  • 설정 저장 및 로드, 자동 저장/자동 로드 메커니즘 내장
  • 소리 페이드 인/아웃
  • 트랙 페이드 인/아웃
  • 솔로 모드: 하나 또는 모든 트랙을 음소거한 상태에서 소리를 재생한 후 자동으로 음소거 해제
  • 깔끔한 API 호출을 위한 PlayOptions 구조체
  • 씬 로드 간 및 씬 간 사운드 지속 옵션
  • 트랙에 대한 인스펙터 제어(볼륨, 음소거, 음소거 해제, 재생, 일시정지, 정지, 재개, 해제, 사운드 수)
  • MMSfxEvents와 같은 이전 MM 시스템 및 이벤트와의 역호환성
  • MMSoundManagerEvents: 트랙 음소거, 트랙 제어, 저장, 로드, 재설정, 지속적인 소리 정지

 

MMSoundManager 설정하기

MMSoundManager를 통해 소리를 재생하려면, 먼저 씬에 MMSoundManager가 필요합니다. 새로운 빈 오브젝트를 생성하고, 씬 계층의 루트에 배치한 다음 MMSoundManager 컴포넌트를 추가합니다. 자동으로 기본 설정 스크립터블 오브젝트가 설정될 것이며(이 상태로 두어도 괜찮습니다), MMSoundManager의 고유한 4개의 트랙 컨트롤을 볼 수 있습니다.

MMSoundManager 인스펙터와 그 4개의 트랙 컨트롤

 

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를 재생하면 줄어든 볼륨으로 소리를 들을 수 있습니다.

 

 

 

 

트랙

MMSoundManager는 트랙을 사용하여 소리를 재생하며, 이를 통해 각 트랙에 대해 전역 제어를 할 수 있습니다. 내부적으로는, 이 트랙들은 MMSoundManager에 의해 조종되는 일반 AudioMixer 그룹입니다. 이는 MMSoundManager 외부에서 직접 소리를 재생해도 모든 소리가 잘 어우러진다는 것을 의미합니다. 이 시스템은 기본적으로 UI, SFX, Music의 3가지 트랙과 나머지 3가지를 모두 제어하는 4번째 Master 트랙으로 구성됩니다. 이 3가지 트랙은 대부분의 게임에 충분하지만, 원한다면 더 많은 트랙을 사용할 수도 있습니다. 소리를 재생할 때는 올바른 트랙에서 재생하는 것이 중요합니다.

 

피드백

MMSoundManager와 상호 작용하는 가장 쉬운 방법은 피드백을 사용하는 것입니다. 이 시스템은 모든 일반적인 사용 사례를 위한 많은 피드백을 제공하며, 소리를 재생하고, 제어하고, 전체 트랙이나 모든 소리를 한 번에 제어할 수 있게 해줍니다.

 

MMSoundManager 사운드

많은 옵션들이 있습니다.

 

첫 번째로 사용해보고 싶은 피드백은 아마도 MMSoundManager Sound일 것입니다. 이 피드백은 MMSoundManager 시스템을 통해 소리를 재생할 수 있게 해줍니다. 인스펙터에서 재생하고자 하는 오디오 클립 또는 무작위로 선택할 오디오 클립 목록을 설정할 수 있습니다. 재생 모드 외에도 편리한 두 개의 테스트 버튼을 통해 소리가 어떻게 들리는지 확인할 수 있습니다. 그 후, 최소/최대 볼륨과 최소/최대 피치를 정의할 수 있습니다.

SoundManager Options 섹션에서는 소리를 재생할 트랙, ID(고유해야 하며, 나중에 특정 소리를 제어하는 데 사용됨)를 선택할 수 있습니다. 여기서 특정 오디오 그룹이나 오디오 소스를 강제로 재활용하도록 설정할 수도 있습니다. 대부분의 경우, 이 항목들을 비워두면 시스템이 알아서 처리합니다. 소리를 반복 재생하도록 설정할 수 있으며(끝에 도달하면 다시 재생), 씬 로드 간에 소리가 지속되도록 설정할 수 있습니다. 곡선에 따른 페이드를 정의하고, 선택적으로 솔로 모드를 선택할 수 있습니다.

솔로 모드에서는 소리가 재생되는 동안 다른 소리를 음소거합니다. Solo Single Track을 선택하면 특정 트랙을 선택하여 소리가 재생되는 동안 해당 트랙을 음소거합니다. Solo All Tracks를 선택하면 다른 모든 트랙을 음소거합니다. 끝에서 Auto Unsolo를 체크하면 시스템이 트랙을 음소거하고, 소리를 재생한 후 자동으로 음소거를 해제합니다.

그 외에도 공간 설정, 바이패스, 거리와 같은 다양한 옵션이 있으며, 이는 AudioSource 컨트롤입니다. 자세한 내용은 AudioSource 문서를 참조하십시오.

 

MMSoundManager 사운드 컨트롤

이 피드백은 특정 ID와 일치하는 모든 소리를 제어할 수 있게 해줍니다. 이 ID는 위에서 지정한 것과 동일합니다. 일반적으로 각 소리에 대해 고유해야 하지만, 동일한 ID와 일치하는 여러 소리가 있을 수 있으며, 이 경우 모두 동일한 명령에 응답하게 됩니다.

제어 피드백은 다음을 수행할 수 있습니다:

  • pause: 지정된 ID의 소리를 일시 정지하며, 재개할 준비를 합니다.
  • resume: 지정된 ID의 소리를 재생하며, 일시 정지된 경우 재개하고, 중지된 경우 처음부터 시작합니다.
  • stop: 소리를 일시 정지하고 재생 헤드를 파일의 시작 부분으로 이동시킵니다.
  • free: 소리를 중지하고 재생 중이던 오디오 소스를 관리자의 오디오 풀로 반환하여 다음 소리가 재생될 준비를 합니다. 이는 자원을 절약하고 성능을 향상시키는 데 도움이 됩니다. 해당 소리가 다시 필요하지 않을 때 사용하십시오.

 

MMSoundManager 트랙 컨트롤

이 피드백은 유사한 옵션(pause, resume, stop, free)을 제공하지만, 단일 소리가 아닌 전체 트랙(UI, SFX, Music, Master)에 적용됩니다.

트랙 제어 피드백은 다음을 수행할 수 있습니다:

  • pause: 지정된 트랙에서 재생 중인 모든 소리를 일시 정지하며, 재개할 준비를 합니다.
  • resume: 지정된 트랙의 모든 소리를 재생하며, 일시 정지된 경우 재개하고, 중지된 경우 처음부터 시작합니다.
  • stop: 지정된 트랙의 모든 소리를 일시 정지하고, 재생 헤드를 파일의 시작 부분으로 이동시킵니다.
  • free: 트랙의 모든 소리를 중지하고, 재생 중이던 오디오 소스를 관리자의 오디오 풀로 반환하여 다음 소리가 재생될 준비를 합니다. 이는 자원을 절약하고 성능을 향상시키는 데 도움이 됩니다. 해당 소리가 다시 필요하지 않을 때 사용하십시오.
  • set volume: 트랙의 볼륨을 지정된 값으로 설정합니다.
  • mute: 트랙의 모든 소리의 볼륨을 0으로 설정합니다.
  • unmute: 트랙의 모든 소리의 볼륨을 음소거되기 전의 값으로 설정합니다.

FeelMMSoundManagerTrackControl 데모 씬

 

Feel에는 MMSoundManager를 통해 사용할 수 있는 다양한 오디오 트랙 제어 기능을 보여주는 FeelMMSoundManagerTrackControl 데모 씬이 포함되어 있습니다. 이 데모 씬에서는 개별 트랙에서 소리를 재생하고, 볼륨을 제어하며, 트랙을 음소거/음소거 해제하고, 페이드 인/아웃을 수행할 수 있습니다. 데모 씬에 포함된 슬라이더 컴포넌트는 실제 게임에서 사용하기에 적합하므로, 자유롭게 여러분의 게임에 사용하실 수 있습니다!

 

 

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

  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 문서를 참조하십시오.

 

 

 

 

MMSoundManager 모든 사운드 컨트롤

Sound Control 및 Track Control 피드백과 유사하게, 이 피드백은 모든 소리를 한 번에 제어할 수 있게 해줍니다.

All Sounds Control 피드백은 다음을 수행할 수 있습니다:

  • pause: 모든 소리를 일시 정지하며, 재개할 준비를 합니다.
  • play: 모든 소리를 재생하며, 일시 정지된 경우 재개하고, 중지된 경우 처음부터 시작합니다.
  • stop: 모든 소리를 일시 정지하고, 재생 헤드를 파일의 시작 부분으로 이동시킵니다.
  • free: 모든 소리를 중지하고, 재생 중이던 오디오 소스를 관리자의 오디오 풀로 반환하여 다음 소리가 재생될 준비를 합니다. 이는 자원을 절약하고 성능을 향상시키는 데 도움이 됩니다. 해당 소리가 다시 필요하지 않을 때 사용하십시오.
  • free all but persistent: 장면의 모든 소리를 해제하지만, 지속적으로 유지하도록 설정된 소리는 제외합니다.
  • free all but looping: 장면의 모든 소리를 해제하지만, 반복 재생하도록 설정된 소리는 제외합니다.

 

MMSoundManager 사운드 페이드

이 피드백은 지정된 ID의 소리 볼륨을 선택한 지속 시간 동안, 선택한 트윈(tween) 방식에 따라 최종 볼륨으로 페이드 인/아웃할 수 있게 해줍니다.

 

MMSoundManager 트랙 페이드

이 피드백은 지정된 트랙의 볼륨을 선택한 지속 시간 동안, 선택한 트윈(tween) 방식에 따라 최종 볼륨으로 페이드 인/아웃할 수 있게 해줍니다.

 

MMSoundManager 저장 및 로드

이 간단한 피드백은 MMSoundManager에게 설정을 저장, 로드 또는 재설정하도록 요청할 수 있게 해줍니다. 설정은 파일에 저장되고 파일에서 로드되므로 세션 간에도 지속될 수 있습니다.

 

 

스크립팅

물론, 위에서 설명한 모든 작업을 코드로도 수행할 수 있습니다. MMSoundManager를 직접 참조하거나, 싱글톤 인스턴스(MMSoundManager.Instance.SomeMethod())를 통해 타겟팅할 수 있습니다. 이벤트를 사용하는 것이 권장되는 방법입니다(결합도를 줄이고, 씬에 사운드 매니저가 없을 경우 오류를 발생시키지 않음).

다음은 사운드를 제어할 수 있는 대부분의 이벤트입니다:

 

MMSoundManagerSoundPlayEvent

이 이벤트는 MMSoundManager에서 소리를 재생할 수 있게 해줍니다.

/// 클립(여기서는 ExplosionSfx)을 SFX 트랙에서, 이 이벤트를 호출하는 객체의 위치에서 재생합니다.
MMSoundManagerSoundPlayEvent.Trigger(ExplosionSfx, MMSoundManager.MMSoundManagerTracks.Sfx, this.transform.position);

 

위의 호출은 간단하지만, 이벤트를 트리거하고 모든 고급 옵션을 포함하거나 일부만 포함하는 구조체를 전달할 수도 있습니다:

// 새로운 옵션 구조체를 생성합니다.
MMSoundManagerPlayOptions options;
// 기본 값으로 초기화합니다.
options = MMSoundManagerPlayOptions.Default;
// 몇 가지 옵션을 재정의합니다.
options.Volume = 0.5f;
options.Priority = 200;
options.Loop = true;
// 이벤트를 호출하여 옵션을 전달하고, 소리를 재생합니다.
MMSoundManagerSoundPlayEvent.Trigger(sfx, options);

 

MMSoundManagerSoundControlEvent

MMSoundManager에서 특정 소리를 제어하는 데 사용되는 이벤트입니다. ID로 검색하거나, 오디오 소스를 직접 전달할 수 있습니다.

/// ID가 33인 소리(들)를 정지시킵니다.
MMSoundManagerSoundControlEvent.Trigger(MMSoundManagerSoundControlEventTypes.Stop, 33);

 

MMSoundManagerSoundFadeEvent

특정 소리의 볼륨을 시간에 따라 페이드시키는 데 사용되는 이벤트입니다.

/// ID가 33인 소리의 볼륨을 2초 동안 0.3으로, 탄력 곡선(elastic curve)으로 페이드 시킵니다.
MMSoundManagerSoundFadeEvent.Trigger(33, 2f, 0.3f, new MMTweenType(MMTween.MMTweenCurve.EaseInElastic));

 

MMSoundManagerAllSoundsControlEvent

이 이벤트는 MMSoundManager를 통해 재생되는 모든 소리를 한 번에 일시 정지/재생/정지/해제할 수 있게 해줍니다.

/// 모든 소리를 한 번에 정지시킵니다.
MMSoundManagerAllSoundsControlEvent.Trigger(MMSoundManagerAllSoundsControlEventTypes.Stop);

 

MMSoundManagerTrackEvent

선택된 트랙을 음소거, 음소거 해제, 재생, 일시 정지, 정지, 해제하거나 볼륨을 설정할 수 있게 해줍니다.

/// UI 트랙 전체를 일시 정지합니다.
MMSoundManagerTrackEvent.Trigger(MMSoundManagerTrackEventTypes.PauseTrack, MMSoundManager.MMSoundManagerTracks.UI);

 

MMSoundManagerTrackFadeEvent

이 이벤트는 MMSoundManager에게 지정된 FinalVolume으로 트랙 전체의 소리 볼륨을 페이드 시키도록 명령할 수 있게 해줍니다.

/// 음악 트랙의 볼륨을 2초 동안 0.5로, EaseInCubic 트윈을 사용하여 페이드 시킵니다.
MMSoundManagerTrackFadeEvent.Trigger(MMSoundManager.MMSoundManagerTracks.Music, 2f, 0.5f, new MMTweenType(MMTween.MMTweenCurve.EaseInCubic));

 

MMSoundManagerEvent

이 이벤트는 MMSoundManager 설정에서 저장/로드/재설정을 트리거할 수 있게 해줍니다.

/// 설정을 저장합니다.
MMSoundManagerEvent.Trigger(MMSoundManagerEventTypes.SaveSettings);

 

여러 이벤트 시퀀싱

여러 사용 사례에서는 위의 이벤트 중 둘 이상을 순서대로 호출하는 경우가 많습니다. 다행히도, 이는 매우 간단합니다. 예를 들어, 아래 코드는 소리를 재생한 다음 5초 동안 0으로 페이드 시키고, 최종적으로 해제합니다.

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

public class Tester : MonoBehaviour
{
    public AudioClip MyClip;
    [MMInspectorButton("Test")]
    public bool TestBtn;

    private int _mySoundID = 50;
    private float _fadeDuration = 5f;

    public void Test()
    {
        StartCoroutine(SoundSequence());
    }

    private IEnumerator SoundSequence()
    {
        // 소리를 재생합니다. 고유한 ID를 전달합니다.
        MMSoundManagerPlayOptions options;
        options = MMSoundManagerPlayOptions.Default;
        options.MmSoundManagerTrack = MMSoundManager.MMSoundManagerTracks.Music;
        options.ID = _mySoundID;
        MMSoundManagerSoundPlayEvent.Trigger(MyClip, options);

        // 소리를 페이드 아웃 시작합니다 (이전에 전달한 ID를 사용합니다)
        yield return null;
        MMSoundManagerSoundFadeEvent.Trigger(_mySoundID, _fadeDuration, 0f, new MMTweenType(MMTween.MMTweenCurve.EaseInCubic));

        // 페이드 아웃이 끝난 후 소리를 해제합니다 (여전히 같은 ID를 사용합니다)
        yield return MMCoroutine.WaitFor(_fadeDuration);
        MMSoundManagerSoundControlEvent.Trigger(MMSoundManagerSoundControlEventTypes.Free, _mySoundID);
    }
}

 

현재 트랙이 사운드를 재생 중인지 확인하기

언제든지 MMSoundManager의 HasSoundsPlaying 메서드를 사용하여 특정 트랙이 현재 소리를 재생 중인지 확인할 수 있습니다. 다음과 같이 사용할 수 있습니다:

// SFX 트랙에서 소리가 재생 중인 경우...
if (MMSoundManager.Instance.HasSoundsPlaying(MMSoundManager.MMSoundManagerTracks.Sfx))
{
    // ... 무언가를 수행합니다
}

MMSoundManager는 소리를 재생할 오디오 소스 풀을 자동으로 관리합니다. 이는 런타임 시 새로운 오디오 소스가 생성/삭제되지 않도록 하여 성능을 향상시키는 데 도움이 됩니다. MMSoundManager 자체에서 풀 크기를 정의할 수 있으며, 이는 동시에 재생할 소리의 최대 수보다 커야 합니다. 풀을 사용할 때, DoNotAutoRecycleIfNotDonePlaying:true를 설정하여 오디오 소스가 재생이 완료되지 않은 경우 재활용되지 않도록 할 수 있습니다.

 

사운드 매니저 설정 및 AudioMixer

오디오 믹서 트랙

MMSoundManager는 내부적으로 일반 AudioMixer API와 그룹을 사용하여 소리를 개별 트랙에서 재생합니다. 이를 통해 다른 시스템에서도 동일한 그룹을 타겟팅할 수 있습니다. 또한 스냅샷 및 AudioMixer 시스템의 다른 기능을 사용할 수 있습니다. 시스템은 기본 설정 스크립터블 오브젝트를 제공하지만, 필요에 따라 자신만의 설정을 생성하고 MMSoundManager에 바인딩할 수도 있습니다. 여러 개의 설정을 만들어 필요에 따라 전환할 수도 있습니다.

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

MMSequencer  (2) 2024.07.14
MMAudioAnalyzer  (1) 2024.07.14
MMTools  (0) 2024.07.13
Tweens and events  (0) 2024.07.13
Nice Vibrations  (0) 2024.07.13

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

+ Recent posts