작업 로그
- 설정창 UI 작업
- 소리 설정 관련 믹서 작업
- SettingManager.cs 및 SoundManager.cs, SoundSettingUI.cs 작업
- BGM 삽입

⇒ 처음에 SettingManager.cs에 작성했었는데 그러면 SettingManager.cs에 소리 외에도 추후에 작업할 디스플레이나 다른 설정 요소 관련 슬라이더나 버튼 등 엄청 많은 UI를 인스펙터에서 붙여야해서 이렇게 바꾸었다.
public class SettingManager : MonoBehaviour
{
public static SettingManager instance;
[Header ("패널 연결")]
[SerializeField] private GameObject soundPanel;
[SerializeField] private GameObject displayPanel;
private void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(this.gameObject);
}
else
{
Destroy(this.gameObject);
}
}
}
public class SettingManager : MonoBehaviour
{
public void OpenSoundSettings()
{
SoundManager.instance.UISoundPlay("ButtonClick");
soundPanel.SetActive(true);
displayPanel.SetActive(false);
}
public void OpenDisplaySettings()
{
SoundManager.instance.UISoundPlay("ButtonClick");
soundPanel.SetActive(false);
displayPanel.SetActive(true);
}
public void OpenSettingPanel()
{
SoundManager.instance.UISoundPlay("ButtonClick");
this.gameObject.SetActive(true);
}
public void CloseSettingPanel()
{
SoundManager.instance.UISoundPlay("ButtonClick");
this.gameObject.SetActive(false);
}
}
public class SoundSettingUI : MonoBehaviour
{
[Header ("텍스트 연결")]
[SerializeField] private TextMeshProUGUI masterVolText;
[SerializeField] private TextMeshProUGUI bgmVolText;
[SerializeField] private TextMeshProUGUI uiVolText;
[SerializeField] private TextMeshProUGUI sfxVolText;
[SerializeField] private TextMeshProUGUI playerVolText;
[Header ("슬라이더 연결")]
[SerializeField] private Slider masterSlider;
[SerializeField] private Slider bgmSlider;
[SerializeField] private Slider sfxSlider;
[SerializeField] private Slider uiSlider;
[SerializeField] private Slider playerSlider;
public void OnMasterSliderChanged(float val)
{
SoundManager.instance.SetMasterVolume(val);
masterVolText.text = Mathf.RoundToInt(val*100).ToString();
}
public void OnUISliderChanged(float val)
{
SoundManager.instance.SetUIVolume(val);
uiVolText.text = Mathf.RoundToInt(val*100).ToString();
}
public void OnSFXSliderChanged(float val)
{
SoundManager.instance.SetSFXVolume(val);
sfxVolText.text = Mathf.RoundToInt(val*100).ToString();
}
public void OnBGMSliderChanged(float val)
{
SoundManager.instance.SetBGMVolume(val);
bgmVolText.text = Mathf.RoundToInt(val*100).ToString();
}
public void OnPlayerSliderChanged(float val)
{
SoundManager.instance.SetPlayerVolume(val);
playerVolText.text = Mathf.RoundToInt(val*100).ToString();
}
void Start()
{
//게임 시작 시 소리 초기 세팅
LoadSettings();
}
//소리 재생 관련 메소드들
public void SFXPlay(string sfxName)
{
if (sfxDictionary.TryGetValue(sfxName, out AudioClip clip))
{
sfxSource.PlayOneShot(clip);
}
else
{
Debug.Log("Audio Clip이 없음");
}
}
public void UISoundPlay(string soundName)
{
if (sfxDictionary.TryGetValue(soundName, out AudioClip clip))
{
uiSource.PlayOneShot(clip);
}
else
{
Debug.Log("Audio Clip(UI) 없음");
}
}
public void BGMPlay()
{
Debug.Log("BGM Play 메소드 SoundManager에서 실행");
if (sfxDictionary.TryGetValue("BGM", out AudioClip clip))
{
bgmSource.clip = clip;
bgmSource.Play();
}
}
#region 소리 볼륨 설정 관련 메소드
public void SetVolume(string paramName, float sliderVal)
{
//믹서 볼륨은 데시벨 단위 쓰기 때문에 로그 계산
float vol = Mathf.Log10(Mathf.Max(0.0001f, sliderVal)) * 20;
//paramName = 믹서에서 정한 'Exposed Parameter'의 이름이어야함
masterMixer.SetFloat(paramName, vol);
//데이터 저장
PlayerPrefs.SetFloat(paramName, sliderVal);
}
public void LoadSettings()
{
string[] paramsToLoad = {"MasterVol", "BGMVol", "SFXVol", "PlayerVol", "UIVol"};
foreach (string p in paramsToLoad)
{
float savedValue = PlayerPrefs.GetFloat(p, 1f);
SetVolume(p, savedValue);
}
}
public void SetMasterVolume(float val) => SetVolume("MasterVol", val);
public void SetBGMVolume(float val) => SetVolume("BGMVol", val);
public void SetUIVolume(float val) => SetVolume("UIVol", val);
public void SetSFXVolume(float val) => SetVolume("SFXVol", val);
public void SetPlayerVolume(float val) => SetVolume("PlayerVol", val);
#endregion
LoadSettings()와 SetVolume()을 사용해서 처리.PlayerPrefs가 이미 존재하기(약간 printf 같이 이미 있는 라이브러리)에 거기에 저장해주면 된다고 해서 PlayerPrefs를 사용해 볼륨값을 저장하고 있음ReadyManager.cs 쪽의 Start() 메소드 안에 BGM 시작 메소드를 작성해두었는데…void Start()
{
// 방장이 씬 로딩하면 나머지 플레이어도 자동으로 따라가게 설정
PhotonNetwork.AutomaticallySyncScene = true;
SoundManager.instance.BGMPlay();
Debug.Log("BGM재생");
// 로비에 들어오면 커스텀 프로퍼티 정보들 모두 초기화
Hashtable props = new Hashtable();
props.Add("IsDead", false);
props.Add("Job", "None"); // 직업 기본값은 None 추가
props.Add("IsReady", false);
PhotonNetwork.LocalPlayer.SetCustomProperties(props);
// 버튼 이벤트 리스너 등록
readyButton.onClick.AddListener(OnClickReadyButton);
leaveButton.onClick.AddListener(OnClickLeaveButton);
startButton.onClick.AddListener(StartGame);
UpdateStartButtonState();
}
회고
슬슬 마무리하는 주차라 작업량이 많지는 않다. 사실 무엇보다 화면 관련 설정한 18일 작업 로그를 안써서 더 양이 적다. 당시에 남은 일들을 지금껏 팀원들이 했던 파트에 따라 2주차 분량을 나눴는데 7주차에 개인적으로 다른 일로 바쁠 수도 있어서 좀 빨리 미리 진행한 감이 있다. 그런데 일정도 사라지고, 생각보다 시간이 많이 남아서 인게임 보이스 기능을 넣고 싶어서 시도했는데 이후에 회의 때 팀원들이랑 여러번 테스트해도 이루어지지 않아서 결국 포기하고 채팅만 사용하는 방식으로 진행할 것 같다.