Overview

Spirit, A World Beneath is a 3D third-person game designed for local multiplayer split-screen gameplay, where you and your friend can team up to tackle the challenges together.

Play as Rory and as a mysterious spirit and uncover the secrets of the ancient Scottish underground tunnels.

As you explore the tunnels, you will need to search for the key components to overcome each puzzle room.

Along the way, you can use the Spirit to possess enemies and objects to access different behaviours, also you must use Rory’s whistle to distract and attract enemies.

Cooperation is key to sucess. You will need to work together to navigate the tunnels and overcome obstacles on your journey to the final room.

Get ready for a thrilling adventure that will put your puzzle solving skills and teamwork to the test!

Important: Two Ps4 controllers are required to play! Intended to change.

Gameplay

  • Movement

    Players can move freely in the X and Z axis and Jump to move in the Y axis, the movement is done using a Character Controller component and a custom script since the movement of the game is not heavily relying on physics.
    The movement is camera-relative.

    After necessary calculations the movementis handled by the CharacterControler.Move() method inside the Character Controller object.

    Rory Spirit
    RoryMovement SpiritMovement

    To simulate gravity the vector Y component that is be passed as a parameter for the CharacterController.Move() is updated every frame:

    _ySpeed = Physics.gravity.y * Time.deltaTime;

    If Rory is touching the ground he should stop moving in the Y component, to achieve this a check is made.

    if (_onGround) { _ySpeed = -0.01f; }

    This hack resets the player speed allowing the is grounded condition to work properly.
    To check if the character a Spherecast is made on the bottom of the character controller collider to check if it checking if it collides with the world.

    Interactions with the environment

    Rory can interact with physical objects, contrary to the spirit.
    Interactions have a 1 second cooldown.

    Pulling crates.

    The crate is parented to Rory and has a Rigibody component that is set to kinematic when the player is pulling.

    RoryPullCrate

    Pushing Buttons

    Buttons are directly connected to a barrier. They are used to deactivate them.

    Barries are designed to function in two ways: either the player must continuously press the button to keep it open, or a single click on the button will suffice to keep it open.

    Calling Bats

    Rory is able to whistle to call the mobs in the level, this can be done by clicking R1 in the controller. When Rory whistles an event is fired, and the first thing the bat class does is check the distance between its instance and Rory, if it’s below a certain threshold the bat will enter its Check State.

    RoryWhistle

    This should be used to make a bat come close enough for the spirit to perform a possession.

    Bats

    The bat is controlled by Artificial Intelligence, more specifically a Finite state machine.

    This state machine has 4 states: Wander, Called, Chase, and Return.

    1) Wander

    In the Wander State, bats will fly around in a certain position, meaning they will not fly around all the areas of the map.

    2) Called State

    When Rory whistles all colliders inside a defined sphere are detected, then the colliders are filtered to only keep the ones that belong to a bat.

    With this, all bat objects are added to a list, and the bat that occupies index 1 will go to the position where the whistle was performed.

    3) Chase State

    When Rory or a possessed bat enters a predifined sphere (with the bat at its center), the bat will start chasing Rory (or the Spirit if it’s possessing another bat).
    If the bat collides with Rory the level is restarted. If it collides with the spirit the current possession is exited.

    4) Return State

    The condition to enter this state is met when the bat leaves either the called state or the chase state. When the bats are in the return state, they will quickly go back to the wander state radius, either by just going back and wandering, or going to the center of this radius and wandering.

    Possession

    The spirit is able to possess various things in the cave.

    1) Bats

    Possessing bats allows the spirit to control them, which it turns gives him the ability to fly and press buttons.

    2) Mushrooms

    Possessing a mushroom allows the spirit to grow the mushroom or make it shrink.

    3) Crystals

    Possessing a crystal allows the spirit to emit a powerfull light to iluminate paths.

    Camera

    Camera utilize the Unity Cinemachine package. There are 2 FreeLookCameras, each following one player.

    Each cameras is made out of 3 rigs (bottom, middle, and top) and a spline connecting the rigs.

    Camera

    Camera Collision

    A raycast is done between the camera position and the player position if there is a gameobject between them the camera moves to an alternate point of view while attempting to keep the camera at its original height. This means that on detection the camera will damp to the closest point that is not occluded and is as close as possible to the height of the “original” camera.

    CameraCollision

    Objects Invisible

    When the camera is between objects and the player these objects will become transparent. This is done by changing attributes inside the shaders of the objects.


Controls

  • Rory

    Action Key
    Gamepad 1 Left Analog Movement
    Gamepad 1 Right Analog Move camera
    Gamepad 1 X Jump
    Gamepad 1 Square Interact
    Gamepad 1 R1 Whistle

    Spirit

    Action Key
    Gamepad 2 Left Analog Movement
    Gamepad 2 Right Analog Move camera
    Gamepad 2 X Jump
    Gamepad 2 Square Interact
    Gamepad 2 R1 Possession

Download Builds

Build Download
Windows MISSING FILE
MacOs MISSING FILE

Documentation

Document Download
Game Design Document View
Spec Sheet View