[Unity] UI 6 : Control(환경설정 UI)

UI Control

UI Control의 역할

  • 환경 설정 기능을 구현한다.
  • 해상도, 화면 모드(전체화면, 창), 품질(게임 퀄리티) 설정 기능
  • 사운드(슬라이더 볼륨 조절, 음소거, 현재 볼륨 표시) 설정 기능

 

필요한 변수들 선언

using UnityEngine;
using UnityEngine.UI;

public class UI_6_Control : MonoBehaviour
{
    private static UI_6_Control instance = null;

    // UI Window
    public GameObject UI_W_Control = null;

    // Detail
    public Dropdown screenModeDropdown;
    public Dropdown resolutionDropdown;
    public Dropdown qualityDropdown;

    public Slider masterSlider;
    public Slider bgmSlider;
    public Slider sfxSlider;

    public Button MasterButton;
    public GameObject MasterVolumeBaseImage;
    public GameObject MasterVolumeMuteImage;
    public Text MasterVolumeText;

    public Button BGMButton;
    public GameObject BGMVolumeBaseImage;
    public GameObject BGMVolumeMuteImage;
    public Text BGMVolumeText;

    public Button SFXButton;
    public GameObject SFXVolumeBaseImage;
    public GameObject SFXVolumeMuteImage;
    public Text SFXVolumeText;

    // Manager
    private SoundManager soundManager = null;

    public static UI_6_Control Instance
    {
        get
        {
            if (instance == null)
            {
                instance = FindObjectOfType<UI_6_Control>();

                if (instance == null)
                {
                    GameObject singletonObject = new GameObject(typeof(UI_6_Control).Name);
                    instance = singletonObject.AddComponent<UI_6_Control>();
                    DontDestroyOnLoad(singletonObject);
                }
            }
            return instance;
        }
    }
    
    ...
}

중요한 역할을 하는 변수들은 다음과 같다.

  • instance
    • UI_6_Control 클래스의 싱글톤 인스턴스를 저장하고 관리하며, 전역적으로 접근 가능한 정적 변수

환경 설정에서는 이름에 무슨 오브젝트가 할당되어 있는지 명확하게 알 수 있다.

 

기본 함수(Awake, Start, Update)

using UnityEngine;
using UnityEngine.UI;

public class UI_6_Control : MonoBehaviour
{
    ...

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

    // Start is called before the first frame update
    void Start()
    {
        soundManager = SoundManager.Instance;

        // ControllOptionUI Setting
        screenModeDropdown.onValueChanged.AddListener(delegate { ChangeScreenMode(screenModeDropdown.value); });
        resolutionDropdown.onValueChanged.AddListener(delegate { ChangeResolution(resolutionDropdown.value); });
        qualityDropdown.onValueChanged.AddListener(delegate { ChangeQuality(qualityDropdown.value); });

        masterSlider.onValueChanged.AddListener(SetMasterVolume);
        bgmSlider.onValueChanged.AddListener(SetBGMVolume);
        sfxSlider.onValueChanged.AddListener(SetSFXVolume);

        MasterButton.onClick.AddListener(FMasterButton);
        MasterVolumeMuteImage.SetActive(false);

        BGMButton.onClick.AddListener(FBGMButton);
        BGMVolumeMuteImage.SetActive(false);

        SFXButton.onClick.AddListener(FSFXButton);
        SFXVolumeMuteImage.SetActive(false);
    }

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

    }
    
    ...
}

Awake()

싱글톤 인스턴스 설정과 씬 전환 시 객체를 유지하게 만들고, 현재 오브젝트가 기존 인스턴스와 다른 경우 파괴하도록 만들어줬다.

Start()

SoundManager에서 현재 볼륨 값을 불러와 사용해야 하므로 인스턴스를 초기화해 줬다.

또한 드롭다운 이벤트 리스너를 추가하고, 슬라이더 값 변경 이벤트와 음소거 기능을 담당하는 버튼에 함수를 연결했다.

 

UI Active 관련 함수

using UnityEngine;
using UnityEngine.UI;

public class UI_6_Control : MonoBehaviour
{
    ...

    public void OpenUI()
    {
        if (UI_W_Control != null)
        {
            UI_W_Control.SetActive(true);
        }
    }

    public void CloseUI()
    {
        if (UI_W_Control != null)
        {
            UI_W_Control.SetActive(false);
        }
    }
    
    ...
}

UI 매니저에서 각각의 UI 요소들의 Active 상태를 제어하는 OpenUI, CloseUI 함수를 정의해  유지보수성을 높였다.

상태 변화를 제어하는 것을 이 함수들을 사용하는 것으로 한정해 불필요한 활성화/비활성화로 부작용을 방지하도록 만들었다.

 

화면 관련 환경설정(창 모드, 해상도, 품질)

using UnityEngine;
using UnityEngine.UI;

public class UI_6_Control : MonoBehaviour
{
    ...

    // ScreenMode
    public void ChangeScreenMode(int index)
    {
        switch (index)
        {
            case 0:
                Screen.fullScreenMode = FullScreenMode.FullScreenWindow;
                Debug.Log("전체화면 모드");
                break;
            case 1:
                Screen.fullScreenMode = FullScreenMode.Windowed;
                Debug.Log("창모드");
                break;
            default:
                Debug.LogWarning("Error");
                break;
        }
    }

    // Resolution
    public void ChangeResolution(int index)
    {
        switch (index)
        {
            case 0: // 1920 x 1080
                Screen.SetResolution(1920, 1080, Screen.fullScreen);
                break;
            case 1: // 1600 x 900
                Screen.SetResolution(1600, 900, Screen.fullScreen);
                break;
            case 2: // 1280 x 720
                Screen.SetResolution(1280, 720, Screen.fullScreen);
                break;
            default:
                break;
        }
    }

    public void ChangeQuality(int index)
    {
        switch (index)
        {
            case 0: // 좋음
                QualitySettings.SetQualityLevel(5, true);
                break;
            case 1: // 중간
                QualitySettings.SetQualityLevel(3, true);
                break;
            case 2: // 낮음
                QualitySettings.SetQualityLevel(1, true);
                break;
            default:
                break;
        }
    }
    
    ...
}

Unity에서 제공하는 Screen, QualitySettings를 사용하여 해당 기능을 구현했다.

QualitySettings.SetQualityLevel() 메서드는 0~5 단계로 퀄리티를 조절할 수 있다.(0은 가장 낮은 품질, 5는 가장 좋은 품질)

 

Audio 관련 설정(Silder Volume Control, Mute)

using UnityEngine;
using UnityEngine.UI;

public class UI_6_Control : MonoBehaviour
{
    ...

    // Audio
    public void SetMasterVolume(float volume)
    {
        soundManager.SetMasterVolume(volume);
        float VolumeText = ((volume + 40) / 40) * 100;
        MasterVolumeText.text = $"{VolumeText:F0}";
    }

    public void SetBGMVolume(float volume)
    {
        soundManager.SetBGMVolume(volume);
        float VolumeText = ((volume + 40) / 40) * 100;
        BGMVolumeText.text = $"{VolumeText:F0}";
    }

    public void SetSFXVolume(float volume)
    {
        soundManager.SetSFXVolume(volume);
        float VolumeText = ((volume + 40) / 40) * 100;
        SFXVolumeText.text = $"{VolumeText:F0}";
    }

    public void FMasterButton()
    {
        if (!soundManager.MasterVolumeMute) // 음소거 상태 아닐때
        {
            MasterVolumeBaseImage.SetActive(false);
            MasterVolumeMuteImage.SetActive(true);
        }
        else
        {
            MasterVolumeBaseImage.SetActive(true);
            MasterVolumeMuteImage.SetActive(false);
        }
        soundManager.MasterVolumeMute = !soundManager.MasterVolumeMute;
        SetMasterVolume(soundManager.MasterVolume);
    }

    public void FBGMButton()
    {
        if (!soundManager.BGMVolumeMute) // 음소거 상태 아닐때
        {
            BGMVolumeBaseImage.SetActive(false);
            BGMVolumeMuteImage.SetActive(true);
        }
        else
        {
            BGMVolumeBaseImage.SetActive(true);
            BGMVolumeMuteImage.SetActive(false);
        }
        soundManager.BGMVolumeMute = !soundManager.BGMVolumeMute;
        SetBGMVolume(soundManager.BGMVolume);
    }

    public void FSFXButton()
    {
        if (!soundManager.SFXVolumeMute) // 음소거 상태 아닐때
        {
            SFXVolumeBaseImage.SetActive(false);
            SFXVolumeMuteImage.SetActive(true);
        }
        else
        {
            SFXVolumeBaseImage.SetActive(true);
            SFXVolumeMuteImage.SetActive(false);
        }
        soundManager.SFXVolumeMute = !soundManager.SFXVolumeMute;
        SetSFXVolume(soundManager.BGMVolume);
    }
    
    ...
}

Mute 기능은 ~~VolumeMute 값을 true로 바꿔주면 SoundManager에 있는 Set~~Volume 함수에서 체크해서 음소거 상태로 만들어준다.

 

참고 사항

UI Manager

https://gdoo.tistory.com/39

 

[Unity] UI Manager 구현

UI ManagerUI Manager 기본정보큰 UI의 틀이 있고 버튼을 통해 총 7개의 화면 전환이 있어야 한다.기본 정보를 보여주는 UI게임 기능인 프로그램의 정보를 띄워주는 UI인벤토리처럼 획득한 아이템 리스

gdoo.tistory.com

 

마무리하며..

환경 설정은 유니티에서 제공하는 기능이 많아 구현하는 것에 큰 어려움이 없었다.

'Unity > Hackers Window' 카테고리의 다른 글

[Unity] UI 8 : ProgramInstall  (0) 2024.11.25
[Unity] UI 5, 7 - NetWork, Help  (1) 2024.11.24
[Unity] UI 3 : MyDocument(Inventory UI)  (0) 2024.11.22
[Unity] UI 3 : DownLoad  (0) 2024.11.21
[Unity] UI 2 : MyPC(Status UI)  (0) 2024.11.20