* Start 버튼을 누르면 Game Scene으로 이동 * Setting 버튼을 누르면 Settings 팝업이 등장 * Exit 버튼을 누르면 게임 완전히 종료하고 바탕화면으로 * Settings에서 Display Mode의 드롭다운 메뉴 (Dropdown_DisplayMode)의 첫번째 항목-창모드를 누르면, 실행 중인 게임을 창모드로 변경, 두번째 항목-전체화면을 누르면, 실행 중인 게임을 전체 화면으로 변경 * Dropdown_Resolution의 첫번째 항목-Free를 누르면 자유 조정 가능한 해상도, 두번째 항목-1920x1080을 누르면 1920x1080 고정 해상도로 조정 * Slider_BGM의 슬라이더를 조정해 게임의 BGM (Stage.csv의 bgm컬럼에 입력한 bgm)의 사운드 크기 조정 * Slideder_SFX의 슬라이더를 조정해 게임의 나머지 모든 이펙트 사운드의 크기 조정
프롬프트
유니티 C# 스크립트를 작성해줘. 요구사항은 아래와 같다.
목적
Main Scene의 메뉴/옵션 UI를 동작시키는 매니저 스크립트 MainMenuController.cs 를 만든다. 코드는 URP/일반 렌더링 관계없이 동작해야 하고, Editor/Standalone 모두에서 문제없게 작성한다.
씬/오브젝트 이름 (Inspector로 연결할 필드)
버튼
Btn_Start (Game 시작)
Btn_Options(Settings 팝업 열기) ※ 만약 내 프로젝트에 Btn_Settings 라면 그걸로 연결해도 됨
Btn_Quit (게임 종료)
팝업 그룹
Popup_Settings (Dim + 팝업 패널을 포함하는 루트, 기본 비활성)
드롭다운
Dropdown_DisplayMode (0=창모드, 1=전체화면)
Dropdown_Resolution (0=Free, 1=1920x1080)
슬라이더
Slider_BGM (0.0~1.0)
Slider_SFX (0.0~1.0)
오디오
AudioMixer(UnityEngine.Audio) 1개: 이름은 자유.
그룹: BGM, SFX 두 그룹을 만들고, 각각 노출 파라미터를 다음 키로 공개한다:
BGM 볼륨 파라미터 키: BGM_dB
SFX 볼륨 파라미터 키: SFX_dB
슬라이더 0.0~1.0 값을 dB로 변환해 세팅한다:
값이 0이면 -80 dB, 그 외에는 20 * log10(value) 사용.
씬 이름
게임 씬 이름은 정확히 GameScene
동작 상세
1) Start 버튼
Btn_Start 클릭 시 UnityEngine.SceneManagement.SceneManager.LoadScene("GameScene");
2) Settings 버튼
Btn_Options 클릭 시 Popup_Settings.SetActive(true);
팝업이 열릴 때 현재 화면모드/해상도/볼륨 상태를 UI에 반영:
Display Mode: Screen.fullScreenMode 가 FullScreenWindow 이면 1(전체화면), 아니면 0(창모드)
Resolution:
현재가 1920x1080 정확히면 드롭다운을 1로 선택
그 외는 0(Free)
Slider_BGM/Slider_SFX: 현재 믹서 파라미터 dB 값을 0~1로 역변환해서 슬라이더에 반영
역변환: dB ≤ -80 이면 0, 그 외에는 Mathf.Pow(10, dB/20f)
3) Exit 버튼
Btn_Quit 클릭 시
Standalone: Application.Quit();
Editor 플레이 중이면 UnityEditor.EditorApplication.isPlaying = false; (조건부 컴파일)
4) Display Mode 드롭다운
Dropdown_DisplayMode의 값이 바뀌면 즉시 적용:
값 0(창모드): Screen.fullScreenMode = FullScreenMode.Windowed;
값 1(전체화면): Screen.fullScreenMode = FullScreenMode.FullScreenWindow;
적용 후에도 팝업은 열린 상태를 유지.
5) Resolution 드롭다운
Dropdown_Resolution 값 변경 시:
값 0(Free): 크기 고정하지 않음.
현재 Screen.width / Screen.height 를 읽어서 그대로 유지하면서 FullScreenMode만 현재 상태 유지.
윈도우가 사용자가 조절 가능하도록(자유 조정) 전제. (실제 자유 조정은 Player Settings의 Resizable Window 설정 필요)
값 1(1920x1080):
현재 화면 모드를 유지하며 Screen.SetResolution(1920, 1080, Screen.fullScreenMode);
적용 후에도 팝업은 열린 상태 유지.
6) BGM/SFX 볼륨 슬라이더
Slider_BGM 값 변경 시 오디오 믹서의 BGM_dB 파라미터 반영
Slider_SFX 값 변경 시 오디오 믹서의 SFX_dB 파라미터 반영
변환:
if value <= 0.0001f → dB = -80f
else → dB = 20f * Mathf.Log10(value)
주석으로 “Stage.csv의 bgm 컬럼으로 재생되는 BGM은 오디오 믹서의 BGM 그룹을 통해 볼륨만 제어한다”고 명시. (BGM 재생 자체 로직은 기존 시스템을 사용)
7) 팝업 닫기
확인/취소 버튼을 팝업 안에 만들어뒀다고 가정:
Btn_OK: 현재 UI 값들(모드/해상도/볼륨)이 이미 즉시적용이므로, 여기서는 단순히 Popup_Settings.SetActive(false);
Btn_Cancel: 이번 세션에서 바뀐 값을 되돌리고 닫는 로직(옵션)
간단화를 위해 이번 버전은 되돌리기 없이 Popup_Settings.SetActive(false);만 실행. (필요 시 이전 상태를 캐시하는 코드 블록 주석 제공)
스크립트 요구
파일명: MainMenuController.cs
네임스페이스 불필요.
using:
UnityEngine
UnityEngine.UI
UnityEngine.SceneManagement
UnityEngine.Audio
TMPro
클래스는 MonoBehaviour.
인스펙터에 연결할 public / [SerializeField] private 필드 선언:
Buttons, GameObject Popup, TMP_Dropdown 2개, Sliders 2개, AudioMixer 1개
Awake() 또는 Start()에서 모든 UI 이벤트 리스너 연결하고, 누락 시 경고 로그.
에디터 종료 분기에는 #if UNITY_EDITOR 사용.
볼륨 변환 유틸 메서드 2개 포함:
float LinearToDecibel(float v)
float DecibelToLinear(float dB)
널 체크 철저히, 누락된 레퍼런스는 Debug.LogWarning으로 알려줘.
주석은 한국어로 친절히 달아줘.
마지막으로, 스크립트 맨 아래에 Inspector 연결 체크리스트를 주석으로 첨부해:
버튼/드롭다운/슬라이더/Popup 연결
AudioMixer와 노출 파라미터 이름 일치 확인
Player Settings에서 Resizable Window 켜면 Resolution=Free가 자연스럽게 동작함