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
[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 |