유니티 OnApplicationQuit, 모바일 API

김효중·2025년 5월 12일

개요

유니티에서 모바일을 대상으로 빌드를 하던 도중 함수 호출이 예상과 다르게 진행되었다.
OnApplicationQuit()을 통해 앱 종료시 데이터를 저장하고자 했지만 저장되지 않았다.

모바일 환경에서의 OnApplicationQuit()

OnApplicationQuit()은 프로그램이 종료 될때, 에디터에서 플레이를 중지할 때 호출된다.
웹빌드에서도 브라우저가 탭을 닫으므로 호출 되지 않는다.
또한 모바일(안드로이드, IOS)에서는 이를 호출하지 않는다.

이를 해결하기 위해 모바일에서는 OnApplicationPause, OnApplicationFocus를 사용해야한다.

OnApplicationPause(bool)

OnApplicationPause(bool)은 앱이 포커스를 잃거나 다시 포커스를 얻을 때 호출 된다.
앱이 중지 되면 true, 다시 시작되면 false를 매개변수로 받는다.

이는 에디터에서 중지버튼을 누른 경우에는 호출되지 않는점을 유의한다.

private DateTime pauseStartTime;

    void OnApplicationPause(bool pause)
    {
        if (pause)
        {
            // 앱이 백그라운드로 내려감
            pauseStartTime = DateTime.Now;
            Debug.Log("앱이 일시중지됨: " + pauseStartTime);
        }
        else
        {
            // 앱이 다시 포그라운드로 복귀함
            TimeSpan pausedDuration = DateTime.Now - pauseStartTime;
            Debug.Log("앱 복귀. 일시중지된 시간: " + (int)pausedDuration.TotalSeconds + "초");
        }
    }

OnApplicationFocus(bool)

OnApplicationFocus는 OnApplicationPause와 비슷하게 앱이 포커스를 받았는지 여부를 알려준다.
포커스를 받으면 true, 포커스를 잃으면 false를 매개변수로 받는다.

private DateTime focusLostTime;

    void OnApplicationFocus(bool hasFocus)
    {
        if (hasFocus)
        {
            // 앱이 다시 포커스를 얻음
            TimeSpan awayDuration = DateTime.Now - focusLostTime;
            Debug.Log("앱이 다시 포커스를 얻음. 떠나있던 시간: " + (int)awayDuration.TotalSeconds + "초");
        }
        else
        {
            // 앱이 포커스를 잃음
            focusLostTime = DateTime.Now;
            Debug.Log("앱이 포커스를 잃음: " + focusLostTime);
        }
    }

결론

유니티 모바일 빌드시에는 OnApplicationQuit()가 호출 되지 않으므로
종료 시 저장 기능을 구현한다면, OnApplicationPause(),OnApplicationFocus()를 통해 구현해야 된다.

참고
https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnApplicationQuit.html

profile
도전하는 개발자

0개의 댓글