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는 다음 개발일지에서 마무리 될 것 같다.
다음엔 이번에 못한 여러 키설정 들을 가능하게 할 것이다.
반응형