Unity 엔진 공부/project2

project2 개발일지 - 6 [Setting UI 기능 연결2]

EJH 2025. 7. 29. 19:21
반응형

Setting UI 기능 연결2 목표

세팅을 저장하고 되돌리는 기능을 구현한다.

버튼은 비활성화 상태에서 세팅을 바꿀 경우 활성화된다.

이전 상태값과 현재 상태값을 비교해야 할 것 같다.

 

1. 저장, 되돌리기 버튼

오른쪽 위에 비활성화 상태의 버튼을 두개 배치한다.

Interactable을 꺼주면 비활성화 상태가 된다.

 

2. 이전 상태 저장하기

저장 버튼을 활성화 하려면 이전 상태와 현재 상태를 비교해야한다.

따라서 리스트로 각 설정의 값을 튜플 형태로 저장해준다.

private List<(Slider slider, float original)> _sliders = new();
private List<(TextMeshProUGUI tmp, KeyCode original)> _keys = new();

 

이제 설정 UI가 켜질때 SettingManager에서 값을 받아와 이전상태를 저장해준다.

_sliders.Add((GetSlider((int)Sliders.lS_UISoundSlider), Managers.Setting.UISound));
_sliders.Add((GetSlider((int)Sliders.lS_GameSoundSlider), Managers.Setting.InGameSound));
_sliders.Add((GetSlider((int)Sliders.lS_BGMSoundSlider), Managers.Setting.BgmSound));
_sliders.Add((GetSlider((int)Sliders.lS_ScreenGammaSlider), Managers.Setting.Gamma));
_sliders.Add((GetSlider((int)Sliders.lS_MouseControlSlider), Managers.Setting.MouseSense));

_keys.Add((GetTMP((int)TextMeshPros.lS_KC_FrontButtonValueText), Managers.Setting.FrontKey));
_keys.Add((GetTMP((int)TextMeshPros.lS_KC_BackButtonValueText), Managers.Setting.BackKey));
_keys.Add((GetTMP((int)TextMeshPros.lS_KC_LeftButtonValueText), Managers.Setting.LeftKey));
_keys.Add((GetTMP((int)TextMeshPros.lS_KC_RightButtonValueText), Managers.Setting.RightKey));
_keys.Add((GetTMP((int)TextMeshPros.lS_KC_JumpButtonValueText), Managers.Setting.JumpKey));
_keys.Add((GetTMP((int)TextMeshPros.lS_KC_RunButtonValueText), Managers.Setting.RunKey));
_keys.Add((GetTMP((int)TextMeshPros.lS_KC_InteractButtonValueText), Managers.Setting.InteractionKey));
_keys.Add((GetTMP((int)TextMeshPros.lS_KC_Inventory01ButtonValueText), Managers.Setting.Inventory1Key));
_keys.Add((GetTMP((int)TextMeshPros.lS_KC_Inventory02ButtonValueText), Managers.Setting.Inventory2Key));
_keys.Add((GetTMP((int)TextMeshPros.lS_KC_Inventory03ButtonValueText), Managers.Setting.Inventory3Key));
_keys.Add((GetTMP((int)TextMeshPros.lS_KC_Inventory04ButtonValueText), Managers.Setting.Inventory4Key));
_keys.Add((GetTMP((int)TextMeshPros.lS_KC_Inventory05ButtonValueText), Managers.Setting.Inventory5Key));

 

3. 현재 상태와 비교하기

리스트를 순회하며 값을 비교한다.

bool changed = false;

foreach (var (slider, original) in _sliders)
{
	if (!Mathf.Approximately(slider.value, original))
	{
		changed = true;
		break;
	}
}

if (!changed)
{
	foreach (var (tmp, originalKey) in _keys)
	{
		if (tmp.text != originalKey.ToString())
		{
			changed = true;
			break;
		}
	}
}

 

이제 만약 변화가 있었다면 버튼들을 활성화해주고

눈에 띄도록 글자의 색을 바꿔준다.

GetButton((int)Buttons.lS_SettingSaveButton).interactable = changed;
GetButton((int)Buttons.lS_SettingResetButton).interactable = changed;

Color activeColor = new Color(0.93f, 0.55f, 0f, 1f);
Color defaultColor = Color.white;

GetTMP((int)TextMeshPros.lS_SettingSaveText).color = changed ? activeColor : defaultColor;
GetTMP((int)TextMeshPros.lS_SettingResetText).color = changed ? activeColor : defaultColor;

 

4. 저장버튼 기능연결

이제 버튼이 클릭이 된다는것은 변화가 있다는 뜻이다.

저장 버튼이 클릭되었을 때 모든 설정값을 이전에 만든 SettingManager를 통해 로컬에 저장한다.

List<(string, float)> soundList = new()
{
	("UISound", GetSlider((int)Sliders.lS_UISoundSlider).value),
	("InGameSound", GetSlider((int)Sliders.lS_GameSoundSlider).value),
	("BgmSound", GetSlider((int)Sliders.lS_BGMSoundSlider).value),
	("Gamma", GetSlider((int)Sliders.lS_ScreenGammaSlider).value),
	("MouseSense", GetSlider((int)Sliders.lS_MouseControlSlider).value),
};

List<(string, KeyCode)> keyList = new()
{
	("FrontKey", ParseKeyCodeFromTMP(TextMeshPros.lS_KC_FrontButtonValueText)),
	("BackKey", ParseKeyCodeFromTMP(TextMeshPros.lS_KC_BackButtonValueText)),
	("LeftKey", ParseKeyCodeFromTMP(TextMeshPros.lS_KC_LeftButtonValueText)),
	("RightKey", ParseKeyCodeFromTMP(TextMeshPros.lS_KC_RightButtonValueText)),
	("JumpKey", ParseKeyCodeFromTMP(TextMeshPros.lS_KC_JumpButtonValueText)),
	("RunKey", ParseKeyCodeFromTMP(TextMeshPros.lS_KC_RunButtonValueText)),
	("InteractionKey", ParseKeyCodeFromTMP(TextMeshPros.lS_KC_InteractButtonValueText)),
	("Inventory1Key", ParseKeyCodeFromTMP(TextMeshPros.lS_KC_Inventory01ButtonValueText)),
	("Inventory2Key", ParseKeyCodeFromTMP(TextMeshPros.lS_KC_Inventory02ButtonValueText)),
	("Inventory3Key", ParseKeyCodeFromTMP(TextMeshPros.lS_KC_Inventory03ButtonValueText)),
	("Inventory4Key", ParseKeyCodeFromTMP(TextMeshPros.lS_KC_Inventory04ButtonValueText)),
	("Inventory5Key", ParseKeyCodeFromTMP(TextMeshPros.lS_KC_Inventory05ButtonValueText)),
};

Managers.Setting.ApplySettings(soundList, keyList);
Managers.Setting.Save();


for (int i = 0; i < _sliders.Count; i++)
{
	_sliders[i] = (_sliders[i].slider, _sliders[i].slider.value); // 현재 값을 기준값으로 저장
}

for (int i = 0; i < _keys.Count; i++)
{
	var keyText = _keys[i].tmp;
	KeyCode currentKey = ParseKeyCodeFromTMP((TextMeshPros)Enum.Parse(typeof(TextMeshPros), keyText.gameObject.name));
	_keys[i] = (keyText, currentKey); // 현재 키값을 기준값으로 저장
}

 

5. 설정 되돌리기 버튼 기능연결

이제 설정 되돌리기 버튼을 클릭했을 때 값을 되돌려야한다.

이것은 처음에 저장해두었으므로 단순히 값을 돌려놓기만하면 된다.

foreach (var (slider, original) in _sliders)
{
	slider.value = original;
}

foreach (var (tmp, originalKey) in _keys)
{
	tmp.text = originalKey.ToString();
}

GetButton((int)Buttons.lS_SettingSaveButton).interactable = false;
GetButton((int)Buttons.lS_SettingResetButton).interactable = false;

Color defaultColor = Color.white;
GetTMP((int)TextMeshPros.lS_SettingSaveText).color = defaultColor;
GetTMP((int)TextMeshPros.lS_SettingResetText).color = defaultColor;

6. 마무리

Setting UI는 다음 개발일지에서 마무리 될 것 같다.

다음엔 이번에 못한 여러 키설정 들을 가능하게 할 것이다.

반응형