유니티 버전 - 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 |