코드 및 공부/오디오

오디오 믹서 (2)

ekrxjvpvj0110 2024. 9. 19. 00:47

유니티 버전 - 2022.3.44f1

 

 

 

 

 

목차


  • 들어가며
  • 코드 개선점
    • 코드 개선점
  • 코드 개선하기
    • 개선
  • 실행 결과
    • 실행결과
  • 마치며
    • 간단 정리

 

 

 

 

 

들어가며


저번과 이어지는 내용입니다, 아래를 참고해주시길 바랍니다

 

 

 

 

 

코드 개선점


1. PlayerPrefs를 이용하여 간단한 저장 기능을 추가했습니다

 

2. 토글을 이용하여 음소거 및 슬라이더 조절 제한 기능을 추가했습니다

 

 

 

 

 

코드 개선하기


전체 코드중에서 저번과 비교하여 바뀐 부분만 설명하겠습니다

 

 

 

선언부

[SerializeField] Toggle masterToggle, musicToggle, sfxToggle; // 토글을 이용한 음소거

private bool isOnMaster = true;
private bool isOnMusic = true;
private bool isOnSFX = true; // 음소거 여부에 따른 추가 로직을 위한 변수

private float masterVolume;
private float musicVolume;
private float sfxVolume; // 볼륨 값을 저장하기 위한 변수

 

 

 

Awake()

private void Awake()
{
    masterSlider.value = PlayerPrefs.GetFloat("Master", 0.5f);
    musicSlider.value = PlayerPrefs.GetFloat("Music", 0.5f);
    sfxSlider.value = PlayerPrefs.GetFloat("SFX", 0.5f);
}

PlayerPrefs에 저장된 값을 value로 설정해줍니다, 만약 값이 없다면 0.5f로 설정해줍니다

 

 

 

Start()

private void Start() // 저장된 값을 불러온 후 초기 세팅
{
    SetMasterVolume();
    SetMusicVolume();
    SetSFXVolume();
}

 

 

 

SetXXXVolume()

float volume = Mathf.Clamp(masterSlider.value, 0.001f, 1.0f);
masterVolume = volume; // 바로 PlayerPrefs에 저장시키는게 아니라 변수에 먼저 저장합니다
myMixer.SetFloat("Master", Mathf.Log10(volume) * 20);

 

 

 

OnMasterToggle()

if (isOnMaster) // 토글 클릭시 isOnMaster가 true라면 (초기상태는 true)
{
    isOnMaster = false; // 반전

    SetState(false); // master 토글 제외한 토글과 슬라이더를 비활성화 합니다

    myMixer.SetFloat("Master", Mathf.Log10(0.001f) * 20); // 음소거
}
else // isOnMaster == false
{
    isOnMaster = true; // 반전

    SetState(true); // 모든 토글과 슬라이더 활성화

    SetMasterVolume(); // 음소거 해제

    if (!isOnMusic) // isOnMusic이 false라면
    {
        isOnMusic = true; // 반전
        OnMusicToggle(); // 슬라이더 활성화 및 음소거 해제
        musicToggle.isOn = false; // 토글의 isOn 을 false로 설정합니다
    }

    if (!isOnSFX) // isOnSFX가 false라면
    {
        isOnSFX = true; // 반전
        OnSFXToggle(); // 슬라이더 활성화및 음소거 해제 
        sfxToggle.isOn = false; // 토글의 isOn을 false로 설정합니다
    }
}

 

 

 

OnMusicToggle(), OnSFXToggle()

public void OnMusicToggle()
{
    if (isOnMusic)
    {
        isOnMusic = false; // 반전
        musicSlider.interactable = false; // 슬라이더 비활성화
        myMixer.SetFloat("Music", Mathf.Log10(0.001f) * 20); // 음소거
    }
    else
    {
        isOnMusic = true;
        musicSlider.interactable = true; // 슬라이더 활성화
        SetMusicVolume(); // 음소거 해제
    }
}

public void OnSFXToggle()
{
    if (isOnSFX)
    {
        isOnSFX = false;
        sfxSlider.interactable = false;
        myMixer.SetFloat("SFX", Mathf.Log10(0.001f) * 20);
    }
    else
    {
        isOnSFX = true;
        sfxSlider.interactable = true;
        SetSFXVolume();
    }
}

 

 

 

SetState(bool p_Flag)

 public void SetState(bool p_Flag)
 {
     masterSlider.interactable = p_Flag;
     musicSlider.interactable = p_Flag;
     sfxSlider.interactable = p_Flag;

     musicToggle.interactable = p_Flag;
     sfxToggle.interactable = p_Flag;
 }
 
 // 마스터 토글 조작시 이용합니다, 슬라이더들과 나머지 토글을 비활성화합니다

 

 

 

private void OnDisable()

    private void OnDisable()
    {
        // PlayerPrefs.SetFloat("키 값", 변수)
        
        PlayerPrefs.SetFloat("Master", masterVolume);
        PlayerPrefs.SetFloat("Music", musicVolume);
        PlayerPrefs.SetFloat("SFX", sfxVolume);
        
        PlayerPrefs.Save(); // 저장합니다
    }

 

 

 

 

 

실행결과


첫번째로 저장 기능이 잘 구현되었음을 확인할 수 있었습니다

 

 

 

두번째로 master, music, sfx 별로 토글의 작동과 슬라이더의 이동 제한이 잘 구현되었음을 확인할 수 있었습니다

체크 표시와 함께 슬라이더가 약간 투명해지며 마우스로 잡을 수 없게 되었습니다

 

 

 

세번째로 마스터 토글을 이용했을 경우입니다

화살표 순서대로 설명드리자면

 

1. music과 sfx의 토글을 체크하자 둘의 슬라이더가 비활성화 되었습니다

 

2. master의 토글을 체크하자 master의 슬라이더와 music 및 sfx의 토글이 비활성화 되었습니다

 

3. master의 토글을 해제하자 모든 기능을 이용할 수 있게 활성화 되었습니다

 

 

 

 

 

마치며


오늘은 ChangeVolume을 개선시켜보았습니다

 

토글 버튼은 UI에 있으며 저번에 설명한 슬라이더 조작하는 것처럼 On Value Changed를 수정해주면 됩니다

 

마스터의 토글을 풀었을때 전체가 풀리는게 아니라 둘 중 뮤트상태였던 것을 기억하도록 만들어도 좋을 것 같습니다

 

이상입니다

'코드 및 공부 > 오디오' 카테고리의 다른 글

오디오 믹서 (1)  (4) 2024.09.18
오디오 매니저를 이용한 Audio Source 관리  (2) 2024.09.17