Murder On The Fairytale Express

Step into the world of magic and board the Fairytale Express bound for Drury Lane. You are a detective tasked with solving the murder of the Fairy Godmother in the dining cart. Use your VR headset to shapeshift into the different perspectives of the suspects and explore the train to gather clues and solve puzzles. Can you uncover the truth and bring the killer to justice before the train reaches its destination? Play now to find out!

Our team wanted to create a story-driven game that would allow people to experience different points of view, as a Virtual environment allows for a unique possibility of the embodiment of different characters. We have chosen the fairy tale and a detective setting as it allowed us to play around with different ideas, relating to magic and puzzle solving. Thinking about what characters could find themselves in a murder mystery, as well as would have interesting points of view, we choose Fairy Godmother, Big Bad Wolf, Gingerbread Man, and Detective Snow White. The setting of the rail car allowed us to create a controlled environment, in which the player would be able to explore at their own pace and not have to wander too far off, as the game could be played in any living room.

Concept

User Journey

The first level is the Detective office where you are able to get accustomed to the movements and game mechanics. A person can listen to the prologue and when they are ready press the UI on the mirror to continue. 

The second level is the Dining Car, the scene of the crime where the player can explore and interact with the objects in the scene. When the player thinks they have gathered all of the clues, they can exist through the menu on the doors. 

The last level is back at the Detective's office again, where you can use the detective notes and answer multiple choice dialogue UI in order to choose who was the killer. If you get the answer right you progress to the epilogue.

Walkthrough

Character change - along with the models of the characters, the post-processing and the interactions had to change. The code was tied to the main player camera and the XR Origin, whenever the player would raise their hands in the trigger zone that was in front of the mirror the character models and the post-processing would shift. The height required for each character to change to the next one is different and is calculated as a factor of the total. 

Magic Interactions - as inside VR you can interact with objects in a way you are not able in the real world, we thought it would be fun to explain those abilities using magic. For example, you are able to levitate things toward you using the magic wand.

Code and Contribution

    void Update()
    { //Do the transition when the person raises their hands and is infront of the mirror
        if (canChange && TriggerZone.GetComponent<Collider>().bounds.Contains(transform.position) && Hand1.transform.position.y > Height && Hand2.transform.position.y > Height)
        { // Play the change particle effect
            changeParticles.Play();
            // Play the audio clip
            audioSource.Play();
            StartCoroutine(DelayedCharacterChange());
            Debug.LogError("Change");
        }
    }
    IEnumerator DelayedCharacterChange()
    {
        canChange = false;
        yield return new WaitForSeconds(Wait); // add a delay of 0.5 seconds
        activeCharacter.SetActive(false);
        if (activeCharacter == characterPrefab1)
        {
            activeCharacter = characterPrefab2;
            transform.localScale = characterPrefab2Scale;
            Height = 2.2f;
        }
        else if (activeCharacter == characterPrefab2)
        {
            activeCharacter = characterPrefab3;
            transform.localScale = characterPrefab3Scale;
            Height = 1f;
        } else {
            activeCharacter = characterPrefab1;
            transform.localScale = characterPrefab1Scale;
            Height = 0.8f;
        }
        activeCharacter.SetActive(true);
        StartCoroutine(ChangeDelay());
    }

Audio and Text Dialogue Pop-Up- Each piece of evidence that the player interacts with has its own text and dialogue to show what the detective is thinking. The dialogue begins only when the detective has picked up the piece and inspects it. 

private void OnGrabbed(XRBaseInteractor interactor)
    { // Start the pop-up coroutine
        popUpCoroutine = StartCoroutine(PopUp());
    }
    private void OnReleased(XRBaseInteractor interactor)
    { // Stop the pop-up coroutine and reset the scale of the text object
        if (popUpCoroutine != null)
        {
            StopCoroutine(popUpCoroutine);
            transform.localScale = initialScale;
        }
    }
    private IEnumerator PopUp()
    { // Gradually increase the scale of the text object over time
        float elapsedTime = 0f;
        while (elapsedTime < popUpTime)
        {
            float scale = Mathf.Lerp(0.01f, 1f, elapsedTime / popUpTime);
            transform.localScale = new Vector3(scale, scale, scale);
            elapsedTime += Time.deltaTime;
            yield return null;
        } // Set the final scale to 1 to ensure it's accurate
        transform.localScale = Vector3.one;
    }

Aesthetics and Design - The levels contain a specific and continuous design, appropriate to the time period and the world of magic, all of the models and animations were made with a specific art style in mind. It allowed us to create an extensive game with good performance on budget headsets like Oculust Rift, whilst keeping players immersed in the story.

Additional Feature

The feature I thought to add after our final presentation was the visible timer and the clock model. This would tell the player how much time they have before the train reaches the station. If the player runs out of time before they can find all of the clues, the are sent back to the begging to play the game again. If they have found all of the clues, they must go to the exit before the time runs out. The pop-up appears when the player gazes at the clock.

 From the start the most important aspect of the project was the story, how it wove together and who was the killer in the end. We had to bake in those big decisions right at the start as the whole game relied on them, and if they were to be changed later on, a lot of art, game design, and code would have to be redone. We had sessions talking about the possible versions of the endings, how the player would discover who the killer is, and how many points of view we should have. Certainly, we were quite ambitious at the start, as we wanted to have the player interact with the victim even before the murder, and then relive the day as different characters in order to understand what happened. However that would have required more time and resources, and thus we had to scale the project back and be creative in the game design that we could achieve in the given timeframe. Thus we devised the character and POV changes in the same scene, the interaction with the clues after the murder, and the multiple-choice answers after the main scene. 

 Since this is a VR game a lot of time was spent on setting up the embodiment of the player, making the VR headset work, and being responsive. Using the Final IK and the XR Interactive elements, we set up the Oculus Quest 2 for our playtesting. It was very challenging to make sure that all of the features worked together as intended since many of them required different plugins and code, sometimes things broke only after playtesting. Once all of the main game mechanics were made and worked with our versions of VR headsets, we focused on polishing the game and making the levels seem as immersive as possible. Working on the outside environments, sound design, and even simple lighting to make the level feel alive and like part of a natural magical world setting.


Reflection

Previous
Previous

AR Filters

Next
Next

AR Architecture Puzzle