유니티에서 모바일을 대상으로 빌드를 하던 도중 함수 호출이 예상과 다르게 진행되었다.
OnApplicationQuit()을 통해 앱 종료시 데이터를 저장하고자 했지만 저장되지 않았다.
OnApplicationQuit()은 프로그램이 종료 될때, 에디터에서 플레이를 중지할 때 호출된다.
웹빌드에서도 브라우저가 탭을 닫으므로 호출 되지 않는다.
또한 모바일(안드로이드, IOS)에서는 이를 호출하지 않는다.
이를 해결하기 위해 모바일에서는 OnApplicationPause, OnApplicationFocus를 사용해야한다.
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는 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