gereric singleton의 RuntimeInitializeOnLoadMethod 실행문제

 

요즘 개발할때 유니티의 enter play mode 를 적극 활용해보려고하고 있다.

 

https://blog.unity.com/kr/technology/enter-play-mode-faster-in-unity-2019-3 

 

더욱 빨라진 Unity 2019.3 버전 Enter Play Mode | Unity Blog

Play Mode(플레이 모드)를 이용하면 Unity를 더욱 다채롭게 활용할 수 있습니다. 프로젝트가 복잡해질수록 Play Mode를 시작하는 데 걸리는 시간이 길어지며, Play Mode를 빠르게 시작하고 종료할 수 있어

blog.unity.com

 

 

이 옵션이 문제가 되는 경우는

도메인이 Reload 되지않기 때문에 static 변수들이 초기화 되지 않는다는 것.

 

대부분은 문제가 되지않는데, 문제는 singleton 패턴을 사용할 때 인스턴스를 static변수에 저장한다는 것.

 

위의 링크에 나와있듯, RuntimeIntializeOnLoadMethod 속성을 사용하여

도메인 리로드가 되지않는 상황에도 대응하게 해야된다.

 

단순하게 생각해보면 아래와 같이 해보면 될 것 같다.

[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void OnRuntimeMethodLoad()
{
    _instance = null;
}

 

그런데 몇번의 삽질 끝에 알아낸 사실은

RuntimeInitializeOnLoadMethod 애트리뷰티는 generic class 에서 동작하지 않는다.

제네릭은 런타임에 바인딩이라 호출 시점의 문제인 듯 하다.

 

보통 싱글톤은 제네릭 상위클래스로 사용하기 때문에   

RuntimeInitializeOnLoadMethod는 최종 클래스에서 사용해야한다.

 

 

댓글

Designed by JB FACTORY