TIL_240102

Z_제트·2024년 1월 2일
0

TODAY I LEARNED

목록 보기
45/88
post-thumbnail

to do_오늘 할 일

  • 알고리즘 문제풀기
  • 팀과제 ing

retro_오늘 한 일(회고)

팀과제 진행상황

오늘의 작업 :

  • BGM 추가하기
  • Slider 로 볼륨 조절하기 구현
  • UI - Settings 틀 만들기

BGM 추가하기

  • SoundManager 오브젝트 및 스크립트 생성
  • AudioSource 에서 Play On Awake 와 Loop 체크 설정

SoundManager.cs

using UnityEngine;

public class SoundManager : MonoBehaviour
{
    public static SoundManager instance;

    private AudioSource audioSource; // 음악 플레이할 친구
    [SerializeField] private AudioClip bgm; // 음악 파일 그 자체

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
        else if (instance != this)
        {
            Destroy(this);
        }

        audioSource = GetComponent<AudioSource>();
        DontDestroyOnLoad(gameObject);
    }

    // Start is called before the first frame update
    private void Start()
    {
        PlayBGM();
    }

    private void PlayBGM()
    {
        audioSource.clip = bgm;
        audioSource.Play();
    }

    // Update is called once per frame
    //void Update()
    //{

    //}
}

// 싱글톤 익숙해지기 연습



이제 slider 를 활용해서 볼륨 조절하기 도전 !

볼륨 조절하기 w/ Slider

참고_유튜브

  1. UI 의 Slider 준비 (+ AudioSource 달려있는 오브젝트도 미리 준비)

  2. Assets 안에 Create - AudioMixer

  3. AudioSource 컴포넌트 안에 Output 에 Mixer 만든거 연결해주기

  4. Slider 오브젝트의 Min Value 값 0.0001, Max Value 값 1 로 설정

  5. 만든 Mixer 의 Master 클릭 후 Inspector 창에서 Volume 우클릭 후 Expose 'Volume (of Master)' to script 클릭

  6. AudioMixer 에 보면 Exposed Parameters 가 Exposed Parameters (0) 부분이 (1) 로 바뀜 ! 원하는 이름 바꿔주기

  7. VolumeControl.cs 만들어서 Slider 오브젝트에 달아주기

    • 네임스페이스 추가 using UnityEngine.Audio;

VolumeControl.cs


using UnityEngine;
using UnityEngine.Audio;

public class VolumeControl : MonoBehaviour
{
    [SerializeField] private AudioMixer audioMixer;

    public void SetLevel(float sliderValue)
    {
    	// instead of just directly setting the sliderValue, we need to convert it into logarithmic value ! 
        //Mathf.Log10() 을 통해 convert 진행하자
        audioMixer.SetFloat("BGMVol", Mathf.Log10(sliderValue) * 20 );         
    }
}
  1. Slider 의 On Value Changed Field 에 Slider 오브젝트 drag&drop 해주고 VolumeControl - Dynamic float 아래 있는 SetLevel 선택하기
  1. Slider 의 기본 value 는 0.5 로 설정.
    (1 로 하니까 소리 너무 커짐 이슈 발생 ,,)

나는 VolumeControl.cs 에서 value 를 0.5f 로 지정해줌.

using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.UI;

public class VolumeControl : MonoBehaviour
{
    [SerializeField] private AudioMixer audioMixer;
    private Slider soundSlider;

    private void Awake()
    {
        soundSlider = GetComponent<Slider>();
    }

    private void Start()
    {
        soundSlider.value = 0.5f;
    }

    public void SetLevel(float sliderValue)
    {
        // instead of just directly setting the sliderValue, we need to convert it into logarithmic value !
        // Mathf.Log10() 을 통해 convert 진행하자
        audioMixer.SetFloat("BGMVol", Mathf.Log10(sliderValue) * 20 ); 
    }
}

중요 :

Slider value range is linear while the mixer fader range is logarithmic.

  • Linear value 은 사운드 조절하기 힘들어서(too sensitive) Logarithmic 으로 변환해주는 것이 좋다.

    Slider 의 Min Value 0.0001을 대입하면 -80, Max Value 1을 대입하면 0 이 나온다.

  • .SetFloat 첫번째 매개변수는 AudioMixer 에서 만든 Exposed Parameters 이름이다.


에러 수정

에러 :
Setting 버튼 누르기 전에는 볼륨이 큰데 버튼 누르면 볼륨이 작아지는 이슈.

해결 :
SoundManager.cs 에서 애초에 시작 볼륨을 0.5f 로 설정하고,
VolumeControl.cs 에서 Slider 의 1 값 = BGM 볼륨 0.5f 가 되게끔 코드 수정.

SoundManager.cs

using UnityEngine;

public class SoundManager : MonoBehaviour
{
    public static SoundManager instance;

    private AudioSource audioSource; // 음악 플레이할 친구
    [SerializeField] private AudioClip bgm; // 음악 파일 그 자체

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
        else if (instance != this)
        {
            Destroy(this);
        }

        audioSource = GetComponent<AudioSource>();
        DontDestroyOnLoad(gameObject);
    }

    // Start is called before the first frame update
    private void Start()
    {
        PlayBGM();
    }

    private void PlayBGM()
    {
        audioSource.clip = bgm;
        audioSource.volume = 0.5f;
        audioSource.Play();
    }    
}

VolumeControl.cs

using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.UI;

public class VolumeControl : MonoBehaviour
{
    [SerializeField] private AudioMixer audioMixer;
    private Slider soundSlider;

    private void Awake()
    {
        soundSlider = GetComponent<Slider>();
    }

    private void Start()
    {
        soundSlider.value = 1f;
    }

    public void SetLevel(float sliderValue)
    {
        // instead of just directly setting the sliderValue, we need to convert it into logarithmic value !
        // Mathf.Log10() 을 통해 convert 진행하자
        audioMixer.SetFloat("BGMVol", Mathf.Log10(sliderValue) * 20 ); 
    }
}

Happy New Year

profile
trying to make the world a better place with a cool head and warm heart

0개의 댓글