본문 바로가기
게임 개발(유니티)/공부사항

Lunar-Assault_Recon_ 공부사항 #3

by goraku97 2025. 10. 5.

[RuntimeInitializeOnLoadMethod(...)]

런타임이 시작될 때(앱 실행 또는 에디터에서 Play 버튼을 누를 때)

정적 메서드를 자동으로 호출해 주는  어트리뷰트.

 

해당 어트리뷰트는 특정 시점에 딱 한번 만 자동호출되며

주로 초깃값을 설정하고 싶을때 사용함.

 

(RuntimeInitializeLoadType.BeforeSceneLoad)

 

"첫 씬을 로드하기 전" 이라는 기능을 가진 LoadType

 

해당 LoadType PlayerPrefs, 정적 데이터 테이블 같은 전역/무상태 초기화에 최적.

 

그 외 자주 쓰이는 LoadType

 

- AfterSceneLoad : 첫 씬이 로드된 직후 호출.

                                씬이 올라온 상태에서 해야 할 마이그레이션/검증/씬 루트 스캔 등에 사용.

 

                                예시 : “첫 씬에 특정 매니저가 없으면 동적으로 생성하기”,

                                          “부족한 레이어/태그 경고”.

 

** 마이그레이션 (migration) : 이전 버전에서 쓰던 데이터·설정·구조를,

                                               새 버전의 형식과 규칙에 맞게 옮기고(변환하고) 정리하는 과정  

                                               (씬이 로드된 직후, 루트 오브젝트와 컴포넌트에 접근할 수 있기 때문에,

                                                마이그레이션은 AfterSceneLoad 에서 주로 사용됨 )

                                                

 

- AfterAssembliesLoaded : 스크립트 어셈블리들이 메모리에 로드된 직후, 씬 로드보다도 이른 시점.

                                              Unity 오브젝트 접근을 최소화하고, 순수 C# 레벨 초기화

                                              (리플렉션 캐시 만들기, 정적 테이블 빌드, 폴더/파일 존재 확인 등)에 적합.

 

[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void BootstrapAudioPrefs()
{
    float ver = PlayerPrefs.GetFloat(AudioPrefsVersionKey, 0);
    if (ver < CurrentPrefsVersion)
    {
        PlayerPrefs.SetFloat(BgmKey, 0f);
        PlayerPrefs.SetFloat(SfxKey, 0f);
        PlayerPrefs.SetFloat(AudioPrefsVersionKey, CurrentPrefsVersion);
        PlayerPrefs.Save();
    }
}

(Lunar-Assault_Recon 프로젝트에서는 초깃값을 설정하기 위해 BeforeSceneLoad 를 사용)

 

PlayerPrefs

작고 단순한 설정값을 저장하는 용도로 자주 쓰임

 

PlayerPrefs.Set… : 값 쓰기

 

정수값 사용시 : PlayerPrefs.SetInt(string key, int value

실수값 사용시 : PlayerPrefs.SetFloat(string key, float value)

문자열값 사용시 : PlayerPrefs.SetString(string key, string value)

 

지정한 key에 값을 메모리상의 PlayerPrefs 캐시에 기록.

(하지만 직접 디스크에 쓰는게 아닌, "저장 예정" 상태.)

 

예시)

PlayerPrefs.SetFloat(BgmKey, 0f);

BgmKey 의 값을 0으로 설정하여 PlayerPrefs 캐시에 기록("저장 예정")

 

PlayerPrefs.Get… : 값 읽기

 

정수값 사용시 : PlayerPrefs.GetInt(string key, int defaultValue = 0

실수값 사용시 : PlayerPrefs.GetFloat(string key, float defaultValue = 0f )

문자열값 사용시 : PlayerPrefs.GetString(string key, string defaultValue = "" )

 

해당 key가 있으면 저장된 값을, 없으면 기본값을 반환.

 

예시)

float ver = PlayerPrefs.GetFloat(AudioPrefsVersionKey, 0);

AudioPrefsVersionKey 에 값이 있으면 그 값을 사용하고,

없으면 AudioPrefsVersionKey 의 값에 0을 넣고

변수 ver 에 반환.

 

PlayerPrefs.Save() : 강제 저장

 

메모리의 변경분을 즉시 디스크(플랫폼별 저장소)에 쓰기(적용).

PlayerPrefs.SetFloat(BgmKey, 0f);
PlayerPrefs.SetFloat(SfxKey, 0f);
PlayerPrefs.SetFloat(AudioPrefsVersionKey, CurrentPrefsVersion);
PlayerPrefs.Save();

PlayerPrefs.Save()  함수를 적용해서 위의 3개의 값들을 확정적으로 디스크에 저장함

 

 

private void ResetAudioPrefsToDefaults()
{
    PlayerPrefs.DeleteKey(BgmKey);
    PlayerPrefs.DeleteKey(SfxKey);
    PlayerPrefs.DeleteKey(AudioPrefsVersionKey);
    PlayerPrefs.Save();
    Debug.Log("오디오값 모두 초기화");
}

 

(Lunar-Assault_Recon 프로젝트에서는 빌드하기전, 사용되었던 값들을 지우기 위해 DeleteKey 를 사용)

 (해당 사진에서는 3개의 값을 삭제표시하고, PlayerPrefs.Save() 를 사용하여 값을 아예 제거했음)

 

PlayerPrefs.DeleteKey(string key) : 해당 key에 저장돼 있던 (int, float, string 구분 없이) 

                                                             그 존재 자체를 삭제표시

                                                             (삭제가 확정적으로 적용되는건 PlayerPrefs.Save())

 

 

** 참고 스크립트

 

VolumeSetting.cs
0.01MB
SelectWindowSize.cs
0.01MB
LanguageManager.cs
0.01MB