주요 구현 내용 요약
버튼 사운드 처리 ▶ 버튼 클릭 시 효과음 재생 (TitleButtonSound)
페이드 인/아웃 + 씬 전환 ▶씬 이동/종료 시 SceneFader로 자연스러운 화면 전환 구현
저장 시스템 ▶ JSON 기반의 SaveManager와 MyGameData 사용
배경 음악 매니저 ▶ BGMManager를 통해 씬 전용 BGM 재생 및 볼륨 조절
아이템 구조 설계 ▶ ItemData ScriptableObject 기반으로 타입별 아이템 정의

UI - 버튼 클릭 사운드 & 페이드 전환
버튼 클릭 시 사운드가 나도록 TitleButtonSound를 작성하고,
SceneFader로 씬 전환 시 자연스럽게 검은 화면으로 Fade Out 되도록 구성했다.
foreach (var btn in buttons)
{
btn.onClick.AddListener(PlayClickSound);
}
public void FadeToScene(string sceneName)
{
StartCoroutine(FadeAndLoad(sceneName));
}
씬 이동뿐 아니라 게임 종료 시도에도 페이드를 넣고 자연스럽게 꺼지도록 처리했다.
다만, Application.Quit()은 빌드에서만 유효하므로 에디터에서는 주의가 필요했다.
Save System - JSON 기반 저장 & 불러오기
SaveManager를 싱글톤으로 구성하여 게임 데이터를 저장하고,
MyGameData를 통해 hp, gold, level 등의 기본 정보를 저장했다.
string json = JsonUtility.ToJson(data, true);
File.WriteAllText(savePath, json);
간단한 구조지만, Application.persistentDataPath를 이용해 플랫폼 간 경로 문제도 고려했다.
BGM 관리 - 씬마다 배경 음악 제어
타이틀 씬에서만 재생되는 로딩 BGM을 BGMManager로 재생하고,
DontDestroyOnLoad로 인스턴스를 유지하면서도 중복 생성을 방지했다.
audioSource = gameObject.AddComponent<AudioSource>();
audioSource.loop = true;
audioSource.playOnAwake = false;
씬 이동 시에는 audioSource.Stop()으로 깔끔히 정리할 수 있게 했다.
아이템 시스템 - ScriptableObject 기반 설계
아이템은 ItemData를 ScriptableObject로 구성하고,
타입별 분기(ITEMTYPE, CONSUMABLETYPE)를 명확히 분리했다.
public enum ITEMTYPE { Resource, Equipable, Consumable }
public ItemDataConsumable[] consumables;
여기에 ItemDatabase를 통해 ID 기반 검색 기능도 넣어서,
저장 시에는 ID + 수량만 저장하는 경량 구조로 확장 가능하게 했다.
느낀점
- 씬 간의 부드러운 전환과 효과음은 UI/UX에 굉장히 큰 영향을 준다.
- 데이터 저장 구조는 최소한으로 시작해 점진적으로 확장하는 것이 효율적이다.
- ScriptableObject는 반복적인 구조를 설계할 때 강력한 도구이며,
에디터 확장성과 분리 구조에 큰 도움이 된다.