본문 바로가기
코딩/연습

유니티 : 해상도와 사운드 조절

by gold_koi 2023. 4. 14.

메인프로젝트를 시작하기 전에 각자 실력증진을 위해 노력하고 있다.

혼자서는 절대 할 수 없을 것만 같았는데, 여기저기 찾아보며 블로그까지 쓰는 나를 보니 뿌듯하기도 하다ㅎ

진도 쭉쭉빼고 얼른 메인프로젝트에 발을 내밀어보고싶다.


 

오늘은 잡담없이, 바로 본론으로 들어가겠다.

 

해상도 조절


저번 메뉴에서 조금 더 응용하여 만든 간단한 메뉴 UI이다.

 

이 전의 게시글에서는 키 바인딩을 다뤘으므로, 이번에는 사운드설정과 해상도설정을 알아보자.

 

해상도 설정 UI

해상도 설정에는 풀스크린 여부를 체크하는 토글버튼, 해상도를 선택할 수 있는 드롭다운, 적용할 수 있는 버튼 총 세가지의 UI개체들이 있다.

 

드롭다운에서 해상도를 선택하려면 먼저 드롭다운에 해상도를 넣어주어야한다.

그리고 public으로 선언하여 유니티에서 해상도토글을 받아오자.

또한, 적용버튼에 쓰일 토글버튼도 미리 받아온다.

List<Resolution> resolutions= new List<Resolution>();
public TMP_Dropdown resolutionDropdown;
public Toggle fullScreenToggle;
public int resolutionNum;

해상도 리스트는 Screen.resolutions에 읽기 전용으로 화면의 너비(width), 높이,(height), refreshrate(hz)가  저장되어있다.

이것들을 다루기 위해 임의의 List를 하나 만들어 넣어주자.

 

for(int i=0;i<Screen.resolutions.Length;i++)
        {
            if (Screen.resolutions[i].refreshRate==60)
                resolutions.Add(Screen.resolutions[i]);
        }
        resolutionDropdown.options.Clear();

그런 다음 기존 드롭다운에 있던 옵션들을 전부 날려주고 resolutions를 저장해준다.(여기서는 조건문으로 60hz인 해상도만 걸러서 저장한다)

 

현재 우리가 만든 resolutions 리스트에는 60hz인 해상도들이 주르륵 저장되어있는 상태이다.

이 리스트를 드롭다운메뉴에 저장해주려면, 드롭다운의 option.text에 넣어주면 된다.

그런 상태에서, 현재 모니터의 해상도와 드롭다운의 해상도가 일치하면 그 해상도를 제일 위로 올려주는 코드도 넣어주고 새로고침해준다.

 

int optionNum = 0;
        foreach(Resolution item in resolutions) {
            TMP_Dropdown.OptionData option = new TMP_Dropdown.OptionData();
            option.text = item.width + " x " + item.height+" " + item.refreshRate+"hz";
            resolutionDropdown.options.Add(option);
        
            if(item.width==Screen.width&&item.height==Screen.height)
                resolutionDropdown.value = optionNum;
            optionNum++;
        } 
        resolutionDropdown.RefreshShownValue();

드롭다운은 각 옵션마다 value가 정해져있다. 우리가 선택한 옵션을 value로 받아오면, resolutions 리스트에 대입하여 높이 너비를 가져오면 된다! 위에서부터 순서대로 0 오름차순이니 이것을 토대로 드롭다운에 들어갈 코드를 짜보자.

public void DropboxOptionChange(int x)
    {
        resolutionNum = x;
    }

정말 단순하다. 그저 인자만 받아오면 되는것이다.

 

마지막으로 적용버튼이다. resolutionNum으로 플레이어가 선택한 해상도를 알아낼 수 있고, fullscreen토글로 창모드 여부를 체크할 수 있다.

 

public void ClickApply()
    {
        Screen.SetResolution(resolutions[resolutionNum].width,
            resolutions[resolutionNum].height,fullScreenToggle.isOn);
    }

먼저 알아두어야 할 것이 있다.

 

내 모니터는 144hz이다. 그래서 이 스크립트를 컴포넌트하고 유니티에디터에서 실행한들, 60hz는 찾을 수 없어 드롭다운메뉴는 빈 깡통으로 나온다.

 

그렇기에 여러분도 테스트를 하고 싶다면 에디터를 이용하지말고 빌드 후 실행해보자.

 

 

사운드 조절


다음은 사운드 조절이다.

 

사운드 설정 패널

 

사운드는 배경음악과 효과음 두개로 나눠서 진행하겠다.

 

게임 속에는 크게 두가지 소리가 있다. 배경으로 깔린 음악과 여러 군데에서 나는 효과음이 바로 그것이다.

배경음악이야 하나의 오디오소스로 실행하면 해결이 되겠다만, 효과음은 정말 많은 객체에서 재생이 되기 때문에 관리하기에 여간 까다로울 것이다.

이 때 필요한 것이 오디오 믹서이다. 오디오믹서는 말로 설명하기보단, 사진을 봐보자.

오디오믹서.

 

오디오믹서를 만들기 위해선 먼저 프로젝트의 원하는 곳에 우클릭하여 오디오믹서를 만들어준다.

그 후 , Groups 에서 마스터의 하위그룹으로 BGM과 SFX를 만들어주자. 이름은 마음대로 바꿔도 상관없다.

배경음악과 효과음이 나오는 오디오소스의 output에 각각에 알맞는 그룹을 선택해준다.

 

사운드를 재생해보면 오디오비쥬얼라이져가 요동치는 것을 볼수 있다!

 

이들을 스크립트에서 제어하려면 파라미터를 추가해주어야한다.

 

만드는 방법은 간단하다.

프로젝트의 오디오믹서를 열어보면 우리가 만든 그룹이 있을텐데, 원하는 그룹을 선택하여 인스펙터창의 Attenuation의 빈곳을 우클릭하면 Expose 'Volume (of SFX) to script가 있는데 이것을 눌러주자.

우리는 BGM과 SFX 두개만 다룰 것이기 때문에 파라미터를 두개만 만들 것이지만 마스터볼륨도 조절하고싶다면 마스터 볼륨까지 만들어주자.

 

오디오믹서 탭의 우측 상단을 보면 Exposed Parameters에 우리가 만든 그룹들이 추가가 된것을 볼 수있다.

요놈들을 우클릭하여 원하는대로 이름을 바꿔주자.

나는 편하게 Master, BGM, SFX로 바꾸었다.

 

이제 스크립트에서 제어해보자.

 

먼저 사운드 창의 슬라이더 두개를 퍼블릭으로 받아온다.

그리고 출력은 오디오믹서에서 담당하기에 오디오믹서도 퍼블릭으로 받아오겠다.

 

그냥 봐라... 보면 다 안다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.UI;

public class SoundOption : MonoBehaviour
{
    public AudioMixer audioMixer;

    public Slider bgmSlider;
    public Slider sfxSlider;

    public void SetBGMVolume()
    {
        audioMixer.SetFloat("BGM", Mathf.Log10(bgmSlider.value) * 20);
    }
    public void SetSFXVolume()
    {
        audioMixer.SetFloat("SFX", Mathf.Log10(sfxSlider.value) * 20);
    }
}

이 스크립트를 사운드패널에 넣어주고 각각의 슬라이더의 On Value Changed에 알맞는 함수들을 넣어주면 !

 

조절이 된다.

 

로그함수를 넣어놓은 이유는 스크롤시 더 매끄러운 볼륨 조절을 가능케 하기 떄문이다.

 

 

 

 

 

 

 

이로써 우리는 esc를 누르면 나오는 메뉴를 전부 구현했다!!

 

메인프로젝트에 분명 도움이 될 것이다.... 나는 한 발짝 더 진보했다..

 

이대로 계속 증진하자!!

 

 

 

끝.

'코딩 > 연습' 카테고리의 다른 글

혼자 만든 테스트씬  (0) 2023.09.23
유니티 : 키 바인딩  (2) 2023.04.13
유니티 : 캔버스로 메뉴 만들기  (0) 2023.04.11
유니티 : Scene에 대한 것들 정리  (2) 2023.04.11