Ejemplo n.º 1
0
    // 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();
        }
    }