설정 시스템 구조 설계 및 슬라이더 기반 환경 값 제어

목차

1. 요구 사항

2. 설계 목표

3. 흐름도

4. 구현

        4.1. 싱글톤 구조

       4.2. Start에서 슬라이더 참조 획득

       4.3. 슬라이더 값을 실제 감도 값으로 변환

       4.4. 알파 값 보정 계산

       4.5. 씬 전환

       4.6. 게임 종료

5. 개발 의도

1. 시스템 요구 사항

플레이어는 설정 UI를 통해 마우스 감도와 미니맵 투명도를 조절할 수 있어야 한다.

슬라이더를 움직이면 해당 값이 즉시 게임 시스템에서 사용할 수 있는 수치로 변환되어야 하며, 이 값은 단순 UI 표시용이 아니라 실제 카메라 회전 속도 및 미니맵 렌더링 알파 값에 반영되어야 한다.

또한 설정 창에서 타이틀 씬으로 이동하거나 게임을 종료할 수 있어야 하며, 설정 매니저는 씬 전환과 독립적으로 접근 가능해야 한다.

설정 값은 UI 입력을 받아 계산만 수행하고, 실제 적용은 해당 기능을 사용하는 시스템이 값을 조회하는 구조여야 한다.

2. 설계  목표

- 설정 매니저를 싱글톤으로 구성하여 전역 접근 가능하도록 설계

- 슬라이더 값을 실제 게임에서 사용할 수 있는 범위 값으로 변환

- UI 입력과 실제 적용 로직을 분리

- 씬 이동과 종료 기능을 설정 UI 내부에서 직접 처리

3. 흐름도

Setting UI 활성화

       ↓

Slider 값 변경

       ↓

MouseSensitivity() / MinimapTransparency()

       ↓

변환된 값 반환

       ↓

카메라 / 미니맵 시스템에서 해당 값 사용

설정 시스템은 값을 “저장”하는 구조가 아니라, 필요할 때 계산하여 반환하는 구조다.

이는 설정 매니저를 상태 저장소라기보다는 계산 인터페이스로 사용하는 설계다.

4. 구현

4.1. 싱글톤 구조
public static SettingManager instance;

void Awake()
{
    instance = this;
}

SettingManager는 싱글톤 구조로 설계되어 있다.

static instance를 통해 어디서든 SettingManager.instance로 접근할 수 있다.

Awake는 Unity의 생명주기 함수로, Start보다 먼저 호출된다.

싱글톤 초기화는 다른 오브젝트가 SettingManager를 참조하기 전에 완료되어야 하므로 Awake에서 할당하는 것이 적절하다.

이 구조의 장점은 설정 값에 대한 접근 경로가 단일화된다는 점이다.

예를 들어 카메라 스크립트에서 SettingManager.instance.MouseSensitivity()를 호출하면 현재 슬라이더 값 기반 감도를 얻을 수 있다.

단점은 싱글톤 특성상 테스트 및 의존성 관리가 어려울 수 있다는 점이지만, 설정 시스템은 전역적 특성을 가지는 것이 자연스럽기 때문에 구조적으로 합리적인 선택이다.

4.2. Start에서 슬라이더 참조 획득
void Start()
{
    mouseSlider = GameObject.Find("MouseSensitivityValue").GetComponent<Slider>();
    minimapSlider = GameObject.Find("MinimapAlphaValue").GetComponent<Slider>();
}

Start에서는 슬라이더 UI 컴포넌트를 참조한다.

GameObject.Find는 이름 기반으로 오브젝트를 탐색하는 Unity API다.

장점은 인스펙터 연결 없이 빠르게 참조를 얻을 수 있다는 점이다.

단점은 문자열 기반 탐색이므로 이름이 바뀌면 런타임 오류가 발생할 수 있고, 탐색 비용이 존재한다는 점이다.

이 코드가 Start에서 한 번만 실행되므로 성능 문제는 크지 않다.

다만 대규모 프로젝트에서는 [SerializeField]로 직접 참조를 연결하거나, Awake에서 캐싱하는 구조가 더 안정적이다.

현재 구조는 단순성과 빠른 구현을 우선한 형태다.

Slider는 UnityEngine.UI에서 제공하는 UI 컴포넌트로, value 값이 0~1 사이의 float로 표현된다.

이 특성 때문에 슬라이더 값을 실제 게임 로직에서 사용할 범위로 변환하는 과정이 필요하다.

4.3. 슬라이더 값을 실제 감도 값으로 변환
public float MouseSensitivity()
{
    mouseSensitivity = Mathf.Lerp(50f, 1000f, mouseSlider.value);
    return mouseSensitivity;
}

MouseSensitivity는 현재 슬라이더 값을 읽어 실제 마우스 감도 값으로 변환하는 함수다.

여기서 Mathf.Lerp를 사용했다.

Mathf.Lerp는 두 값 사이를 비율 t만큼 선형 보간하는 함수이며, Lerp(a, b, t)는 a와 b 사이를 t 비율로 보간한다.

슬라이더 값은 0~1 사이이므로, 이를 50~1000 범위로 확장하기 위해 Lerp를 사용한다.

슬라이더가 0일 때는 50, 1일 때는 1000이 되며, 중간 값은 선형적으로 증가한다.

이 방식의 장점은 코드가 직관적이고, 범위 조정이 쉽다는 점이다.

최소/최대 감도를 변경하고 싶으면 50과 1000만 수정하면 된다.

하드코딩된 범위를 사용하는 단점은 감도 정책 변경 시 코드 수정이 필요하다는 점이다.

확장한다면 ScriptableObject나 설정 데이터 파일로 분리할 수 있다.

그러나 현재 프로젝트 규모에서는 단순성과 가독성을 우선한 설계다.

이 함수는 값을 저장하기보다는 계산 후 반환하는 구조다.

즉, 감도는 슬라이더 상태를 기반으로 매번 계산된다.

이는 상태 불일치 문제를 방지하는 장점이 있다.

슬라이더 값이 변경되면 즉시 계산 결과가 달라진다.

4.4. 알파 값 보정 계산
public float MinimapTransparency()
{
    minimapAlpha = (1 - 0.3529f) * minimapSlider.value + 0.3529f;
    return minimapAlpha;
}

이 함수는 미니맵의 투명도 값을 계산한다.

슬라이더 값은 0~1이지만, 실제 미니맵 알파는 완전 투명 0이 아니라 최소값 0.3529를 가진다.

이 계산식은 선형 변환 공식이다.

(최대 - 최소) * value + 최소

즉, 슬라이더가 0일 때 최소값 0.3529, 1일 때 1.0이 되도록 설정했다.

완전 투명 상태를 허용하지 않은 이유는 미니맵이 완전히 사라지면 플레이어 경험이 저하될 수 있기 때문이다.

따라서 최소 가시성을 보장하는 하한선을 둔 것이다.

Mathf.Lerp로도 구현할 수 있지만, 직접 계산식을 사용한 이유는 최소값이 명확히 드러나도록 하기 위함이다.

수식 형태는 선형 보간과 동일하다.

4.5. 씬 전환
public void StartSceneClick()
{
    SceneManager.LoadScene("Title");
}

SceneManager.LoadScene은 UnityEngine.SceneManagement 네임스페이스에 포함된 씬 전환 함수다.

설정 화면에서 타이틀 화면으로 돌아가는 버튼 클릭 이벤트에 연결된다.

씬 전환은 동기 방식으로 수행된다.

즉, 현재 씬을 언로드하고 지정된 씬을 로드한다.

이 구조는 설정 시스템이 씬 구조에 의존하지 않도록 하면서도, UI에서 직접 씬 이동을 제어할 수 있게 한다.

4.6. 게임 종료
public void EndClick()
{
    Application.Quit();
}

Application.Quit은 빌드된 게임 환경에서 애플리케이션을 종료하는 Unity API다.

에디터에서는 동작하지 않지만, 실제 실행 파일에서는 정상적으로 프로그램을 종료한다.

이 함수는 버튼 이벤트에 직접 연결되어 있으며, 별도의 Update 기반 입력 처리가 필요 없다.

이벤트 기반 구조는 설정 메뉴 같은 UI 시스템에 적합하다.

5. 개발 의도

이 설정 시스템은 값을 내부에 복잡하게 저장하는 구조가 아니라, 슬라이더 상태를 기반으로 필요한 순간에 계산해 반환하는 구조로 설계했다.

이 방식은 UI 상태와 실제 적용 값이 항상 일치하도록 만들며, 별도의 동기화 로직을 줄인다.

마우스 감도와 미니맵 투명도는 선형 보간 방식을 사용해 범위를 확장했다.

이는 슬라이더의 0~1 범위를 실제 게임 값 범위로 자연스럽게 변환하기 위함이다.

최소값을 설정해 사용자 경험을 보호하는 하한선을 둔 것도 설계 의도다.

또한 싱글톤을 통해 설정 값에 대한 접근 경로를 단일화했다.

카메라, UI, 미니맵 등 어떤 시스템이든 SettingManager.instance를 통해 현재 설정 값을 조회할 수 있다.

이 구조는 설정을 중앙 인터페이스로 만드는 설계다.