Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

1vdlrwnsv1 님의 블로그

옵션을 만들자 본문

Unity 최종

옵션을 만들자

1vdlrwnsv1 2025. 4. 22. 20:57

옵션 기능엔 마우스 감도, 사운드 조절, 사운드 매니저랑 연동이 돼야함

 

using UnityEngine;
using UnityEngine.UI;

public class OptionUI : PopupUI
{
    [Header("Mouse Sensitivity")]
    public Text hipSensitivityText;
    public Text adsSensitivityText;
    public float hipSensitivity = 1f;
    public float adsSensitivity = 1f;

    [Header("Sound Sliders")]
    public Slider masterSlider;
    public Slider seSlider;
    public Slider bgmSlider;

    public Text masterValueText;
    public Text seValueText;
    public Text bgmValueText;

    protected override void Awake()
    {
        base.Awake();
        
        masterSlider.minValue = 0;
        masterSlider.maxValue = 100;
        seSlider.minValue = 0;
        seSlider.maxValue = 100;
        bgmSlider.minValue = 0;
        bgmSlider.maxValue = 100;

        // masterSlider.value = SoundManager.Instance.GetMasterVolume() * 100f;

        UpdateSensitivityTexts();

        // 사운드 슬라이더 값 변경 리스너 등록
        masterSlider.onValueChanged.AddListener((v) =>
        {
            masterValueText.text = v.ToString("0");
            SoundManager.Instance.SetMasterVolume(v / 100f);
        });

        seSlider.onValueChanged.AddListener((v) =>
        {
            seValueText.text = v.ToString("0");
            SoundManager.Instance.SetSFXVolume(v / 100f);
        });

        bgmSlider.onValueChanged.AddListener((v) =>
        {
            bgmValueText.text = v.ToString("0");
            SoundManager.Instance.SetMusicVolume(v / 100f);
        });
    }

    private void OnEnable()
    {
        // SoundManager의 값을 가져와서 슬라이더에 적용
        masterSlider.value = SoundManager.Instance.masterVol * 100f;
        seSlider.value = SoundManager.Instance.sfxVol * 100f;
        bgmSlider.value = SoundManager.Instance.backgroundMusicVol * 100f;

        // 슬라이더 값에 맞는 텍스트 갱신
        UpdateSoundTexts();

    }

    #region Sensitivity Control
    public void ChangeHipSensitivity(float delta)
    {
        hipSensitivity = Mathf.Clamp(hipSensitivity + delta, 0f, 9.9f);
        UpdateSensitivityTexts();
        // GameSettings.Instance.HipSensitivity = hipSensitivity;
    }

    public void ChangeADSSensitivity(float delta)
    {
        adsSensitivity = Mathf.Clamp(adsSensitivity + delta, 0f, 9.9f);
        UpdateSensitivityTexts();
        // GameSettings.Instance.ADSSensitivity = adsSensitivity;
    }

    private void UpdateSensitivityTexts()
    {
        hipSensitivityText.text = hipSensitivity.ToString("0.0");
        adsSensitivityText.text = adsSensitivity.ToString("0.0");
    }
    #endregion

    private void UpdateSoundTexts()
    {
        masterValueText.text = masterSlider.value.ToString("0");
        seValueText.text = seSlider.value.ToString("0");
        bgmValueText.text = bgmSlider.value.ToString("0");
    }

    public void OnClickClose()
    {
        UIManager.Instance.ClosePopUpUI();
    }
}

PopupUI를 상속받는 UI 팝업창 클래스

 

위 스크립트의 Awake() 초기설정

protected override void Awake()
    {
        base.Awake();
        
        masterSlider.minValue = 0;
        masterSlider.maxValue = 100;
        seSlider.minValue = 0;
        seSlider.maxValue = 100;
        bgmSlider.minValue = 0;
        bgmSlider.maxValue = 100;

        // masterSlider.value = SoundManager.Instance.GetMasterVolume() * 100f;

        UpdateSensitivityTexts();

        // 사운드 슬라이더 값 변경 리스너 등록
        masterSlider.onValueChanged.AddListener((v) =>
        {
            masterValueText.text = v.ToString("0");
            SoundManager.Instance.SetMasterVolume(v / 100f);
        });

        seSlider.onValueChanged.AddListener((v) =>
        {
            seValueText.text = v.ToString("0");
            SoundManager.Instance.SetSFXVolume(v / 100f);
        });

        bgmSlider.onValueChanged.AddListener((v) =>
        {
            bgmValueText.text = v.ToString("0");
            SoundManager.Instance.SetMusicVolume(v / 100f);
        });
    }

슬라이더의 최소 최대값 0, 100설정

슬라이더 변경시 볼륨 값 적용하는 리스너 추가

 

ex) masterSlider.onValueChanged.AddListener((v) => {...});

콜백함수 등록 슬라이더 값이 변경 될 때마다 실행 onValueChanged 이벤트가 발생할 때마다 람다 함수(즉, 콜백 함수)가 호출 masterValueText.text를 업데이트하고, SoundManager에 새로운 볼륨을 설정

 

이 코드에서 onValueChanged는 델리게이트 타입

Slider 클래스에서 제공하는 onValueChanged는 값이 변경될 때 호출될 메서드 참조를 받을 수 있는 델리게이트. 그리고 AddListener 메서드를 사용하여 델리게이트에 콜백 함수를 추가함

 

슬라이더 움직이면:

  • 텍스트 업데이트
  • SoundManager에 실제 볼륨 값(0.0~1.0)으로 전달

OnEnable() - UI가 켜질 때 실행

private void OnEnable()
    {
        // SoundManager의 값을 가져와서 슬라이더에 적용
        masterSlider.value = SoundManager.Instance.masterVol * 100f;
        seSlider.value = SoundManager.Instance.sfxVol * 100f;
        bgmSlider.value = SoundManager.Instance.backgroundMusicVol * 100f;

        // 슬라이더 값에 맞는 텍스트 갱신
        UpdateSoundTexts();

    }

 

SoundManager에서 현재 볼륨 상태를 가져와서 슬라이더에 반영

100을 곱해줘야 슬라이더 스케일에 맞음 (SoundManager의 값은 0~1까지여서)

UpdateSoundText()로 텍스트 동기화

 

감도 조절 (아직 마우스 연결 안됨)

public void ChangeHipSensitivity(float delta)
public void ChangeADSSensitivity(float delta)

 

외부에서 버튼누르면 값을 전달받아 감도를 조절 

>> = -1, > = -0.1

텍스트도 실시간 갱신

 

UpdateSensitivityTexts()
UpdateSoundTexts()

 

메서드 들로 텍스트 실시간 갱신

 

해야할것: 마우스 감도기능 구현