// Update is called once per frame void Update() { // Ensure everything is calibrated before starting experiment if (systemCalibrated == false) { RunCalibrationSetup(); return; } // Ensure that user has entered in the subject's name if (usernameInputGameObject.activeInHierarchy) { return; } // Debug purposes if skipIntro == TRUE. Allow to skip calibration if (skipIntro && (currentSceneNumber == 0)) { currentSceneNumber = 1; uiPrompt.TurnOffUiPrompt(); eyeTrackerInstance.CreateNewScene(GenerateSceneName(currentSceneNumber)); SceneManager.LoadSceneAsync(GenerateSceneName(currentSceneNumber), LoadSceneMode.Additive); ChangeSkybox(currentSceneNumber); currentSceneState = SCENE_CHANGE_STATE.NotChanging; nextSceneTime = DateTime.Now.Ticks + secondsBetweenScene * TimeSpan.TicksPerSecond; } // Check if we should begin transition onto the next scene if (DateTime.Now.Ticks >= nextSceneTime || currentSceneState != SCENE_CHANGE_STATE.NotChanging) { switch (currentSceneState) { // Initiate change scene if we're not at the last scene case SCENE_CHANGE_STATE.NotChanging: if (currentSceneNumber < totalNumberOfScenes) { eyeTrackerInstance.SaveToFile(logDirectory); fadeSceneTime = nextSceneTime; currentSceneState = SCENE_CHANGE_STATE.FadeOut; } break; // Fade scene out case SCENE_CHANGE_STATE.FadeOut: float fadeOutOpacity = 1.0f - ((float)(DateTime.Now.Ticks - fadeSceneTime)) / ((float)(fadeOutDuration * TimeSpan.TicksPerSecond)); fadeOutOpacity = Math.Max(0.0f, fadeOutOpacity); cameraFadeInstance.setOpacity(fadeOutOpacity); if (fadeOutOpacity == 0.0f) { currentSceneState = SCENE_CHANGE_STATE.InitiateChange; } break; // Tell program to start changing scene case SCENE_CHANGE_STATE.InitiateChange: headsetLocalizationInstance.ReCenterUser(); headsetLocalizationInstance.RotatePerson(0.0f); SceneManager.UnloadSceneAsync(GenerateSceneName(currentSceneNumber)); currentSceneNumber++; if (currentSceneNumber < totalNumberOfScenes) { SceneManager.LoadSceneAsync(GenerateSceneName(currentSceneNumber), LoadSceneMode.Additive); ChangeSkybox(currentSceneNumber); currentSceneState = SCENE_CHANGE_STATE.Changing; } else { ChangeSkybox(-1); uiPrompt.SetUiPromptMessage("Session has ended."); uiPrompt.TurnOnUiPrompt(); fadeSceneTime = DateTime.Now.Ticks; currentSceneState = SCENE_CHANGE_STATE.FadeIn; } break; // Wait for scene to finish loading case SCENE_CHANGE_STATE.Changing: if (SceneManager.GetSceneByName(GenerateSceneName(currentSceneNumber)).isLoaded) { fadeSceneTime = DateTime.Now.Ticks; currentSceneState = SCENE_CHANGE_STATE.FadeIn; } break; // Fade back in case SCENE_CHANGE_STATE.FadeIn: float fadeInOpacity = ((float)(DateTime.Now.Ticks - fadeSceneTime)) / ((float)(fadeOutDuration * TimeSpan.TicksPerSecond)); fadeInOpacity = Math.Min(1.0f, fadeInOpacity); cameraFadeInstance.setOpacity(fadeInOpacity); if (fadeInOpacity == 1.0f) { eyeTrackerInstance.CreateNewScene(GenerateSceneName(currentSceneNumber)); currentSceneState = SCENE_CHANGE_STATE.NotChanging; if (nextSceneTime <= DateTime.Now.Ticks) { nextSceneTime = DateTime.Now.Ticks + secondsBetweenScene * TimeSpan.TicksPerSecond; } } break; } } // Allow change to next scene if (Input.GetKeyDown(KeyCode.N)) { ChangeToNextScene(); } }