Handling FMETP WebSocket disconnection
App configuration
Scenes
- StartScene_General
- Holistic
- StartScene_General에서 Start Session 버튼을 클릭하면 Holistic scene으로 넘어감
- 오른쪽 버튼들은 가장 위 토글 버튼을 클릭했을 때 확장되는 버튼들임
Control flow
-
StartSession 버튼은 On Click() 이벤트에 대해 MainMenuButtons.CreateSession 메소드가 붙어있음
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
[Header("CreateSession")] [SerializeField] private FluentTEnums.SceneNames _sceneToLoad = FluentTEnums.SceneNames.MainMenu; public void CreateSession() { var _levelName = ""; switch (_sceneToLoad) { case FluentTEnums.SceneNames.FaceTracking: _levelName = StaticVariables.SCENE_FACE_TRACKING; break; case FluentTEnums.SceneNames.HolisticTracking: _levelName = StaticVariables.SCENE_HOLISTIC_TRACKING; break; case FluentTEnums.SceneNames.MainMenu: _levelName = StaticVariables.SCENE_MAIN_LEVEL; break; case FluentTEnums.SceneNames.TestMainMenu: _levelName = StaticVariables.SCENE_TEST_MAIN_LEVEL; break; default: Debug.LogWarning("Something went wrong with the enum. Check what happened."); return; } LoadLevel(_levelName); Debug.Log("Starting session..."); } private void LoadLevel(string levelName) { StartCoroutine(LoadSceneAsync(levelName)); } IEnumerator LoadSceneAsync(string levelName) { AsyncOperation op = SceneManager.LoadSceneAsync(levelName); while (!op.isDone) { float progress = Mathf.Clamp01(op.progress / .9f); Debug.Log(op.progress); yield return null; } }
_sceneToLoad
는 SerializeField이기 때문에 유니티 에디터에서 변경될 수 있음StartCoroutine(LoadSceneAsync(levelName))
으로 scene을 호출하는 것을 알 수 있음
-
Holistic
scene이 로드되면Solution
game object가 mediapipeline을 초기화함
Implement disconnect button
-
Holistic
의 토글 메뉴에X
버튼을 추가함- 아래와 같은 스크립트를 추가함
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
public void GotoStartScene() { var _levelName = StaticVariables.SCENE_MAIN_LEVEL; StartCoroutine(LoadSceneAsync(_levelName)); Debug.Log("Session closed"); } IEnumerator LoadSceneAsync(string levelName) { AsyncOperation op = SceneManager.LoadSceneAsync(levelName); while (!op.isDone) { float progress = Mathf.Clamp01(op.progress / .9f); Debug.Log(op.progress); yield return null; } }
On Click()
이벤트에 아래와 같이 메소드를 붙임
GotoStartScene()
메소드를 붙임- 버튼을 눌렀을 때
StartScene_General
으로 화면 전환이 되는 것을 확인함
- 버튼을 눌렀을 때
FMWebSocketManager.Close
도 붙여서 웹소켓도 같이 종료되도록 설정함- EC2에 배포한 TomatoSaas 서버로 테스트했을 때 정상 접속, 종료되는 것을 확인함
Trouble shooting
Start session → X → Start session으로 다시 Holistic
scene으로 넘어갔을 때 웹캠 화면이 나오지 않음
- 처음 한 번만 실행해서 정상 작동할 때의 로그
- GotoStartsession 호출 후 다시 Start session 버튼을 눌렀을 때의 로그
LoadSceneAsync
는 어셋에서 제공해주는 함수임- 웹캠 피드를 담당하는 MediaPipeUnity 패키지의 초기화 문제라 생각하고 유니티에서 MediaPipeline을 담당하는 game object를 찾음 →
solution
solution
이 MediaPipeUnity의 스크립트들을 호출하고 있었음
MediaPipeException
에러의 스택 가장 처음을 보면Bootstrap:OnEnable()
에서 에러가 난다는 것을 알 수 있음- bootstrap 초기화 문제라 생각하고 로그 찍어본 결과 AssetLoader 부분에서 에러남
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
Logger.LogInfo(_TAG, "Initializing AssetLoader..."); try { switch (_assetLoaderType) { case AssetLoaderType.AssetBundle: { AssetLoader.Provide(new AssetBundleResourceManager("mediapipe")); break; } case AssetLoaderType.StreamingAssets: { AssetLoader.Provide(new StreamingAssetsResourceManager()); break; } case AssetLoaderType.Local: { #if UNITY_EDITOR AssetLoader.Provide(new LocalResourceManager()); break; #else Logger.LogError("LocalResourceManager is only supported on UnityEditor"); yield break; #endif } default: { Logger.LogError($"AssetLoaderType is unknown: {_assetLoaderType}"); yield break; } } } catch { Logger.LogInfo(_TAG, "Asset already loaded"); }
- try…catch로 감싸서 해결함
- bootstrap 초기화 문제라 생각하고 로그 찍어본 결과 AssetLoader 부분에서 에러남
host가 종료했을 때 client들은 Holistic
scene에 계속 머무름
- 세션이 닫히면 client들도 시작 페이지에 돌아가도록 설정해야 함
Leave a comment