최근에 모 대기업 스마트폰에 Preinstall 하는 프로젝트에 참여하면서 영혼이 갈려 나가고 있습니다.
(8월 23일부터 처음 코딩들어가기 시작했으니 벌써 2달이 가까워지네요.)

TDD와 같이 개발하고 Fix Patch하면서 하나하나 고쳐나가다보니 별별 문제를 다 만납니다.

현재환경 : Unity3D 4.5.4
Vuforia : 3.09

가장 큰 문제는 Vuforia의 카메라를 On/Off 할때 Object (특히 GUI)가 많이 떠 있으면 Crash 가 발생합니다. 
이건 답이 없어서 On/Off하는 상황에서 GUI를 꺼주고 Object들도 다 꺼주고 다시 카메라를 Turn On할때는 카메라가 들어오는걸 확인하고 다시 다 띄워줍니다. (이런 미친...)

정리하자면, 전면카메라와 후면카메라 전환시 카메라 Turn Off -> Turn On 되는데, 이때 

- CameraDevice.instance.stop()
- 모든 Object 제거
CameraDevice.instance.start()
- Object 재생성

이렇게 해야 반복적인 On/Off문제에서 해결이 가능하더군요. (Fucking Vuforia)

그리고, Unity3D 4.5.4f1 버전에서 안드로이드 커버를 덥었다 열었다를 반복하면 먹통이 되는 현상이 발생됩니다.
이 경우는 Unity3D 4.5.4 Patch 3 또는 4.5.5로 업데이트 / 업그레이드하면 많은 부분이 해소됩니다만, 
위의 Vufoira Crash 대응작업을 위해서는 Queue를 사용해서 중간에 들어온 Events를 무시하는 겁니다.

예를 들어, Pause Event에서는 
- CameraDevice.instance.stop()
- 모든 Object 제거
를 해야하고 Resume Event에서는 
CameraDevice.instance.start()
- Object 재생성
를 수행해야하는 상황이라면, 다음과 같이 Queue를 처리 할 수 있습니다.


* 다음은 대소문자 무시하고 기억나는대로 Typing한겁니다.

//먼저 List객체로 만들 Class를 하나 선언합니다.
public class Queue {
     public bool PauseType;
     public float EventTime;
}

//List를 하나선언합시다. using System.Collection.Generic; 선언 잊지 맙시다.
List<Queue> _q = new List<Queue>();
void OnApplicationPause(_paused){
    //Pause 또는 Resume Event가 들어오면 Queue에다 넣어둡니다.
     _q.add ( new Queue { PauseType = _paused, EventTime = Time.realtimeSinceStartup } );
   // 처음 들어온 Event는 일단 Pause이므로 처리하도록 합시다.
     if (_q.Count <= 1)  SetPause();
}

void FixedUpdate(){
    if (_q.Count < 1) return; //비어있을때는 무시
    //큐의 마지막이 Resume 이면서 반복 입력이 1초이상 없으면 Resume 실행
    if (_q[_q.Count -1].
PauseType == false && _q[_q.Count -1].EventTime + 1f <  Time.realtimeSinceStartup) {
       SetResume();
       _q.Clear()
    }
}

만들어 놓고 보니 굳이 List 객체로 처리해야하는지 조금은 궁금증이 들기는 하지만, 조금이라도 안드로이드 덮개 때문에 고통받는 개발자들과 나누고 싶네요.
(참고로 삼성제품에서는 괜찮다고 하더라구요. T_T)
2014/10/18 14:33 2014/10/18 14:33